[英]what's wrong with this sql query?
好的,我在PHP中有两个变量
$username;
$password;
它被初始化为从$ _POST变量中检索的数据:)
我有这个SQL查询
$sql = "SELECT * FROM users WHERE username = '" . $username . "' AND password = '" . $password . "')";
但这不起作用,并没有给我任何回报:(
你能指导我走向正确的方向吗? 请?
查询在结尾处有一个右括号,没有任何理由,它将无法工作。
它出什么问题了?
不幸的是,一切。 特别是它对SQL注入攻击持开放态度。
如果这是一个逐字剪切和粘贴,那么它实际上不工作的原因是一个尾随的结束括号。 大概你在打电话时没有检查错误?
使用基础MySQL API应该是:
$sth = $db->prepare("SELECT COUNT(*) FROM users WHERE username = ? AND password = ?");
$sth->execute($username, $password);
list($count) = $sth->fetchrow();
$authorized = ($count > 0);
或类似的(代码未经测试,E&OE等...)
eeek! sql注入一个!
编辑: 你最喜欢的“程序员”卡通是什么?
在查询结束时为什么会有流浪? 它应该不存在。
哦,并且在SQL注入方面很谨慎。 坏。
您的查询字符串末尾似乎有一个多余的右括号。
[编辑] - 对于那些尖叫的SQL注入攻击:在查询中使用它们之前,我们不知道用户对其变量做了什么。 怀疑的好处怎么样? ;-)
首先, 永远不要这样做。 请阅读有关SQL注入的内容 ,除非您理解了它的内容,否则不要编写任何SQL。 对不起,但这非常重要。
也就是说,您的查询包含一个结束括号。 这看起来像语法错误。 执行它会出错吗?
查询的右侧有一个额外的括号。
此外,如果您没有正确清理代码,那么您将容易受到SQL注入攻击。 你应该使用参数化查询,但至少在$username
和$password
上使用mysql_real_escape_string()
代替。
此外,作为一些鬼调试,你的密码很可能是数据库中的MD5哈希值,因为你永远不应该以纯文本形式存储它们。
尝试:
$username = mysql_real_escape_string($_POST["username"]);
$password = md5($_POST["password"]);
$sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
除了提到的所有其他问题。 Users表中的密码以加密方式存储。 除非您通过MySQL密码加密器运行密码,否则您将永远不会看到此查询中的任何数据,因为密码不匹配。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.