好的,我在PHP中有两个变量
$username;
$password;
初始化为从$ _POST变量中检索的数据:)
我有这个SQL查询
$sql = "SELECT * FROM users WHERE username = '" . $username . "' AND password = '" . $password . "')";
但是这不起作用并且什么都没有回复:(
你能指导我走向正确的方向吗?请?
答案 0 :(得分:12)
查询在结尾处有一个右括号,没有任何理由,它将无效。
答案 1 :(得分:7)
它出了什么问题?
不幸的是,一切都很好。特别是它对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等......)
答案 2 :(得分:4)
eeek! sql注入一个!
答案 3 :(得分:2)
为什么在查询结束时会出现偏离?它不应该存在。
哦,并注意到SQL注入。 BAD。
答案 4 :(得分:1)
您的查询字符串末尾似乎有一个多余的右括号。
[编辑] - 对于那些尖叫的SQL注入攻击:在查询中使用它们之前,我们不知道用户对其变量做了什么。怀疑的好处怎么样? ; - )
答案 5 :(得分:1)
首先,永远不要永远这样做。请阅读有关SQL injection的内容,除非您理解了它的内容,否则不要编写任何SQL。对不起,但这非常重要。
也就是说,您的查询包含一个结束括号。这看起来像语法错误。执行它会出错吗?
答案 6 :(得分:1)
查询的右侧有一个额外的括号。
此外,如果您没有正确清理代码,那么您将容易受到SQL注入攻击。您应该使用参数化查询,但至少使用$username
和$password
上的mysql_real_escape_string()
。
另外,作为一些ghost调试,你的密码很可能是数据库中的MD5哈希值,因为你永远不应该以纯文本形式存储它们。
尝试:
$username = mysql_real_escape_string($_POST["username"]);
$password = md5($_POST["password"]);
$sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
答案 7 :(得分:0)
除了提到的所有其他问题。 Users表中的密码以加密方式存储。除非您通过MySQL密码加密器运行密码,否则您将永远不会看到此查询中的任何数据,因为密码不匹配。