2

PDO を介した MySQL への挿入クエリで非常に奇妙なエラーが発生しました。

このレコードがまだこのテーブルに存在しない場合は、テーブルにレコードを挿入します。

$query = "INSERT INTO Phrases (KeyText)
            SELECT * FROM (SELECT :key_text) as tmp WHERE NOT EXISTS (SELECT 1 FROM Phrases WHERE KeyText = :key_text)";

    try
    {
        $preparedStatement = $db->prepare($query);
        foreach ($phrases as $phrase)
        {
            $preparedStatement->execute(array(':key_text' => $phrase));
            echo "-";
        }
    }
    catch(PDOException $e)
    {  
        echo $e->getMessage();  
    }

例外をスローします: 非オブジェクトでメンバー関数 execute() を呼び出します。

SQL コマンドのエラーがどこにあるのかわかりません。SQLコマンドを他のものに変更すると(たとえば、SELECT :key_text as kt)、正しく機能するため、他のコードは正しいです。

回答ありがとうございます。

更新: エラーは次のとおりです。

[0] => HY000 [1] => 1096 [2] => テーブルは使用されていません

MySQL の正しい SQL コマンドを作成するにはどうすればよいですか? バリアント

INSERT INTO Phrases (KeyText)
SELECT :key_text WHERE NOT EXISTS (SELECT 1 FROM Phrases WHERE KeyText = :key_text)

MySQLでも機能しません。

更新 2:

INSERT INTO Phrases (KeyText)
SELECT :key_text FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM Phrases WHERE KeyText = :key_text)

DUALテーブルを使用したこのクエリは機能します!

4

5 に答える 5

5

準備呼び出しが失敗しており、単に成功したと想定しています。

試す

    $preparedStatement = $db->prepare($query) or die($db->errorInfo());

エラーをキャッチします。

于 2012-11-14T16:23:02.097 に答える
2

update2 が動作するはずです。

代替:

フィールド KeyText に一意のキーまたは主キーがある

ALTER TABLE `Phrases` ADD UNIQUE INDEX (`KeyText`);

次に、クエリを使用します。

INSERT IGNORE INTO Phrases (KeyText) VALUES (:key_text);

レコーダーに変更がないことについては、自動コミットがオンになっているかどうかを確認してください。commit

于 2012-11-14T17:14:33.550 に答える
1
INSERT INTO Phrases (KeyText)
    SELECT :key_text
WHERE NOT EXISTS (SELECT * FROM Phrases WHERE KeyText = :key_text)

SQL Server - レコードを挿入して一意にする方法

于 2012-11-14T16:33:28.657 に答える
1

失敗したように聞こえるため、無効なオブジェクトprepareを呼び出そうとしています (期待しているような準備済みステートメント オブジェクトではありません)。executeの戻り値がprepare実際にPDOStatementオブジェクトであり、そうではないことを確認してくださいFALSE

于 2012-11-14T16:22:28.377 に答える
0

違う:

insert into table 
  select * from (select 1 a, 2 b ) t 
  where not exists(select 1 from t2 where t2.c =2)

右:

insert into table
  select * from (select 1 a, 2 b union select 1 a, 2 b) t
  where not exists(select 1 from t2 where t2.c =2)
于 2013-03-01T08:24:33.863 に答える