Вставка MYSQL, где не существует PDO

Я условно вставляю значения в базу данных MySQL с помощью команды PHP PDO. Условие утверждает, что если строка, которую нужно вставить, уже существует, не вставляйте ее. Если он не существует, вставьте строку. Код выполняется просто отлично, когда я выполняю через PHPmyadmin, и, таким образом, заменяю переменные PDO ( :a ,: :b ) статическими числами.

Я получаю следующую ошибку:

 Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42S21]: Column already exists: 1060 Duplicate column name '0'' in... 

Код PHP выглядит следующим образом:

Я готовлю заявление sql …

 $InsertFoo = $pdo->prepare(" INSERT INTO `MyTbl` ( `ColA`, `ColB` ) SELECT * FROM ( SELECT :a, :b ) AS tmp WHERE NOT EXISTS ( SELECT `MyTbl`.`ColA` FROM `MyTbl` WHERE `ColA` = :aa AND `ColB` = :bb ) LIMIT 1 "); 

Затем перебираем массив, чтобы выполнять подготовленный оператор снова и снова. (Массив был сгенерирован ранее с помощью SimpleXML, поэтому -> . Если вы не знакомы с SimpleXML, просто рассмотрите $foo->fooA как переменную, которая изменяется для каждого цикла.)

 foreach ($loopme as $foo) { // query to be executed for ticket insertion $TicketsToInsert->execute(array( a => $foo->fooA, b => $foo->fooB, aa => $foo->fooA, bb => $foo->fooB )); } 

Любые советы очень ценятся:

В качестве побочного примечания есть много подобных вопросов, но я не нашел ни одного, который бы точно рассматривал эту проблему PDO для вставки.

  1. PDO может выполнять только одно заявление за раз
  2. Такая же ошибка, похоже, является другим источником
  3. Переменные PDO внутри select, за которым следует оператор Where

Большое спасибо!


Ответил

Фил предложил гораздо более простое решение применения уникального ограничения по нескольким строкам, которое, в свою очередь, отклоняло бы вновь вставленную строку, которая была уникальной по всем указанным строкам. Это, в отличие от тестирования на отсутствие существования строки, которая должна быть вставлена. Подробнее см. Ниже.

Related of "Вставка MYSQL, где не существует PDO"

Ваш запрос выглядит полностью перепутанным, особенно в суб-запросе EXISTS . Вы выбираете MyTbl.ColA из tickets ???

Мой совет – просто добавить уникальное ограничение на MyTbl (ColA, ColB) .

 ALTER TABLE MyTbl ADD UNIQUE (ColA, ColB); 

Затем ваш INSERT завершится с уникальным нарушением ограничения, которое может быть обнаружено в PDOException .

 $stmt = $pdo->prepare('INSERT INTO MyTbl (ColA, ColB) VALUES (?, ?)'); foreach ($loopme as $foo) { try { $stmt->execute([$foo->fooA, $foo->fooB]); } catch (PDOException $e) { $errorCode = $stmt->errorInfo()[1]; if ($errorCode == 1586) { // I think 1586 is the unique constraint violation error. // Trial and error will confirm :) } else { throw $e; } } } 

Чтобы устранить сообщение об ошибке, которое вы видите … это потому, что вы не различаете таблицу INSERT таблицу подзапроса.