【问题标题】:CodeIgniter Where value IN (Field1,Field2)CodeIgniter where value in (Field1,Field2)
【发布时间】:2012-07-05 15:35:49
【问题描述】:

我需要在我的身份验证脚本中设置查询,我想在 WHERE 子句中使用'_MY_POST_VALUE' IN (Field1, Field2)

最终查询将是这样的:

SELECT * FROM 'myprefix_users' WHERE 'myemail@email.com' IN ('EMAIL','LOGIN') AND PASSWORD=SHA1('mypassword')

我试过这样做:

$this->db->where("'" . mysql_escape_string($_POST['login']) . "' IN (EMAIL,LOGIN)", NULL, FALSE);
$this->db->where("PASSWORD=SHA1('" . mysql_real_escape_string($_POST['password']) . "')");
$userdb = $this->db->get('users');

..但是 CodeIgniter 将前缀设置为我的登录/电子邮件值并发送错误:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''test@test.com' IN (EMAIL,LOGIN) AND PASSWORD=SHA1('123')' at line 3

SELECT * FROM (`myprefix_users`) WHERE myprefix_'test@test.com' IN (EMAIL,LOGIN) AND PASSWORD=SHA1('123')

我需要在表名中使用 db_prefix,但我的 WHERE 子句中不需要它,甚至 ->where() 中的第三个参数 (FALSE) 对我不起作用:(

如何解决我的问题?有什么想法吗?

【问题讨论】:

  • 你也可以使用你的自定义查询:)

标签: php mysql codeigniter


【解决方案1】:

尝试使用 Codeigniter 的 Input 类。它将简化您的代码:

$login = $this->input->post('login', TRUE);
$password = $this->input->post('password', TRUE);
$this->db->where("'$login' IN ", "('EMAIL','LOGIN')", FALSE);
$this->db->where("PASSWORD", "SHA1('$password')", FALSE);
$userdb = $this->db->get('users');

【讨论】:

    【解决方案2】:

    首先,您不需要数据库语句中的所有不必要的函数。

    为什么不这样做:

    $user = $_POST['user'];
    $pass = sha1($pass);
    
    $this->db->where("(email = '$user' OR username = '$user') AND password = '$pass'");
    $query = $this->db->get('users');
    

    您无需担心 mysql 转义,因为 CodeIgniter 类会自动为您转义。

    【讨论】:

    • 其实和这个问题很相似:stackoverflow.com/questions/9870583/…
    • OR 是不好的解决方案,因为它会使请求变慢。了解OR 如何在低级 MySQL 引擎中工作。为什么我应该为变量分配内存,这会重复我的$_POST vars?
    • 抱歉,它使语法高亮变得更好了。您不需要复制变量。从上面的答案来看,使用输入类会对你有很大帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 2019-11-01
    • 2012-05-27
    相关资源
    最近更新 更多