在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或任何可以让我向输入重复项的用户打印一条消息的用户,他必须输入主键的另一个值。
谢谢
答案 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?)。