Я условно вставляю значения в базу данных 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 для вставки.
Where
Большое спасибо!
Ответил
Фил предложил гораздо более простое решение применения уникального ограничения по нескольким строкам, которое, в свою очередь, отклоняло бы вновь вставленную строку, которая была уникальной по всем указанным строкам. Это, в отличие от тестирования на отсутствие существования строки, которая должна быть вставлена. Подробнее см. Ниже.
Ваш запрос выглядит полностью перепутанным, особенно в суб-запросе 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
таблицу подзапроса.