sql >> データベース >  >> RDS >> Mysql

mysqli--テーブルが使用されていないというエラーで失敗するprepareステートメント

    どうやら、

    SELECT * FROM (SELECT ? )
    

    ...有効なMySQL構文として認識されません。テーブル名がありません。

    編集 、コメントについて:

    まず、に置き換えて、コンソールでこのステートメントを実行することに注意してください。 定数を使用すると状況がエミュレートされないため、比較のために結果が無効であると見なします。

    しかし、繰り返しになりますが、なしで実行します。 に置き換えます 当然、エラーが発生します。

    これは、選択だけを実行することは、状況とは無関係だからです。 PHPコードでは、実行ではありません。 それは失敗しますが、むしろ準備 。したがって、コンソールを使用してこれをエミュレートする適切な方法は、<です。 code> PREPARE ステートメント。

    だから

    PREPARE myStmt 
      FROM 'SELECT * FROM (SELECT ? ) AS tmp WHERE NOT EXISTS (
        SELECT Identifier FROM eeg WHERE Identifier = ?
        ) LIMIT 1'
    

    問題をより正確に再現します。

    さて、 PREPARE のようです FROMに表示されるパラメータ化されたネストされたクエリを理解するのが困難です 条項 。これらの例を見てください:

    PREPARE myStmt FROM "select * from (select ? from eeg) tmp"; 
    

    (機能しません)

    PREPARE myStmt FROM "select *,? from (select * from eeg) tmp"; 
    

    (作品)

    PREPARE myStmt FROM "select *,? from (select 'asdf') tmp"; 
    

    (作品)

    PREPARE myStmt FROM "select * from eeg where Identifier in (select ?)"; 
    

    (作品)

    奇妙な振る舞いですが、ネストされた SELECTの場合にのみ推測できます FROMで 句にパラメータがあり、MySQLにはステートメントを準備するための手がかりがありません

    私の提案として、あなたが何をしようとしているのかを理解していれば、ネストされた選択にパラメーターは必要ありません。 FROM のために、それを外部に移動し、ネストされたselectに定数をハードコーディングすることができます。 。次のコード

    if ($usertest = $datasqli->prepare("INSERT INTO eeg (Identifier) 
        SELECT ? from (select 1) tmp WHERE ? NOT IN
          (SELECT Identifier FROM eeg WHERE Identifier = ?)")) {
    

    ...トリックを行う必要があります。




    1. 複数の列が選択されている場合、script(while-loop)は停止し、出力がありません

    2. MySQLパフォーマンスベンチマーク:MySQL5.7とMySQL8.0

    3. COUNT(*)は常に結果を返しますか?

    4. SELECTFROMWHEREプリペアドステートメントの学習