Comme je veux gérer les champs NULL dans mes fonctions db et wordpress ne me le permet pas, j’aurai besoin de générer dynamiquement une requête en fonction de la situation. Le problème est que je ne sais pas comment passer un nombre variable de champs comme second argument! c'est ce que j'ai été tr mais il renvoie une erreur "requête vide":
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));
y a-t-il un moyen de le faire (même en utilisant $ wpdb-> insert)?
Vous devez utiliser un tableau pour votre $vars
, alors remplacez
$vars = $a . ', ' .$b . ', ' . c;
avec
$vars = array( $a, $b, $c );
Mais je vous recommanderais plutôt d’utiliser la méthode $wpdb->insert( $table, $data, $format )
. Ensuite, votre exemple de code pourrait ressembler à ceci:
$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 );
Vous essayez (presque) de construire la requête entière, puis de la transmettre via prepare
. Ce n'est pas correct.
prepare
fonctionne plus comme sprintf
. ou vsprintf
$s
. Ça ne marchera pas.prepare
peut être un tableau, et c’est ce que j’utiliserais ici.Essaye ça:
$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));