КАК СМОТРЕТЬ PHP PDO BIND PARAM - PullRequest
       27

КАК СМОТРЕТЬ PHP PDO BIND PARAM

0 голосов
/ 12 сентября 2018

Сейчас я создаю свой собственный конструктор запросов, и я застрял с подготовленным заявлением PDO.Разве это не возможно зациклить BindParam PDO.Я сделал это с помощью foreach (), но он не работает только над последними данными, выполненными циклом.

$sql = "SELECT * FROM users WHERE id = :a OR fname = :b";

$array = array(":a"=>"10002345", "Josh");
$stmt = $conn->prepare($sql); 

foreach($array as $key => $value ) {
    $stmt->bindParam($key, $value);
}

$stmt->execute();

он связывает только последние данные, выполненные циклом.

Ответы [ 2 ]

0 голосов
/ 05 января 2019

Только наткнулся на это, но только для дальнейшего использования ...

Во-первых, я буду исходить из предположения, что ваш пример должен был читать $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) имеет преимущества перед позиционными параметрами (?), поэтому стоит зарезервировать эту опцию для подготовленных операторов, в отличие от принятого ответа «лучше использовать ? заполнители», что не так.

0 голосов
/ 12 сентября 2018

Лучше использовать ? заполнители в запросе и передать массив данных в execute:

$sql = "SELECT * FROM users WHERE id = ? OR fname = ?";
$array = array("10002345", "Josh"); // you don't even need keys here
$stmt = $conn->prepare($sql); 
$stmt->execute($array);
...