捕捉PHP中的postgres错误
我在postgressql中有一个带有primare键(pk_user)的表。如果我插入了错误的参数 postgres调用异常:(错误:重复的键值违反了唯一约束“pk\u user”) 这没关系,但我喜欢捕捉这个错误并将其转换为用户界面(使用这个用户名) 我的php脚本:捕捉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
$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') {
...