PDO несколько вставок SQLite с вложенным запросом

EDIT: я опубликовал новый вопрос (вместо редактирования), поскольку содержание и код, которые я пробовал, очень длинны и означают полную замену этого вопроса.

Я работаю над INSERTвводом нескольких строк в таблицу SQLite с помощью PDO, но у меня возникли проблемы с выполнением запроса с использованием связанных параметров. У меня есть три таблицы со схемой:

столбцы schoolB_equivalencies:

  • equivalency_id целое число автоинкремент первичного ключа
  • schoolA_id целое число не NULL
  • schoolB_id целое число не NULL
  • is_archived целое число не NULL
  • Внешний ключ (schoolA_id) ссылки schoolA_courses (id)
  • Внешний ключ (schoolB_id) ссылки schoolB_courses (id)

колонки для schoolA_courses:

  • schoolA_courses ID целое число автоинкремент первичного ключа
  • course_prefix текст
  • целое число course_number
  • …другие месторождения

столбцы для schoolB_courses:

  • schoolB_courses ID целое число автоинкремент первичного ключа
  • course_prefix текст
  • целое число course_number
  • …другие месторождения

Я пытаюсь сделать несколько вставок одновременно с 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 на обеих вставках, который кажется индикатором «success», но строки не вставляются. Основываясь на том, что сингл INSERTработаетerror_info(), и это сообщает об успехе, я предполагаю, что что-то не так с тем, как я связываю параметры.

1 ответ

  1. Начать с…Не должно ли это быть

    $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();
    
       ...
    
    }