我使用php和sql检查数据库中的用户信息。我需要检查用户名和密码是否正确以及帐户是否有效。我有这个SQL查询,但它不起作用。这样做的方法是什么?
SELECT * FROM foo WHERE (name='foo' AND password='foo') AND active=1
答案 0 :(得分:3)
对我来说
SELECT * FROM foo WHERE (name="foo" AND password="foo") AND active=1
应与
相同SELECT * FROM foo WHERE name="foo" AND password="foo" AND active=1
上面的查询假设字段active
属于系列类型int
如果它的varchar或char你查询应该是这样的
SELECT * FROM foo WHERE name="foo" AND password="foo" AND active='1'
并且查询应该有效,我假设您正在处理来自php的SQL注入
答案 1 :(得分:2)
你说,“当我删除AND active = 1 part时,它运行正常。有什么想法吗?”
尝试将其更改为AND active<> 1,以查看问题是否存在于该字段中。可能'active'可能为null或其他值。尝试输出值(在PHP中尝试var_dump($ var))以查看为“活动”字段返回的内容。如果值为0,blanck字符串或null,那么您已经隔离了问题。
答案 2 :(得分:1)
查询看起来是正确的(假设表foo中存在列名,密码和活动),但如果你在PHP中使用它,如果它们在一个字符串中你可能会遇到双引号问题'重新宣布。您可能需要转义它们或使用单引号。
答案 3 :(得分:1)
首先,使用mysql_real_escape_string()
或PDO方法来转义输入。您不希望人们在您的数据库中乱七八糟。
我通常做的简化版本是
SELECT main.id,
main.isActive,
(SELECT count(sub.id)
FROM users AS sub
WHERE sub.id = main.id
AND sub.credential = 'md5password'
LIMIT 1
) AS credentialMatches
FROM users AS main
WHERE main.identity = 'username'
抓住你的结果:
$result = mysql_query($sql);
$data = array();
if (false !== $result) {
while ($row = mysql_fetch_assoc($result)) {
$data[] = $row;
}
}
处理你的结果:
if (count($data) < 1) {
// username not found
} else if (count($data) > 1) {
// multiple rows with the same username, bad thing
} else {
$row = $data[0]
if (false === (boolean) $row['isActive']) {
// user not active
} else if (true === (boolean) $row['credentialMatches']) {
// SUCCESS
// valid user and credential
}
}
另请注意:始终将密码至少存储为MD5哈希,如WHERE credential = MD5('password')
。插入时相同:SET credential = MD5('password')
。这样,当其他人将读取您的数据库时,用户密码将不会如此轻易地显示出来。
更好的是为哈希添加额外的盐,但现在可能会很远。
答案 4 :(得分:1)
我的查询返回0行,我确信我在数据库中有这些字段并输入正确的信息。当我删除AND active = 1 part时,它工作正常。有什么想法吗?
是。 这个想法非常简单。只需检查name ='foo'和password ='foo'的记录是否有active = 1。然后纠正错误和你的数据
提示:当逻辑表示他错了时,程序员不能确定。
答案 5 :(得分:0)
你可以在php中调试你的sql:
$sql = "SELECT * FROM foo WHERE (name='foo' AND password='foo') AND active=1";
$result = mysql_query($sql) or die (mysql_error());
这个“或死(mysql_error())”会给你那个查询的确切错误,如果发生这种情况,可能没有选择数据库使用mysql?query($ sql,$ db)......
希望有所帮助