$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
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);";