web-dev-qa-db-fra.com

wpdb prepare: passage d'un nombre variable de champs comme second argument

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)?

2
Mariano

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 );
1
birgire

Vous essayez (presque) de construire la requête entière, puis de la transmettre via prepare. Ce n'est pas correct.

  1. prepare fonctionne plus comme sprintf. ou vsprintf
  2. Ne citez pas vos formats de remplacement - ces $s. Ça ne marchera pas.
  3. Le deuxième argument de 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));
1
s_ha_dum