mysqli多查询分离

时间:2018-07-23 13:12:07

标签: php mysqli

我知道您可以使用mysqli_multi_query运行多个查询,但是我有一个问题:

对于注册页面,我要执行2次检查,然后执行插入操作:

  • Check1 =用户名是否存在?
  • Check2 =电子邮件已经被使用?

  • 如果两项检查均否定,请执行插入查询。

但是我该如何区分错误?

  • 用户名存在时,必须返回“ 用户名已存在
  • 如果已经使用过电子邮件,则必须返回“ 已使用电子邮件

这是我的代码:

$sql = "check username query; ";
$sql .= "check email query; ";
$sql .= "Insert query";

if (mysqli_multi_query($conn,$sql)) {
    do
    {
        if ($result=mysqli_store_result($conn)) {
            while ($row=mysqli_fetch_row($result)) {
                if (mysqli_num_rows($result) > 0) {
                    //DO STUFF
                    //Here do i need to return if the username or email exists or not.
            };
            mysqli_free_result($result);
        };
    } else {
        echo 'Query fout!';
    };
        while (mysqli_next_result($con));
};

mysqli_close($con);

2 个答案:

答案 0 :(得分:0)

您不会在;语句或循环之后编写if。此外,您的do {} while();循环的格式不正确。

正确格式:

$sql = "check username query; ";
$sql .= "check email query; ";
$sql .= "Insert query";

if (mysqli_multi_query($conn,$sql)) {
    do {
        if ($result = mysqli_store_result($conn)) {
            while ($row = mysqli_fetch_row($result)) {
                if (mysqli_num_rows($result) > 0) {
                    //DO STUFF
                    //return if the username or email exists
                }
                mysqli_free_result($result);
            }
        } 
        else {
            echo 'Query fout!';
        } 
    } while (mysqli_next_result($con));

    mysqli_close($con);
}

答案 1 :(得分:0)

mysqli_multi_query()不是用于此目的的工具。

该mysql [i]要求您跳过每个调用一次执行多个DML操作的DML操作,这为防止sql注入提供了很多保护(但是,对于此类攻击而言,它仍是完整解决方案的一大步)。无需将它们实现为多语句查询。

在性能和可伸缩性方面,限制到数据库的往返次数是有好处的-但您可以这样做:

SELECT SUM(IF('$username'=user.username, 1, 0)) AS usernames,
   SUM(IF('$email'=user.email, 1, 0)) as emails
FROM users
WHERE username='$username' OR email='$email'

通过单个查询获取结果。

不打扰SELECT,而是向数据库中的每个属性添加唯一索引,然后在INSERT失败的情况下处理重复记录错误,这将更为有效,尽管这样做并不适合如此出色的用户经验。 OTOH确实可以防止对数据库的枚举攻击。