Хороший способ передачи параметров в PDO - PullRequest
2 голосов
/ 07 декабря 2009

Позиционные параметры становятся кошмаром при работе с более чем 3 или 4 параметрами. Именованные параметры являются подробными. Я думаю сделать это:

query("SELECT * FROM users WHERE username = ", $username, " AND password = ", $password)

С динамическими параметрами (используя func_get_args()) каждая секунда преобразуется в позиционный параметр.

Я никогда не видел этого раньше и хотел знать, делал ли это кто-то раньше и почему / почему нет?

Ответы [ 3 ]

4 голосов
/ 07 декабря 2009

Именованные параметры не должны быть многословными, по крайней мере, по сравнению с позиционными параметрами. Вы можете использовать сокращенные версии, которые все еще очевидны:

$st = $dbh->prepare('SELECT * FROM users WHERE username = :u AND password = :p');
$st->bindValue(':u', $username);
$st->bindValue(':p', $password);
$st->execute();
2 голосов
/ 07 декабря 2009

Это умная идея. Единственная проблема, которую я вижу, состоит в том, как отличить SQL от переданных переменных. Если вы не сделаете предположение, что каждый второй аргумент является переменной. Я просто думаю, что это предположение хрупко, и запутывает вещи больше, чем дает понять.

Лучше всего будет использовать интерполяцию:

query("SELECT foo FROM bar WHERE id = #{id}",  array("id" => "23"));

Затем напишите логику для их интерполяции.

1 голос
/ 07 декабря 2009

Я не думаю, что позиционные параметры настолько плохи ... это мой любимый метод:

function mysql_safe_string($value) {
    if(is_numeric($value))      return $value;
    elseif(empty($value))       return 'NULL';
    elseif(is_string($value))   return "'".mysql_real_escape_string($value)."'";
    elseif(is_array($value))    return implode(',',array_map('mysql_safe_string',$value));
}

function mysql_safe_query($format) {
    $args = array_slice(func_get_args(),1);
    $args = array_map('mysql_safe_string',$args);
    $query = vsprintf($format,$args);
    $result = mysql_query($query);
    if($result === false) echo '<div class="mysql-error"><strong>Error: </strong>',mysql_error(),'<br/><strong>Query: </strong>',$query,'</div>';
    return $result;
}

// example
$result = mysql_safe_query('SELECT * FROM users WHERE username=%s', $username);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...