web-dev-qa-db-fra.com

Pourquoi est-ce que je reçois cette erreur? Erreur de base de données WordPress: [La requête était vide]

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?

1
Robbiegod

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:

  1. Tirer toutes les valeurs dans un tableau. Je n'avais pas besoin de faire ça du tout.
  2. J'essayais d'importer plus d'une ligne de valeurs en utilisant un seul wpdb-> prepare. La solution consistait à utiliser un wp-db-> prepar par ligne. J'ai déplacé la commande wpdb-> prepare dans ma déclaration foreach. Le problème, c’est parfois que j’obtiens plus d’un résultat que je veux importer en même temps et c’est tout. Je n'aurai jamais plus de 20 résultats, cela devrait donc fonctionner correctement.

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.

0
Robbiegod

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

  • chaîne: %s
  • chiffre: %d

Exemple

$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.

2
kaiser

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));
2
andkrup