J'utilise Wordpress 3.4.2, dernière version! Je n'ai pas installé de plugins sauf celui que j'écris.
Alors, voici l'affaire, je lis un fil JSON et j'essaie d'importer son contenu dans un tableau que j'ai créé dans ma base de données wordpress. J'ai utilisé un ensemble de code similaire dans un autre plugin que j'ai écrit et cela fonctionne très bien là-bas. Je ne comprends pas pourquoi cela ne fonctionne pas ici.
Quand je lance ce plugin différent que je vous écris, je reçois le redouté et si clair "erreur de base de données WordPress: [La requête était vide]".
Voici mon code ...
// Setup the array
$values = array();
foreach ($bugs as $bug) {
$status_text = $bug['text'];
$tContent = htmlSpecialChars(html_entity_decode($status_text));
$imported = 2;
[ shortened to keep this post short, but other values are listed here. ]
// for the values insert part
$values[] = '("'.$tContent. '", "'.$imported.'")';
}
if(is_array($values)) {
echo "<hr><strong>WHAT TO IMPORT?</strong><br/>";
var_dump(implode(',', $values));
}
Cette sortie toutes les valeurs comme prévu. Tout est mis entre parenthèses et séparé par une virgule.
Alors je fais ça ...
global $wpdb;
$table_name = $wpdb->prefix . "bugtbl_temp";
$sql = $wpdb->prepare (
"INSERT INTO $table_name
(`post_content`, `imported`)
VALUES ". implode(',', $values) . " ON DUPLICATE KEY UPDATE imported = 1"
);
$wpdb->query($sql); // execute query
$wpdb->print_error(); // any errors?
$wpdb->last_query; // show the qry
$wpdb->flush(); // cleanup
Et puis quand je lance cette fonction, je reçois le message "Erreur de la base de données WordPress: [La requête était vide]" et rien n’est importé dans mon tableau.
J'ai vu un autre gars qui avait des problèmes avec $ wpdb-> prepare. Est-ce que je ne l'utilise pas correctement?
Succès! J'ai le wpdb-> prépare à travailler ENFIN et j'aimerais partager mon extrait de code ici - J'espère que quelqu'un le trouvera utile.
Ma situation
J'essayais d'importer des données d'un flux dans une table personnalisée à partir d'un plug-in que j'écris. Plusieurs sites Web et même les gars qui ont répondu à ce fil m'ont incité à protéger mes requêtes d'importation. Cependant, même après avoir lu le codex, je n’ai pas réussi à le faire fonctionner correctement ou pas du tout.
Erreurs notables
Quelques choses que je faisais mal étaient:
Une solution
Ce n’est probablement pas le seul moyen de le faire, mais c’est ainsi que j’ai réussi à le faire fonctionner. Voici l'extrait de code de travail final. Je mets cela dans ma déclaration foreach. J'espère que ça aide.
foreach ($rows as $row) {
// I've omitted the part in my where i take all of the values from the query and define variables, but that part would happen here.
// Prepare query
$sql = $wpdb->prepare("
INSERT INTO $tablename (`ijAuthorID`, `ijDate`, `ijDescription`, `ijTitle`, `ijSlug`, `ijPostType`, `ijImported`, `ijUKID`)
VALUES (%d, %s, %s, %s, %s, %s, %s, %s) ON DUPLICATE KEY UPDATE ijImported = 1",
$tAuthor, $tPubDate, $tContent, $tTitle, $tPostName, $tPostType, $tImported, $tID
);
// Execute query
$wpdb->query($sql);
}
Merci à ces gars qui ont répondu à mon post original.
J'ai vu sur place un autre gars qui avait des problèmes avec
$wpdb->prepare
. Est-ce que je ne l'utilise pas correctement?
Comme vous pouvez lire dans le Codex , il s’agit d’un simple non .
Vous devez l'utiliser comme sprintf/printf()
. Les seules entrées autorisées sont
%s
%d
$sql = $wpdb->prepare(
"
INSERT INTO %s
(`post_content`, `imported`)
VALUES %s
ON DUPLICATE KEY UPDATE imported = 1
"
,"{$wpdb->prefix}bugtbl_temp"
,implode( ',', $values )
);
Avertissement: La requête ↑ affichée ne signifie pas nécessairement qu'elle vous donnera des résultats, simplement parce que vous avez ensuite utilisé la fonction $wpdb->prepare()
right.
J'ai eu la même erreur quand j'ai oublié d'ajouter le dernier argument numérique dans une instruction de mise à jour; Vérifiez que vos arguments correspondent aux jetons de remplacement.
Disons que vous avez une chaîne SQL comme ceci:
$sql = "update mytable set column1 = %s where id = %d;"
$wpdb->query($wpdb->prepare($sql, 'foobar'));
La solution est évidemment d'ajouter l'id
$id = 5;
$wpdb->query($wpdb->prepare($sql, 'foobar', $id));