2017-01-13 3 views
0

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() сообщает об успехе, я предполагаю, что что-то не так с тем, как я привязываю параметры.

+0

вы выполняете два раза запроса внутри цикла –

+0

я переехал '$ stmt-> execute();' вне цикла, но th e оператор все еще не «ВСТАВЛЯЕТ» любые строки. – Marcatectura

+0

переместить запрос в цикле foreach –

ответ

0

Для начала ...Не должна ли она быть

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

    ... 

} 
Смежные вопросы