Только наткнулся на это, но только для дальнейшего использования ...
Во-первых, я буду исходить из предположения, что ваш пример должен был читать $array = array(":a"=>"10002345", ":b"=>"Josh");
, поскольку возникла бы проблема, даже если ваш ключ :b
отсутствовал.
В этом бите:
foreach($array as $key => $value ) {
$stmt->bindParam($key, $value);
}
Вы не передали ' по ссылке '. $value
следует изменить на &$value
foreach($array as $key => &$value ) {
$stmt->bindParam($key, $value);
}
Это потому, что подпись метода bindParam
требует, чтобы значение было ссылкой на переменную:
public function bindParam ($parameter, &$variable, $data_type = PDO::PARAM_STR, $length = null, $driver_options = null) {}
(обратите внимание на &
перед $variable
).
Конечный результат вашего исходного запроса (без &
) заключается в том, что для всех :params
будет установлено значение, которое находится на последней итерации $value
в исходном цикле.
Итак, результат
$sql = "SELECT * FROM users WHERE id = :a OR fname = :b";
$array = array(":a"=>"10002345", ":b"=>"Josh");
$stmt = $conn->prepare($sql);
foreach($array as $key => $value ) {
$stmt->bindParam($key, $value);
}
$stmt->execute();
будет SELECT * FROM users WHERE id = 'Josh' OR fname = 'Josh'
Использование именованных параметров (:param
) имеет преимущества перед позиционными параметрами (?
), поэтому стоит зарезервировать эту опцию для подготовленных операторов, в отличие от принятого ответа «лучше использовать ?
заполнители», что не так.