これはすでに回答されており、追加のパラメーターを送信できるかどうかを尋ねるだけであることは知っていますが、人々がこの質問にたどり着き、この制限を回避する方法を知りたいと思った. 私が使用するソリューションは次のとおりです。
$parameters = array('tid' => $tid, 'u_ID' => $u_ID, 'current_time' => $time);
$1st = $db->prepare($query1);
$1st->execute(array_intersect_key($parameters, array_flip(array('tid'))));
$2nd = $db->prepare($query2);
$2nd->execute(array_intersect_key($parameters, array_flip(array('u_ID', 'tid'))));
$3rd = $db->prepare($query3);
$3rd->execute(array_intersect_key($parameters, array_flip(array('u_ID', 'tid', 'current_time'))));
$4th = $db->prepare($query4);
$4th->execute(array_intersect_key($parameters, array_flip(array('u_ID', 'tid', 'current_time'))));
その array_interset_key と array_flip 操作は、次のように独自の関数に抽出できます。
function filter_fields($params,$field_names) {
return array_intersect_key($params, array_flip($field_names))
}
私はまだそれに慣れていません。
この関数はキー名の配列を反転するため、配列には値がありませんが、正しいキーがあります。次に、最初の配列を交差フィルター処理して、両方の配列にあるキーのみを取得します (この場合、array_flipped 配列のキーのみ)。ただし、元の配列の値を取得します (空ではありません)。したがって、パラメーターの配列を 1 つ作成しますが、実際に PDO に送信されるパラメーターを指定します。
したがって、関数を使用すると、次のようになります。
$parameters = array('tid' => $tid, 'u_ID' => $u_ID, 'current_time' => $time);
$1st = $db->prepare($query1);
$1st->execute(filter_fields($parameters, array('tid')));
$2nd = $db->prepare($query2);
$2nd->execute(filter_fields($parameters, array('u_ID', 'tid')));
$3rd = $db->prepare($query3);
$3rd->execute(filter_fields($parameters, array('u_ID', 'tid', 'current_time')));
$4th = $db->prepare($query4);
$4th->execute(filter_fields($parameters, array('u_ID', 'tid', 'current_time')));
PHP 5.4 を使用している場合は、角かっこ配列構文を使用して、さらにクールにすることができます。
$parameters = array('tid' => $tid, 'u_ID' => $u_ID, 'current_time' => $time);
$1st = $db->prepare($query1);
$1st->execute(filter_fields($parameters, ['tid']));
$2nd = $db->prepare($query2);
$2nd->execute(filter_fields($parameters, ['u_ID', 'tid']));
$3rd = $db->prepare($query3);
$3rd->execute(filter_fields($parameters, ['u_ID', 'tid', 'current_time']));
$4th = $db->prepare($query4);
$4th->execute(filter_fields($parameters, ['u_ID', 'tid', 'current_time']));