gpt4 book ai didi

php - @(或 "at sign")提前结束我的 MySQL 查询,导致错误

转载 作者:行者123 更新时间:2023-11-29 04:59:19 29 4
gpt4 key购买 nike

我正在编写我的第一个登录脚本。我一直在关注一本书中的示例,但这就是我被困的地方。我希望用户登录是一个电子邮件地址,但是当我点击提交时,我会收到这个错误。

Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given in C:\wamp\www\mysite\index.php on line 19

该脚本在书中有效,没有拼写错误,并且从 Google 中,我发现如果原始查询失败,则会给出错误,所以我决定插入一个“mysqli_error”来检查哪里出了问题,我得到了这个:

Nah. admin@mysite.comYou have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '@mysite.com AND password = SHA('password')' at line 1

因此,我几乎可以肯定 @ 符号提前结束了我的查询。我有 trim 和 mysql_real_escape_string 作为清理字符串的方法,但除此之外我什么都没有。我已经在谷歌上搜索了一段时间,但我无法找到或弄清楚如何为 @(“at 符号”)或某种解决方法设置异常(exception)。

我不希望这个问题太长或太复杂,但如果需要我可以提供更多代码。

谢谢!

编辑:这是缩小解决方案范围的完整代码。

if (isset($_POST['submit'])) {

$loginEmail = mysqli_real_escape_string($dbc, trim($_POST['loginEmail']));
$loginPassword = mysqli_real_escape_string($dbc, trim($_POST['loginPassword']));

$query = "SELECT user_id, username FROM user_db WHERE email = $loginEmail AND password = SHA('$loginPassword')";
$loginData = mysqli_query($dbc, $query);

if (mysqli_num_rows($loginData) == 1) {
echo 'You win!';
}

else {
$error = mysqli_error($dbc);
echo 'Nah. ' . $loginEmail . $error;
}
}

最佳答案

字符串文字需要用单引号引起来:

...WHERE email = 'accountname@example.com' AND password = SHA('password')

mysql_real_escape_string() 函数向变量内容中的特殊字符添加反斜杠,但它用单引号分隔字符串。

例如:

$loginEmail = "O'Reilly";
$loginEmail = mysql_real_escape_string($loginEmail);

现在 $loginEmail 的内容是:

O\'Reilly

不是:

'O\'Reilly'

因此您需要自己在 SQL 表达式中添加引号:

$query = "SELECT user_id, username FROM user_db 
WHERE email = '$loginEmail' AND password = SHA('$loginPassword')";

我真的建议使用 PDO 和准备好的查询,而不是将所有变量细致地插值到 SQL 中。这样,您就不必担心 mysql_real_escape_string() 或引号或特殊字符。

$pdo = new PDO(...connection arguments...);
$sql = "SELECT * FROM mytable WHERE email = ? AND password = SHA(?)";
$stmt = $pdo->prepare($sql);
$stmt->execute(array($loginEmail, $loginPassword));

看到了吗?您不需要在 ? 参数占位符周围使用单引号,您不需要转义作为参数传递的变量,而且您也不必担心 SQL 注入(inject)。

另请参阅我的演示文稿 SQL Injection Myths and Fallacies .

另请阅读You're Probably Storing Passwords Incorrectly由无畏的领导者。

关于php - @(或 "at sign")提前结束我的 MySQL 查询,导致错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3249434/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com