3

我正在构建一种将 .SQL 文件从 PHP 导入 MySQL 数据库的方法。这用于执行批量查询。我遇到的问题是错误报告。

$command = "mysql -u $dbuser --password='$dbpassword' --host='$sqlhost' $dbname < $file";
exec($command, $output);

这基本上就是我将 .sql 文件导入数据库的方式。问题是我无法知道执行此命令的 PHP 脚本中是否发生任何错误。成功的导入与失败完全没有区别。

我努力了:

  • 使用 PHP 的 sql 错误报告功能。
  • 将详细参数添加到命令并检查输出。它只是返回 .sql 文件的内容,仅此而已。
  • 将错误设置为 .sql 文件中的用户变量并从 PHP 脚本中查询它。

我希望我不会被迫将错误写入临时表。有没有更好的办法?

更新:如果可能的话,如果我能确定发生了什么错误,而不仅仅是如果发生了错误,那将是非常可取的。

4

4 回答 4

2
$command = "mysql -u $dbuser --password='$dbpassword' --host='$sqlhost' $dbname"
  . " < $file 2>&1";
exec($command, $output);

您要查找的错误消息可能会打印到 stderr 而不是 stdout。 2>&1导致 stderr 包含在 stdout 中,因此也包含在 $output 中。

更好的是,使用proc_open而不是 exec,这使您可以更好地控制进程,包括单独的 stdout 和 stderr 管道。

于 2012-09-20T22:32:37.737 回答
1

尝试使用 shell_exec

$output = shell_exec( "mysql -u $dbuser --password='$dbpassword' --host='$sqlhost' $dbname < $file" );
// parse $output here for errors

从手册:

shell_exec — 通过 shell 执行命令并将完整的输出作为字符串返回

笔记:

当 PHP 在安全模式下运行时,此功能被禁用。

编辑:完整解决方案:

您需要做的是抓住 STDERR 并丢弃 STDOUT。通过在命令末尾添加 '2>&1 1> /dev/null' 来执行此操作。

$output = shell_exec( "mysql -u $dbuser --password='$dbpassword' --host='$sqlhost' $dbname < $file 2>&1 1> /dev/null" );
$lines = explode( PHP_EOL, $output );

$errors = array();

foreach( $lines as $line )
{
    if ( strtolower( substr( $line, 0, 5 ) ) == 'error' )
    {
        $errors[] = $line;
    }
}

if ( count( $errors ) )
{
    echo PHP_EOL . 'Errors occurred during import.';
    echo implode( PHP_EOL, $errors );
}
else
{
    echo 'No Errors' . PHP_EOL;
}
于 2012-09-20T22:31:00.963 回答
1

发出 exec 时,shell 将在成功时返回 0,或指示失败的数字。

$result = exec($command, $output);

应该做的伎俩。检查结果并妥善处理。

于 2012-09-20T22:07:36.300 回答
-1

除了查看 PHP 手册之外,您已经完成了所有工作!exec 有一个额外的参数来返回结果

http://php.net/manual/en/function.exec.php

“如果 return_var 参数与输出参数一起存在,则执行命令的返回状态将写入此变量。”

exec($command,$output,$result);
if ($result === 0) {
 // success
} else {
 // failure
}
于 2012-09-20T22:12:42.057 回答