web-dev-qa-db-ja.com

このエラーが出るのはなぜですか? WordPressデータベースエラー:[クエリが空でした]

最新版のWordpress 3.4.2を使用しています。私が書いているものを除いて、私はプラグインをインストールしていません。

それで、ここで契約は、私はJSONフィードを読んでいると私は私のワードプレスのデータベースで作成したテーブルにそのコンテンツをインポートしようとしています。私が書いた別のプラグインで同様のコードを使用しましたが、そこで問題なく動作します。なぜそれがここでは動作しないのか理解できません。

私が書いているこの別のプラグインを実行すると私は恐ろしいとああとても明確になる "WordPressデータベースエラー:[クエリは空でした]"。

これが私のコードです...

// 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));
}

期待どおりすべての値を出力します。すべてを括弧で囲み、コンマで区切ります。

それから私はこれをします...

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

そして、この関数を実行すると、 "WordPressデータベースエラー:[クエリは空でした]"と表示され、私のテーブルには何もインポートされません。

私はここで見たもう一人の人は$ wpdb-> prepareで問題を抱えていました。私はそれを間違って使っていますか?

1
Robbiegod

成功!私はwpdb-> FINALYで動作するように準備しました、そして私はここで私のコードスニペットを共有したいと思います - うまくいけば他の誰かがこれが役に立つと思うでしょう。

私の状況

私が書いているプラ​​グインからカスタムテーブルにフィードからデータをインポートしようとしていました。いくつかのWebサイト、さらにはこのスレッドに返信した人々でさえも、私のインポートクエリを保護するよう奨励していました。しかし、コーデックスを読んだ後でさえ、私はこれを正しくあるいはまったく動かすことができませんでした。

注目すべき間違い

私が間違っていたことがいくつかありました:

  1. すべての値を配列に入れます。私はまったくこれをする必要はありませんでした。
  2. 私は1つのwpdb-> prepareだけを使って複数の値の行をインポートしようとしていました。解決策は、ローごとに1つのwp-db-> prepareを使用することでした。 wpdb-> prepareコマンドを私のforeach文に移動しました。時には、一度にインポートしたい結果が複数あることがありますが、これでうまくいきます。私は20以上の結果があることは決してないでしょう、それでこれはちょうどうまくいくはずです。

解決策

これはおそらくこれを行う唯一の方法ではありませんが、これは私がそれを機能させることができた方法です。これが最終的な作業コードの断片です。私はこれを私のforeachステートメントに入れました。それが役に立てば幸い。

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

 }

私の最初の投稿に答えてくれた人たちに感謝します。

0
Robbiegod

私はここで他の一人の男が$wpdb->prepareで問題を抱えていたのを見ました。私はそれを間違って使っていますか?

あなたが Codex を読むことができるので、それは単純な No です。

sprintf/printf()のように使う必要があります。唯一の許可された入力

  • ストリング:%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 )
);

免責事項:↑のクエリは、必ずしも$wpdb->prepare() right.を使用したからといって、必ずしも結果が得られるとは限りません。

2
kaiser

更新ステートメントに最後の数値引数を追加し忘れたときにも同じエラーが発生しました。引数が置換トークンと一致することを確認してください。

次のようなSQL文字列があるとします。

$sql = "update mytable set column1 = %s where id  = %d;"
$wpdb->query($wpdb->prepare($sql, 'foobar'));

解決策は明らかにIDを追加することです

$id = 5;
$wpdb->query($wpdb->prepare($sql, 'foobar', $id));
2
andkrup