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

use*_*473 3 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';
} 
?>
Run Code Online (Sandbox Code Playgroud)

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

谢谢

Qir*_*rel 7

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
    } else {
        throw $e;// in case it's any other error
    }

}
Run Code Online (Sandbox Code Playgroud)

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
    } else {
        throw $e;// in case it's any other error
    }
}
Run Code Online (Sandbox Code Playgroud)

当您开始在查询中引入变量时,请考虑使用准备好的语句(如何防止 PHP 中的 SQL 注入?)。