3

PHPからMySQLデータベースに.SQLファイルをインポートする方法を構築しています。これは、クエリのバッチを実行するために使用されます。私が抱えている問題はエラー報告です。

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

これは基本的に、.sqlファイルをデータベースにインポートする方法です。問題は、このコマンドを実行しているPHPスクリプト内でエラーが発生したかどうかを知る方法がないことです。インポートの成功は、失敗とまったく区別できません。

私が試してみました:

  • PHPのSQLエラーレポート関数を使用します。
  • コマンドにverbose引数を追加し、出力を調べます。.sqlファイルの内容を返すだけで、それだけです。
  • .sqlファイル内のユーザー変数にエラーを設定し、PHPスクリプトからクエリします。

エラーを一時テーブルに書き込むことを強制されないことを願っています。もっと良い方法はありますか?

更新:可能であれば、エラーが発生した場合だけでなく、発生したエラーを特定できれば非常に望ましいでしょう。

4

4 に答える 4

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

探しているエラーメッセージは、おそらくstdoutではなくstderrに出力されます。 2>&1stderrがstdoutに含まれ、その結果、$outputにも含まれるようになります。

さらに良いことproc_openに、execの代わりに使用すると、個別のstdoutパイプとstderrパイプを含め、プロセスをはるかに細かく制御できます。

于 2012-09-20T22:32:37.737 に答える
1

execを発行すると、シェルは成功時に0を返すか、失敗を示す数値を返します。

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

トリックを行う必要があります。結果を確認し、適切に処理します。

于 2012-09-20T22:07:36.300 に答える
1

shell_execを使用してみてください

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

マニュアルから:

shell_exec —シェルを介してコマンドを実行し、完全な出力を文字列として返します

ノート:

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

これですべてが完了しましたが、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 に答える