EDIT: я опубликовал новый вопрос (а не редактирование), поскольку контент и код, которые я пробовал, очень длинны и означают, что это полностью заменит этот вопрос.
Я работаю над INSERT
несколько строк в таблицу SQLite с использованием PDO, но у меня возникли проблемы с выполнением моего запроса с использованием связанных параметров. У меня есть три таблицы со схемой:
столбцы schoolB_equivalencies:
столбцы для schoolA_courses:
столбцы для schoolB_courses:
Я пытаюсь сделать сразу несколько вставок с помощью prepare()
, массива значений и подзапроса. Запуск INSERT
однажды работает (одна строка вставлена):
$dir = 'sqlite:/path/to/courses.sqlite3'; $dbh = new PDO($dir) or die("error"); $stmt = $dbh->prepare('INSERT INTO schoolB_equivalencies (schoolA_id, schoolB_id, is_archived) VALUES ( (SELECT id from schoolA_courses WHERE course_number="103" AND course_prefix="RPED"), (SELECT id from schoolB_courses WHERE course_number="251" AND course_prefix="ARCH"),0)'); $stmt->execute();
Однако, когда я включаю один и тот же оператор с использованием связанных параметров и массива значений, строки не вставлены:
$dir = 'sqlite:/path/to/courses.sqlite3'; $dbh = new PDO($dir) or die("error"); $selections = array( 0 => array( 0 => "RPED", // THE schoolA COURSE PREFIX 1 => "103", //THE schoolA COURSE NUMBER 2 => "ARCH", //THE schoolB COURSE PREFIX 3 => "251" //THE schoolB COURSE NUMBER ), 1 => array( 0 => "RPED", // THE schoolA COURSE PREFIX 1 => "126", //THE schoolA COURSE NUMBER 2 => "ARCH", //THE schoolB COURSE PREFIX 3 => "261" //THE schoolB COURSE NUMBER ) ); $stmt = $dbh->prepare('INSERT INTO schoolB_equivalencies (schoolA_id, schoolB_id, is_archived) VALUES ( (SELECT id from schoolA_courses WHERE course_number=:schoolA_code AND course_prefix=:schoolA_prefix), (SELECT id from schoolB_courses WHERE course_number=:schoolB_code AND course_prefix=:schoolB_prefix),0)'); foreach ( $selections as $selection ): $stmt->bindParam(':schoolA_number', $selection[1]); $stmt->bindParam(':schoolA_prefix', $selection[0]); $stmt->bindParam(':schoolB_number', $selection[3]); $stmt->bindParam(':schoolB_prefix', $selection[2]); $stmt->execute(); print_r($dbh->errorInfo()); endforeach;
Результат error_info()
показывает код 0000 на обеих вставках, который выглядит как индикатор успеха, но строки не вставлены. Основываясь на том, что работает один INSERT
и что error_info()
сообщает об успехе, я предполагаю, что что-то не так с тем, как я привязываю параметры.
Для начала … Разве это не должно быть
$stmt->bindParam(':schoolA_number', $selection[0][1]); $stmt->bindParam(':schoolA_prefix', $selection[0][0]); $stmt->bindParam(':schoolB_number', $selection[0][3]); $stmt->bindParam(':schoolB_prefix', $selection[0][2]);
ИЛИ
$stmt->bindParam(':schoolA_number', $selection[1][1]); $stmt->bindParam(':schoolA_prefix', $selection[1][0]); $stmt->bindParam(':schoolB_number', $selection[1][3]); $stmt->bindParam(':schoolB_prefix', $selection[1][2]);
ИЛИ
foreach ( $selections as $selection ) { $stmt = $dbh->prepare('INSERT INTO schoolB_equivalencies (schoolA_id, schoolB_id, is_archived) VALUES ( (SELECT id from schoolA_courses WHERE course_number=:schoolA_code AND course_prefix=:schoolA_prefix), (SELECT id from schoolB_courses WHERE course_number=:schoolB_code AND course_prefix=:schoolB_prefix),0)'); $stmt->bindParam(':schoolA_number', $selection[1]); $stmt->bindParam(':schoolA_prefix', $selection[0]); $stmt->bindParam(':schoolB_number', $selection[3]); $stmt->bindParam(':schoolB_prefix', $selection[2]); $stmt->execute(); print_r($dbh->errorInfo()); }
И НЕ
foreach ( $selections as $selection ) { $stmt->bindParam(':schoolA_number', $selection[1]); $stmt->bindParam(':schoolA_prefix', $selection[0]); $stmt->bindParam(':schoolB_number', $selection[3]); $stmt->bindParam(':schoolB_prefix', $selection[2]); $stmt->execute(); ... }