Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
捕捉PHP中的postgres错误_Php_Postgresql - Fatal编程技术网

捕捉PHP中的postgres错误

捕捉PHP中的postgres错误,php,postgresql,Php,Postgresql,我在postgressql中有一个带有primare键(pk_user)的表。如果我插入了错误的参数 postgres调用异常:(错误:重复的键值违反了唯一约束“pk\u user”) 这没关系,但我喜欢捕捉这个错误并将其转换为用户界面(使用这个用户名) 我的php脚本: $sql="INSERT INTO user (....) VALUES (....)" @$result=pg_query($dbconn,$sql); if(!$result) { $error= pg_last_err

我在postgressql中有一个带有primare键(pk_user)的表。如果我插入了错误的参数

postgres调用异常:(错误:重复的键值违反了唯一约束“pk\u user”)

这没关系,但我喜欢捕捉这个错误并将其转换为用户界面(使用这个用户名)

我的php脚本:

$sql="INSERT INTO user (....) VALUES (....)"
@$result=pg_query($dbconn,$sql);
if(!$result) {
 $error= pg_last_error($dbconn);
 if($error==='ERROR: duplicate key value violates unique constraint "pk_user"')
   $outputmesage="this username is used";
....
}
else {
.....
}
但是构造
if($error=='error:重复的键值违反了唯一约束“pk_user”)
这是错误的。我不知道这是怎么写的。strcmp函数(str1,str2)也错误

附言:
很抱歉,我的英语不好

在插入此用户名之前,请选择并解决此问题

但是,如果您试图最小化对db的查询数量,您可以继续使用您的解决方案,只需将条件更改为如下所示:

if(strstr($error,"duplicate key value")) {
   $outputmesage="this username is used"; 
}
希望它能对您有所帮助,但您必须使用
pg_send_query
pg_get_result
(而不是
pg_query
及其更好的替代方法
pg_query_params
):


另一种方法是使用PDO,将错误处理设置为“ERRMODE_EXCEPTION”,处理异常并查看
code
属性(该属性同样应包含SQLSTATE错误代码)。

我的注释有点不相关,但您不应该先检查用户名是否已被使用,然后尝试插入它吗?我不喜欢(可能是个人的)我知道做某件事的方法可能是错误的,从副作用中可以看出原因。迪米特里斯·米斯特里奥蒂斯:不,这是错误的方法。即使你先检查,也不能保证在检查和插入之间不会有人要求相同的用户名(除非在事务中-但这限制了并发性,并且不需要,因为只有一个查询就足够了)。除了Torenaga方法的正确性之外,它也更有效,因为它总是只需要一个查询,而大多数时候只需要两个查询。
pg_send_query($dbconn,$sql);
$res = pg_get_result($dbconn);

# check for "UNIQUE VIOLATION"
if(pg_result_error_field($res,PGSQL_DIAG_SQLSTATE) == '23505') {
    ...