PHP - 检测由于违反唯一约束而导致的mysql更新/插入失败

Joh*_*0te 13 php mysql

这有点类似于这个问题:

PHP MySQL INSERT由于唯一约束而失败

但我有一个不同的转折.假设我有一个只有一列的表格.列的名称是"title",它有一个唯一的约束.

首先,我插入一行title ="something".下次我尝试插入"某事"时,由于唯一的键约束(这很好),它将失败.我想做的是让它失败,并检查mysql提供的错误代码,以确保它由于唯一的键约束而失败.(即让数据库处理唯一性,我只是处理错误代码并在结果返回时告诉用户标题已经存在).

有没有办法做到这一点?

Ben*_*son 18

现在是2015年,没有理由不使用PHP的PDO实现:

http://php.net/manual/en/book.pdo.php

用于检测和处理由于键约束违反而导致的插入失败的适当的现代"OO"方法如下:

try {
    //PDO query execution goes here.
}
catch (\PDOException $e) {
    if ($e->errorInfo[1] == 1062) {
        //The INSERT query failed due to a key constraint violation.
    }
}
Run Code Online (Sandbox Code Playgroud)

PDOException对象还有很多关于错误的特定性质的说法(似乎比一个人可能想要或需要的更多细节).

http://php.net/PDOException


小智 12

http://dev.mysql.com/doc/refman/5.5/en/error-messages-server.html

http://php.net/manual/en/function.mysql-errno.php

我过去不得不这样做,这并不好玩:

if( mysql_errno() == 1062) {
    // Duplicate key
} else {
    // ZOMGFAILURE
}
Run Code Online (Sandbox Code Playgroud)

关于编程风格的注释(从这个答案中可以看出jensgram) 你应该总是设法避免使用魔术数字.相反,您可以将已知错误代码()分配给常量(例如).这将使您的代码更容易维护,因为语句中的条件在几个月内仍然可读,而其含义已从内存中消失:)
1062MYSQL_CODE_DUPLICATE_KEYif1062