【问题标题】:Handle error for duplicate entries - PHP/MySQL处理重复条目的错误 - PHP/MySQL
【发布时间】:2019-11-26 23:40:12
【问题描述】:

处理 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 或任何可以让我打印一条消息给输入重复项的用户,他必须为主键输入另一个值。

谢谢

【问题讨论】:

  • 警告:不要使用在 PHP 7 中删除的过时的mysql_query 接口。PDO is not hard to learn 之类的替代品和PHP The Right Way 之类的指南有助于解释最佳实践.这里的参数是 NOT properly escaped 并且在这段代码中有严重的 SQL injection bugs。转义任何和所有用户数据,尤其是来自$_POST$_GET
  • 这段代码不可能工作。我不确定你在哪里找到它,但我希望你用来学习如何在 PHP 中使用 MySQL 的资源太旧而无法信任。 mysql_query 不再可用,此外,您不能插入这样的数据。您需要完成基本的 SQL 入门,然后才能使这些变得有意义,或者使用数据库抽象层,如 e RedBeanPHPDoctrinePropelEloquent 以获得更柔和的开始。

标签: php mysql error-handling try-catch


【解决方案1】:

我发现这段代码确实有助于捕获 1062 错误,然后从注册页面重定向到登录页面,如果发生错误。测试了一下,一切正常。

catch (PDOException $e) {

  if(str_contains($e, '1062 Duplicate entry')) {
      header("Location: login.php");

  }
      die("Error inserting user details into database: " .  $e->getMessage());

}

【讨论】:

    【解决方案2】:

    mysql_query() 不会抛出异常(只能捕获异常)。 mysqli_ 和 PDO 可以,如果你启用它的话。 mysql_ 也非常过时(并且已经过时了很多年),所以使用启用异常模式的 PDO 或 MySQLi,它会工作的。这两个 API 都支持准备好的语句,因此如果您开始在查询中输入变量,您也应该使用它。

    对于 MySQLi,您需要在连接前mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);,对于 PDO,您需要 $pdo-&gt;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?)。

    【讨论】:

    • 谢谢,但我不知道该怎么做: $pdo = new PDO("mysql:host=$hostname;dbname=$databasename;charset=utf8", $username, $密码); - 我在哪里可以找到主机名和/或数据库名称,老实说我使用的是虚拟机,我现在有点困惑。
    • 这将创建连接,类似于您今天拥有mysql_connect() 的方式。您应该使用 mysql_ 函数删除所有实例,并改用 PDO 或 MySQLi。
    • 在 VM 上,您通常会以 localhostroot 开头,但您需要将其锁定并绝对确定远程用户无法连接,尤其是在您的 root 帐户没有密码的情况下。
    • 好的,我需要获取 mysql 扩展吗?它说致命错误:调用未定义的函数 mysqli_report()
    • 是的,你需要 mysql 和 mysqli/PDO 扩展。
    猜你喜欢
    • 2012-02-04
    • 2013-01-14
    • 2013-08-12
    • 2011-03-09
    • 2015-07-14
    • 2017-08-03
    • 2010-09-18
    • 1970-01-01
    相关资源
    最近更新 更多