web-dev-qa-db-fra.com

wpdb prépare la syntaxe

$arr = [];
array_Push( $arr, 'wp_table', 1, '2013-12-24', 3, 'NULL');
$sql_prepare = "INSERT INTO %s (id, datea, one, two) VALUES (%d, %s, %d, %s) ON DUPLICATE KEY UPDATE one = VALUES(one), two = VALUES(two);";

$wpdb->query( 
      $wpdb->prepare( $sql_prepare,
                      $arr )
);

Le code ci-dessus semble entraîner un problème avec la datea valeur 2013-12-24.

[You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''wp_table' (id, datea, one, two) VALUES (1, '201' at line 1]

"INSERT INTO 'wp_table' (id, datea, one, two) VALUES (1, '2013-12-24', 3, 'NULL') ON DUPLICATE KEY UPDATE one = VALUES(one), two = VALUES(two);"

Sans $wpdb->prepare (...), la requête fonctionne parfaitement.

$wpdb->query( "INSERT INTO $table_name (id, datea, one, two) VALUES (1, '2013-12-24', 3, NULL) ON DUPLICATE KEY UPDATE one = VALUES(one), two = VALUES(two);");

Des conseils sur la façon de gérer la valeur de la date? Qu'est-ce que je fais mal? Merci pour plus d'explications.

/ edit Je vois que je suis peut-être trop habitué à préparer mais au moins datea, one, two sont des entrées soumises par l'utilisateur

1
chabi

Il suffit de regarder la chaîne générée:

INSERT INTO 'wp_table' (id, datea, one, two) VALUES (1, '2013-12-24', 3, 'NULL') ON DUPLICATE KEY UPDATE one = VALUES(one), two = VALUES(two);

Le problème est les guillemets autour du nom de la table. (Votre requête écrite à la main ne contient pas de guillemets autour du nom de la table et fonctionne.) prepare est destiné au contenu dynamique fourni par l'utilisateur , et il est destiné à pour une utilisation avec des chaînes et des nombres. Le nom de la table n’est ni - ni de la même manière que votre contenu. Il va fournir des devis, ce qui va casser votre requête.

Vous devriez pouvoir écrire simplement le nom de la table dans la requête.

$arr = array();
array_Push( $arr, 1, '2013-12-24', 3, 'NULL');
$sql_prepare = "INSERT INTO {$wpdb->prefix}table (id, datea, one, two) VALUES (%d, %s, %d, %s) ON DUPLICATE KEY UPDATE one = VALUES(one), two = VALUES(two);";
0
s_ha_dum