当前位置: 首页 > 知识库问答 >
问题:

SQL insert后的PHP异常处理[重复]

荆鸿畅
2023-03-14

我正在php中创建一个非常简单的注册表单,当前当用户尝试注册时,将弹出一个带有succes或fail消息的javascript警报。

现在,我想捕获sql异常,以显示用户名或电子邮件是否已经在数据库中执行,而不是标准的失败消息。

这是我目前拥有的代码:

if(isset($_POST['btn-signup']))
{
  $uname = mysql_real_escape_string($_POST['uname']);
  $email = mysql_real_escape_string($_POST['email']);
  $upass = md5(mysql_real_escape_string($_POST['pass']));

  if(mysql_query("INSERT INTO user(username,password,email) VALUES('$uname','$upass','$email')"))
{
?>
    <script>alert('successfully registered ');</script>
<?php
}
else{
?>
    <script>alert('error while registering you...');</script>
<?php
 }
}
?>

我如何检查是否电子邮件或用户名已经在数据库中?这两个变量在数据库中都是唯一的。

共有1个答案

上官正志
2023-03-14

来自备注:

我不想要2个查询,而数据库可以为我返回一个异常。如果那个表中有大约1000万条记录,我不想在插入一条新的之前检查它们全部。

好的,那么您有一个查询要插入并检查是否唯一?所以你必须在unique_indexMySQL列上插入,你就可以捕捉到这种异常,用下面这样的回答方式来回答这个问题:

在这个答案的情况下,我们假设您正在使用PDO,因为您应该使用PDO。请仔细读一下。

// Pre-setup the database connection somewhere, usually an include (or a class)
$link = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbusername,$dbpassword);
// PDO needs to be set in Exception mode:
$link->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

//Input Processing functions.
// (entirely optional)
$uname = MyCleanerFunction($_POST['uname']);
$email = MyCleanerFunction($_POST['email']);
//please see note below re:MD5
//$upass = md5($_POST['pass']); 
$options['cost'] = 12;
$upass = password_hash($_POST['pass'],PASSWORD_BCRYPT,$options);

//now reach the code part:
    try {
        //PDO query execution goes here:

         $statement = $link->prepare("INSERT INTO user(username,password,email) VALUES(:uname, :email, :pass)"));
         $statement->bindValue(":uname", $uname);
         $statement->bindValue(":email", $email);
         $statement->bindValue(":pass", $upass);
         $statement->execute();
         //reaching here everything is ok! 
    }
    catch (\PDOException $e) {
        if ($e->errorInfo[1] == 1062) {
            // The INSERT query failed due to a key constraint violation.
            // THIS means that it failed because the Primary Key 
            // (the email) appears already in the database table.
        }
        if($e->errorInfo[1] == 9999){
          // possible other IF clauses for other errors in INSERT.
        }
    }

您还可以阅读有关捕获和输出PDO错误的内容。以及关于MySQL唯一键约束的所有内容。

>

  • 也是非常有用的另一种观点,即您不应该捕获PDO异常。

    另外,请注意,MD5是一个非常弱的用于存储密码的哈希函数,而PHPpassword_hash函数是最好的方法。

    请使用准备好的语句进行MySQL交互,上面的布局是它们外观的粗略指南,对于mysqlipdo非常相似。准备好的语句在保护数据不受恶意用户输入的影响方面有很大的作用。

  •  类似资料:
    • 本文向大家介绍PHP异常处理Exception类,包括了PHP异常处理Exception类的使用技巧和注意事项,需要的朋友参考一下 异常(Exception)用于在指定的错误发生时改变脚本的正常流程。 什么是异常? PHP 5 提供了一种新的面向对象的错误处理方法。 异常处理用于在指定的错误(异常)情况发生时改变脚本的正常流程。这种情况称为异常。 当异常被触发时,通常会发生: 当前代码状态被保存

    • 本文向大家介绍java7改善后的异常处理,包括了java7改善后的异常处理的使用技巧和注意事项,需要的朋友参考一下 异常处理有两处改进——multicatch和final重抛。要知道它们对我们有什么帮助,请先看一段Java 6代码。下面这段代码试图查找、打开、分析配置文件并处理此过程中可能出现的各种异常: 在Java 6中处理不同的异常 这个方法会遇到的下面几种异常: 配置文件不存在; 配置文件在

    • 这是链接中问题的继续:我正在学习java中的异常处理(基本上是在继承中),子类方法必须抛出异常,该异常是父类方法的子类。 “当子类重写超类中的方法时,子类方法定义只能在父类方法(或重写方法)的throws子句中指定异常类的所有或子集” 这是一条规则。但我不知道制定这条规则的原因是什么,为什么不允许反之亦然。为什么要创建此规则

    • 有人知道为什么这个函数,当传递一个无效的日期(例如时间戳)给它时,仍然抛出一个错误,尽管? 错误: 致命错误:未捕获的异常'异常'与消息'DateTime::_construct()[datetime.-构造]:未能解析时间字符串(422926860)在位置7(6):意外字符'在...... php: 4堆栈跟踪:#0...... php(4):日期时间 提前非常感谢!

    • 本文向大家介绍浅谈PHP中的错误处理和异常处理,包括了浅谈PHP中的错误处理和异常处理的使用技巧和注意事项,需要的朋友参考一下 错误处理:          1. 语法错误     2. 运行时的错误     3. 逻辑错误   错误报告:                  错误E_ERROR         警告E_WARNING         注意E_NOTICE 开发阶段:开发时输出所有的

    • 我正试图找出处理异常的最具Python风格的方法。假设我们有一个长方法,它可以完成多个注册汽车的任务 例如 检索汽车详细信息 计算税款 发送确认电子邮件 调用方法是否应该处理异常: 或者单个方法本身是否应该处理异常。如果在这个方法中有任何异常,我们只想记录下来(或者在这个例子中打印出来)并继续。 是一种方法比另一种方法更pythonic,还是归结为更具可读性?我更喜欢第二种方式,但我们似乎更频繁地