3

这是我到目前为止所得到的:

/**
 * @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 行受影响”。有没有办法让每个语句受影响的行数?最好与相关查询以及任何错误消息和警告一起使用。

4

3 回答 3

3

我遇到了同样的问题,例如我正在从一个文件中读取一系列 mysql drop table 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();
}

如果第一个删除 sql 成功,那么即使第二个失败(该表名不再存在)也不会引发异常。PDO_MYSQLND;似乎只有当第一个失败然后引发 PDO 异常时,您才能检查所有 sql 是否已执行。

于 2012-10-11T13:02:03.720 回答
0

尝试在执行后设置 count 变量:

$db->e​​xec($sql);

$affected = $db->rowCount();

于 2012-09-05T21:05:04.550 回答
-1

假设您没有任何会炸毁爆炸语句的疯狂 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());
    }
}
于 2012-09-05T21:31:42.317 回答