结合SQL中的条件

时间:2012-02-18 06:50:04

标签: php mysql sql

我使用php和sql检查数据库中的用户信息。我需要检查用户名和密码是否正确以及帐户是否有效。我有这个SQL查询,但它不起作用。这样做的方法是什么?

SELECT * FROM foo WHERE (name='foo' AND password='foo') AND active=1

6 个答案:

答案 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)......

希望有所帮助