0

mysqlに2つのテーブルがあります

ユーザー:-id -name -email -role

位置-id-位置

CodeigniterでPHPActiveRecordを使用して検索語を作成する必要があります。ユーザーが「John」または「Designer」という用語を入力すると、ユーザーと位置テーブルでそれを検索する必要があります。like演算子を使用してUsersテーブルで用語を検索できますが、Positionsテーブルでもpositionフィールドで検索する方法がわかりません。

単一のテーブルで検索するために使用するコードは次のとおりです。

/**
 * 
 * Search users based on parameters
 * @param integer $limit
 * @param integer $start
 * @param string $term
 */
public function search_candidates($limit, $start, $term, $role)
{
  $candidates = User::all(array(
                                'conditions' => "('role' => $role) 
                                  AND ((name like '%".$term."%') 
                                  OR (email like '%".$term."%'))",
                                'limit' => $limit,
                                'offset' => $start,
                                'order' => "name"
  ));

  return $candidates;
}
4

1 に答える 1

1

この検索を実行するには、複数の方法があります。
http://www.phpactiverecord.org/projects/main/wiki/Finders#joins、クエリに結合を追加できることを説明しています

  $candidates = User::all(array(
                            'joins'=>'LEFT JOIN position on (normal left join stuff)
                            'conditions' => "('role' => $role) 
                              AND ((name like '%".$term."%') 
                              OR (email like '%".$term."%'))",
                              //(Your extra where conditions for the position)
                            'limit' => $limit,
                            'offset' => $start,
                            'order' => "name"
));

少なくとも正しい軌道に乗せるべきだと思います。

また、そのようにカスタム条件を使用すると、SQL インジェクションに対してクエリを開いたままにします。クエリのプレースホルダーを使用する必要があります。そうしないと、生の入力をクエリに入れるだけです。

User::find($id)自動的にエスケープされます。

User::all(array('conditions'=>'id'=>1))自動的にエスケープされます

User::all(array('conditions'=>"id = $id"))エスケープされません。

あなたがしなければなりませんUser::find(array('conditions'=>'id = ?', array($id)));

クエリは次のように変換されます。

 $candidates = User::all(array(
                            'conditions' => "('role' = ?) 
                              AND ((name like ?) 
                              OR (email like ?))",
                            'limit' => $limit,
                            'offset' => $start,
                            'order' => "name"
  ),array($role,"%$term%","%$term%");
于 2013-02-26T17:48:59.560 に答える