私は私の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を使っても)そうする方法はありますか?
あなたの$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 );
あなたは(ほとんど)クエリ全体を構築してからそれをprepare
に渡そうとしています。それは違うの。
prepare
はsprintf
またはvsprintf
のように動作します。$s
。それはうまくいきません。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));