PHP:执行失败的 PostgreSQL 脚本时,exec() 返回状态“0”(成功)

问题描述 投票:0回答:1

我正在尝试通过 PHP 运行 PostgreSQL 脚本时处理 SQL 错误。 即使我强制 SQL 脚本失败,我的 exec() 调用也始终返回状态“0”:

PHP:

[...]  
$command = "$psqlPath -h $myHost -d $myDb -U $myUser -f $sqlScript 2>&1";
$output = [];
$return_var = 0;
exec($command, $output, $return_var);

sqlScript
旨在导致违反约束。结果是:

$return_var -> 0
$output[0] -> "psql:/pathToMyScript/sqlScript.sql:1: ERROR: duplicate key value violates unique constraint"

我做错了什么?为什么 return_var 仍然是“0”?

如果担心:我正在运行相对较旧的 PostgreSQL 版本:10.17。

php sql postgresql exec
1个回答
0
投票

PHP 仅传输命令生成的退出代码,并且

pgsql
默认情况下不会返回违反约束的非零值:

bash-5.1# psql -U docker -f test.sql; echo $?
psql:test.sql:1: ERROR:  null value in column "iso_code" of relation "country" violates not-null constraint
DETAIL:  Failing row contains (1, null, null, blah, null, null, null).
0

记录

退出状态

psql 如果正常完成则向 shell 返回 0,如果致命则返回 1 发生自身错误(例如,内存不足、未找到文件),如果为 2 与服务器的连接出现故障并且会话不正常 交互式,如果脚本和变量中发生错误则为 3 ON_ERROR_STOP 已设置。

在您的情况下,您可以提供它作为参数

bash-5.1# psql -U docker -f test.sql -v ON_ERROR_STOP=1; echo $?
psql:test.sql:1: ERROR:  null value in column "iso_code" of relation "country" violates not-null constraint
DETAIL:  Failing row contains (1, null, null, blue, null, null, null).
3
© www.soinside.com 2019 - 2024. All rights reserved.