这个SQL查询有什么问题?

时间:2009-04-23 16:22:42

标签: php sql mysql

好的,我在PHP中有两个变量

$username;
$password;

初始化为从$ _POST变量中检索的数据:)

我有这个SQL查询

$sql = "SELECT * FROM users WHERE username = '" . $username . "' AND password = '" . $password . "')";

但是这不起作用并且什么都没有回复:(

你能指导我走向正确的方向吗?请?

8 个答案:

答案 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注入一个!

编辑:What's your favorite "programmer" cartoon?

答案 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密码加密器运行密码,否则您将永远不会看到此查询中的任何数据,因为密码不匹配。