处理重复条目的错误-PHP / MySQL

时间:2019-07-18 05:31:09

标签: php mysql error-handling try-catch

在PHP / MySQL重复条目上处理错误的正确方法是什么?

即使代码1062是重复条目的正确代码,下面的代码也不起作用。我应该在这里使用DBO吗?不幸的是我还不熟悉。

<?php 
try {
    mysql_query('INSERT INTO TP2_ORGANISME VALUES (A0A0, Equiterre, 1, 
                        /photos/equiterre_logo.png, Steve Guilbault, steve@equiterre.org');
} catch {
    if (mysql_errno() == 1062) 
      echo 'Duplicate key entry';
} 
?>

我只是在寻找简单的try catch或任何可以让我向输入重复项的用户打印一条消息的用户,他必须输入主键的另一个值。

谢谢

1 个答案:

答案 0 :(得分:3)

mysql_query()不会引发异常(并且只能捕获异常)。 mysqli_和PDO可以(如果启用)。 mysql_也已经过时了(已经使用了很多年了),因此使用启用了异常模式的PDO或MySQLi即可使用。这两个API均支持预准备语句,因此,如果您开始在查询中输入变量,则也应使用该语句。

对于MySQLi,在连接之前需要mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);,对于PDO,需要$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

MySQLi示例

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli($hostname, $username, $password, $databasename);
$mysqli->set_charset("utf8");

try {
    $mysqli->query("INSERT INTO TP2_ORGANISME 
                               VALUES ('A0A0', 'Equiterre', 1, '/photos/equiterre_logo.png', 'Steve Guilbault', 'steve@equiterre.org')");
} catch (mysqli_sql_exception $e) {
    if ($e->getCode() == 1062) {
        // Duplicate user
    }
}

PDO示例

$pdo = new PDO("mysql:host=$hostname;dbname=$databasename;charset=utf8", $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // Enables exception mode

try {
    $pdo->query("INSERT INTO TP2_ORGANISME 
                               VALUES ('A0A0', 'Equiterre', 1, '/photos/equiterre_logo.png', 'Steve Guilbault', 'steve@equiterre.org')");
} catch (PDOException $e) {
    if ($e->getCode() == 1062) {
        // Duplicate user
    }
}

当您开始在查询中引入变量时,请使用准备好的语句(How can I prevent SQL injection in PHP?)。