繁体   English   中英

带有子查询的PDO多个SQLite插入

[英]PDO Multiple SQLite Inserts with Subquery

编辑:我发布了一个新的问题 (而不是进行编辑),因为我尝试的内容和代码很冗长,这意味着完全替换此问题。

我工作的INSERT荷兰国际集团多行到使用PDO的SQLite表,但我在使用绑定参数执行我查询的麻烦。 我有三个带有模式的表:

列schoolB_equivalencies:

  • equivalency_id整数主键自动增加
  • schoolA_id INTEGER NOT NULL
  • schoolB_id INTEGER NOT NULL
  • is_archived INTEGER NOT NULL
  • 外键(schoolA_id)参考schoolA_courses(id)
  • 外键(schoolB_id)参考schoolB_courses(id)

schoolA_courses的列:

  • schoolA_courses id整数主键自动增加
  • course_prefix TEXT
  • course_number INTEGER
  • ...其他领域

schoolB_courses的列:

  • schoolB_courses id整数主键自动增加
  • 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->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();

   ...

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM