web-dev-qa-db-ja.com

wpdb prepare:可変数のフィールドを2番目の引数として渡す

私は私のdbとwordpressの関数でNULLフィールドを管理したいのでそれを行うことはできませんので、私は状況に応じて動的にクエリを生成する必要があります。問題は、可変数のフィールドを2番目の引数として渡す方法がわからないことです。これは私がtrをしてきたものですが、それは "空のクエリ"エラーを返します:

if ($a == '') {
    $fields = 'b, c';
    $placeholders = "'%s', '%s'";
    $vars = $b . ', ' . c;
} else {
    $fields = 'a, b, c';
    $placeholders = "'%s', '%s', '%s'";
    $vars = $a . ', ' .$b . ', ' . c;
}
global $wpdb;
$wpdb->show_errors();
$query = 'INSERT INTO table (' . $fields . ') VALUES (' . $placeholders . ')';
$wpdb->query($wpdb->prepare($query, $vars));

($ wpdb-> insertを使っても)そうする方法はありますか?

2
Mariano

あなたの$varsには配列を使わなければなりません。

$vars = $a . ', ' .$b . ', ' . c;

$vars = array( $a, $b, $c );

しかし、$wpdb->insert( $table, $data, $format )メソッドを使用することをお勧めします。それであなたのコード例はこのようになるでしょう:

$data   = array( 'a' => $a, 'b' => $b, 'c' => $c );
$format = array( '%s', '%s', '%s' );

if( empty( $a ) )
{
    $data   = array_slice( $data,   1, 2 );
    $format = array_slice( $format, 1, 2 ); 
} 

$wpdb->insert( $table, $data, $format );
1
birgire

あなたは(ほとんど)クエリ全体を構築してからそれをprepareに渡そうとしています。それは違うの。

  1. preparesprintfまたはvsprintfのように動作します。
  2. あなたの置換フォーマットを引用しないでください - これらの$s。それはうまくいきません。
  3. prepareへの2番目の引数は配列にすることができます、そしてそれは私がここで使うものです。

これを試して:

$a = $b = $c = "abc";
if ($a == '') {
    $fields = 'b, c';
    $placeholders = "'%s', '%s'";
    $vars = $b . ', ' . c;
} else {
    $fields = 'a, b, c';
    $placeholders = "%s, %s, %s";
    $vars = array($a,$b,$c);
}
$query = 'INSERT INTO table (' . $fields . ') VALUES (' . $placeholders . ')';
var_dump($query);
var_dump($wpdb->prepare($query, $vars));
1
s_ha_dum