2016-12-02 6 views
-1

私は、フィードバックフォームのテーブルからレコードのリストを選択する機能を持っています。PDOは、SQLクエリ文字列を書き直さずにオプションのバインドパラメータを持つ

$sql = "SELECT * FROM `feedback` WHERE course_id = :course_id AND user_id = :user_id LIMIT 1"; 
$stmt = $this->ci->db->prepare($sql); 
$result = $stmt->execute([ 
    "course_id" => $course_id, 
    "user_id" => $user_id 
     ]); 
$results = $stmt->fetch(PDO::FETCH_ASSOC); 

私はこのように、ユーザIDはオプションであることを確認したいがないことを確認はどのように最も効率的にそれを書くために:コースのIDとユーザーIDは、現時点ではクエリが両方に基づいていますか?

if ($user_id) { 
    $sql = "SELECT * FROM `feedback` WHERE course_id = :course_id AND user_id = :user_id LIMIT 1"; 
    $stmt = $this->ci->db->prepare($sql); 
    $result = $stmt->execute([ 
     "course_id" => $course_id, 
     "user_id" => $user_id 
    ]); 

} else { 

    $sql = "SELECT * FROM `feedback` WHERE course_id = :course_id LIMIT 1"; 
    $stmt = $this->ci->db->prepare($sql); 
    $result = $stmt->execute([ 
     "course_id" => $course_id, 
    ]); 

} 

$results = $stmt->fetch(PDO::FETCH_ASSOC); 

をしかし、それは非常に非効率です:

例えば、私はこのような何かを行うことができます。問題は、"user_id" => $user_id(コードの最初のブロック)を省略すると、バインドされたパラメータの数が一致しないため、私の$sqlが無効であるということです。

この場合の最善の方法は何ですか?

+0

をあなたはすでにここhttp://stackoverflow.com/questions同じ質問をしませんでした/ 40525986/php-array-a-pdo-search-query- –

+0

本当にそうではありません。配列をループするときに 'LIKE'と' = '条件を使うことについての質問です。本当に全く違う。 – Andy

答えて

1

あなたは$ thisを使用しているので、あなたはクラスに属していると思いますので、プロセスをラップする関数を作成しました。 私は、いくつかのパラメータがオプションの場合にPHP文字列連結を使用してリクエストを作成しています。あなたもPDOStatmentで使用されるパラメータの配列にその場でエントリを追加することができます として、あなたはこのようにそれを行うことができます。

public function getRecords($course_id, $user_id = null) { 

    // Init request string 
    $request = "SELECT * 
       FROM `feedback` 
       WHERE course_id=:course_id"; 

    // Init $params array 
    $params = array(
     ':course_id' => $course_id 
    ); 

    // If user_id is passed to the function 
    // update request string & $params array 
    if(null !== $user_id) { 
     $request .= " AND user_id=:user_id"; 
     $params[':user_id'] = $user_id; 
    } 

    // Finish request 
    $request .= " LIMIT 1"; 

    $stmt = $this->ci->cb->prepare($request); 
    $stmt->execute($params); 
    $results = $stmt->fetch(PDO::FETCH_ASSOC); 
} 
+0

はい、クエリはクラス関数内にあります。簡潔にするため、これを省略しました。ありがとう、これは私の必要性のために働くでしょう。 – Andy

関連する問題