【问题标题】:PDO Multiple SQLite Inserts with Subquery带有子查询的 PDO 多个 SQLite 插入
【发布时间】:2017-05-29 08:32:43
【问题描述】:

编辑:我已经发布了a new question(而不是编辑),因为我尝试过的内容和代码非常冗长,意味着完全替换了这个问题。

我正在使用 PDO 处理INSERT将多行写入 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) REFERENCES schoolB_courses (id)

schoolA_courses 的列:

  • schoolA_courses id INTEGER PRIMARY KEY AUTOINCREMENT
  • 课程前缀文本
  • course_number 整数
  • ...其他字段

schoolB_courses 的列:

  • schoolB_courses id INTEGER PRIMARY KEY AUTOINCREMENT
  • 课程前缀文本
  • 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,这似乎是一个“成功”指示器,但没有插入任何行。基于单个INSERT 有效并且error_info() 报告成功的事实,我猜我绑定参数的方式有问题。

【问题讨论】:

标签: php sql pdo sqlite prepared-statement


【解决方案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();

   ...

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-21
    • 2014-11-02
    • 2010-11-13
    • 2019-10-04
    • 2015-02-10
    • 2011-05-26
    • 2010-11-13
    相关资源
    最近更新 更多