EDIT: Я опубликовал a new question (а не редактирование), поскольку контент и код, которые я пробовал, очень длинные и означают, что вы полностью замените этот вопрос.PDO Несколько вложений SQLite с подзапросом
Я работаю над INSERT
Ввод нескольких строк в таблицу SQLite с использованием PDO, но у меня возникли проблемы с выполнением моего запроса с использованием связанных параметров. У меня есть три таблицы со схемой:
колонны schoolB_equivalencies:
- equivalency_id INTEGER PRIMARY KEY AUTOINCREMENT
- schoolA_id INTEGER NOT NULL
- schoolB_id INTEGER NOT NULL
- is_archived INTEGER NOT NULL
- ИНОСТРАННЫЙ КЛЮЧ (schoolA_id) ССЫЛКИ schoolA_courses (id)
- FOREIGN KE Y (schoolB_id) Лит schoolB_courses (идентификатор)
колонны для schoolA_courses:
- schoolA_courses ID INTEGER PRIMARY KEY Autoincrement
- course_prefix TEXT
- course_number INTEGER
- ... другие поля
колонки для школыB_courses :
- schoolB_courses ID INTEGER PRIMARY KEY AUTOINCREMENT
- course_prefix TEXT
- course_number INTEGER
- ... другие поля
Я пытаюсь сделать несколько вставок одновременно с 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-> execute();' вне цикла, но th e оператор все еще не «ВСТАВЛЯЕТ» любые строки. – Marcatectura
переместить запрос в цикле foreach –