【发布时间】:2016-04-06 14:41:51
【问题描述】:
我之前对 mysqli 很陌生,我在 mysql 中编写查询,但 mysqli 更高级,所以我是第一次使用它。 下面是我的php代码。
function clean($str) {
$str = @trim($str);
if(get_magic_quotes_gpc()) {
$str = stripslashes($str);
}
return mysql_real_escape_string($str);
}
$email = clean($_POST['email']);
$password = clean($_POST['password']);
//$password =md5($password);
if(empty($res['errors'])) {
$result = $mysqli->query("SELECT uid FROM users where email='$email' and password = '$password'");
if($result->num_rows == 1){
$res['success'] = true;
}
else{
array_push($res['errors'], 'Invalid login details');
$res['success'] = false;
}
}else{
$res['success'] = false;
}
echo json_encode($res);
}
clean 函数没有按预期工作,因为如果我输入正确的用户名和密码,sql 查询将返回 false。 因此,这似乎在 mysqli 案例中无效。
我检查了这个链接PHP MySQLI Prevent SQL Injection 并知道我们必须准备查询。
我可以看到有一个示例,但如果我必须使用两个或更多表单数据,我无法理解如何准备/绑定。
感谢您的宝贵时间。
更新代码
$result = $mysqli->prepare("SELECT uid FROM users where email=:email and password = :password");
$result->execute([
':email' => $email,
':password' => $password]);
//$result->execute();
if($result->num_rows == 1){
//if(mysqli_num_rows($result) === 1) {
$res['success'] = true;
}
else{
array_push($res['errors'], 'Invalid login details');
$res['success'] = false;
}
【问题讨论】:
-
使用基于pdo的redbeanphp。
-
原因是,您正在混合 MySQL API,如果您仍在使用
return mysql_real_escape_string($str);与您的现有/新代码,则不能这样做。只需摆脱所有这些并使用准备好的语句。另外,我们不知道您的 POST 数组中是否有任何值,因为您没有发布 HTML 表单。 -
我们也不知道您(现在)使用哪个 API 进行连接。
mysql_?mysqli_? PDO?其他?然后你有if($result->num_rows == 1){即mysqli_语法,而你的where email=:email and password = :password是PDO。同样,它们不会混合使用。