我可以使用PDO运行多个SQL查询并检索每条语句受影响的行数吗


Can I use PDO to run multiple SQL queries and retrieve the number of rows affected for each statement?

到目前为止我得到的是:

/**
 * @param PDO $db
 * @param string $file
 */
function run_sql_file($db, $file) {
    $sql = file_get_contents($file);
    try {
        $affected = $db->exec($sql);
        println("$affected row(s) affected");
    } catch(PDOException $e) {
        exitmsg($e->getMessage());
    }
}

它似乎确实运行了所有的查询,但它总是返回"0行受影响"。有没有一种方法可以获得每条语句所影响的行数?最好连同相关联的查询以及任何错误消息和警告。

我遇到了同样的问题,例如,我正在从一个文件中读取一系列mysql删除表sql,我想将它们执行到一个PDO->exec()中:

    $dbh = new PDO('mysql:host=test;dbname=db1', 'user', 'pass');
  try {
    $dbh->exec('drop table test_table1;drop table test_table2;');
  }
catch(PDOException $e)
{
    echo $e->getMessage();
    die();
}

如果第一个drop-sql成功,那么即使第二个失败,也不会出现Exception(该表名已不存在)。似乎没有办法检查是否所有sql都用PDO_MYSQLND;执行了,只有当第一个失败时,才会出现PDO异常。

尝试在执行后设置计数变量:

$db->exec($sql);

$infected=$db->rowCount();

假设您没有任何会破坏爆炸语句的疯狂SQL。。。

/**
 * @param PDO $db
 * @param string $file
 */
function run_sql_file($db, $file) {
    $sql = file_get_contents($file);
    $sql_lines = explode(';',$sql);
    try {
        foreach($sql_lines as $line) {
            $affected += $db->exec($line);
        }
        println("$affected row(s) affected");
    } catch(PDOException $e) {
        exitmsg($e->getMessage());
    }
}