0

クリックされたチェック ボックスに応じて、ユーザーがクリックしたチェック ボックスをループするスクリプトを作成しています。これにより、「動的な」クエリが生成されます。pdo で実行する配列を使用して where ステートメントを作成しようとしています。

私が抱えている問題は、 foreach ループ内で使用しようとしていることです

.=

文字列を連結してクエリを作成します。ただし、ユーザーが同じグループのチェックボックスをクリックすると、

'why_and'

$where が 1 つだけ作成されるため、var_dump を使用してクエリを出力すると、次のようになります。

SELECT student.anum, 
       student.first, 
       student.last, 
       student.email, 
       session.aidyear, 
       reasons.reason, 
       COUNT(session.anum) as Total, 
       MIN(DATE_FORMAT(session.signintime, '%b %d, %Y - %l:%i %p')) as 'First',      
       MAX(DATE_FORMAT(session.signintime, '%b %d, %Y - %l:%i %p')) as 'Last' 
FROM  
      student INNER JOIN session 
           ON session.anum = student.anum 
      INNER JOIN session_status 
           ON session_status.status = session.status 
      INNER JOIN reasons 
           ON reason_id = session.why 
WHERE 1 AND why = :reason 
GROUP BY session.anum

次に、プレースホルダー配列を var_dump し、これを取得します。

[":reason"]=> string(9) "4 , 5 , 6" }

:reason 配列に 3 つの値があり、クエリには :reason が 1 つしかないことに注目してください。不足しているものはありますか?

これは私の思考プロセスの例です(コメントを見てください):

   $placeholder = array();
    $where = "";

if($and !== "") // This is the "super array" if you will 
{
    if(array_key_exists('why_and', $and)) // Now I check for each specific thing a user can search for in the array / database 
    {
       foreach($and as $key => $value) // Take the $value of the array index why_and
       {
           $where .= " AND why = :reason "; // Create a where variable with a named placer holder for each value that exists in the array 
           $placeholder[':reason'] .= rtrim($value, ' ,'); // Then add to the $placeholder array so I can I add it to the PDO execute as an array
       }
    }
    if(array_key_exists('status_and', $and))
    {
       foreach($and as $key => $value)
       {
           $where .= " AND status = :status ";
           $placeholder[':status'] .= rtrim($value, ' ,');
       }
    }
}
$finSQL = $sql . ' WHERE 1 ' . $where; // COncate the final results
$dynamic = $this-> db-> conn_id-> prepare($finSQL); // prepare
$dynamic-> execute($placeholder); // Use the placeholder array and pass that to the execute as a [key => value pair as shown in the manual example number 2][1]

編集1 @あなたの常識

これは機能しますが、各チェックボックスカテゴリの1つの値、why_and、 status_andに対してのみですが、同じカテゴリから複数の値を実行しようとすると機能しません。

4

0 に答える 0