我知道您可以使用mysqli_multi_query
运行多个查询,但是我有一个问题:
对于注册页面,我要执行2次检查,然后执行插入操作:
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);
答案 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确实可以防止对数据库的枚举攻击。