1

CodeIgniterのdbクラスを使用してクエリを作成しています。

クエリは次のようになります。

    SELECT `user_id`, `firstname`, `lastname`, `email`, `school_id`, `country_id`
    FROM (`users`)
    WHERE `user_id` != '1'
    AND `firstname` =  'thomas'
    OR `lastname` =  'thomas'
    OR `email` =  'thomas'
    OR `firstname` =  'jefferson'
    OR `lastname` =  'jefferson'
    OR `email` =  'jefferson'

この場合、ユーザーは「thomas jefferson」を検索し、ユーザー自身のIDは1です。したがって、ユーザーが自分自身を検索できないようにするために、user_idが1でないことを確認します。

クエリがそれほど良くないことは知っていますが、それは私が必要としているものに対しては完全に機能します。また、私は怠惰すぎて正しく実行できません。

このすべての背後にあるPHPコードは

    $this->db->select('user_id, firstname, lastname, email, school_id, country_id')->from('users');
    $this->db->where('user_id !=', $this->session->userdata('user_id'));
    for ($i = 0; $i < count($searchQuery); $i++) {
        if ($i == 0) {
            $this->db->where('firstname', $searchQuery[$i])->or_where('lastname', $searchQuery[$i])->or_where('email', $searchQuery[$i]);
        } else {
            $this->db->or_where('firstname', $searchQuery[$i])->or_where('lastname', $searchQuery[$i])->or_where('email', $searchQuery[$i]);
        }
    }
    $this->db->limit(10);
    $query = $this->db->get();

私は99%ポジティブです

    WHERE `user_id` != '1'
    AND(<-- this) `firstname` = ...

間違っていますが、私はそれを行う別の方法を理解できないようです。

4

4 に答える 4

1

SQLServerの操作の優先順位を見てください。そこでは、操作が操作の前に評価される
ことがわかります。 ANDOR

これは、クエリが最初にAND: を評価していることを意味します。

user_id != '1' AND firstname = 'thomas'

その後

OR blablablablabla (the rest of the query)

正しくするには、次のようになります。

   SELECT `user_id`, `firstname`, `lastname`, `email`, `school_id`, `country_id`
    FROM (`users`)
    WHERE `user_id` != '1'
    AND (`firstname` =  'thomas'
    OR `lastname` =  'thomas'
    OR `email` =  'thomas'
    OR `firstname` =  'jefferson'
    OR `lastname` =  'jefferson'
    OR `email` =  'jefferson')
于 2013-01-22T19:41:07.627 に答える
1

この形式で括弧を整理する必要があります...SELECT user_id、、、、、、firstnameFROM ()lastnameWHERE != '1' AND(='thomas' OR ='thomas' OR ='thomas' OR ='jefferson' OR = 'jefferson' OR ='jefferson')emailschool_idcountry_idusersuser_idfirstnamelastnameemailfirstnamelastnameemail

于 2013-01-22T19:47:48.990 に答える
0

そのようにしてみてください

SELECT `user_id`, `firstname`, `lastname`, `email`, `school_id`, `country_id`
FROM (`users`)
WHERE `user_id` != 1 
AND 
( `firstname` =  'thomas'
OR `lastname` =  'thomas'
OR `email` =  'thomas'
OR `firstname` =  'jefferson'
OR `lastname` =  'jefferson'
OR `email` =  'jefferson' )
于 2013-01-22T19:42:11.513 に答える
0

答えてくれてありがとう!このようにして修正しました。

    $sql = "SELECT user_id, firstname, lastname, email, school_id, country_id FROM users WHERE user_id != " . $this->session->userdata('user_id');
    $firstname = array();
    $lastname = array();
    $email = array();

    foreach ( $searchQuery as $a )
    {
        if ( ! empty($a) )
        {
            $firstname[] = "'".$a."'";
            $lastname[] = "'".$a."'";
            $email[] = "'".$a."'";
        }
    }
    $firstname = implode(',', $firstname);
    $lastname = implode(',', $lastname);
    $email = implode(',', $email);

    $sql .= " AND(firstname IN($firstname) OR lastname IN($lastname) OR email IN($email))";

    $query = $this->db->query($sql);

編集:インジェクションから文字列を実際にクリアしていないことに気づきました

于 2013-01-22T19:55:28.943 に答える