2

当处理超过 3 或 4 个参数时,位置参数将成为一场噩梦。命名参数是冗长的。我正在考虑这样做:

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

使用动态参数(使用func_get_args()),每一秒都会转换为位置参数。

我以前从未见过这个,想知道是否有人以前做过这个,为什么/为什么不这样做?

4

3 回答 3

4

命名参数不必很冗长,至少与位置参数相比不必。您可以使用仍然很明显的缩短版本:

$st = $dbh->prepare('SELECT * FROM users WHERE username = :u AND password = :p');
$st->bindValue(':u', $username);
$st->bindValue(':p', $password);
$st->execute();
于 2009-12-07T00:59:29.283 回答
2

这是一个聪明的主意。我看到的唯一问题是如何区分 SQL 和传入的变量。除非您假设每一秒 arg 都是一个变量。我只是认为这种假设是脆弱的,并且使事情变得模糊而不是使事情变得清晰。

更好的方法可能是使用插值:

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

然后编写逻辑来插入这些。

于 2009-12-06T22:50:51.623 回答
1

我不认为位置参数那么糟糕......这是我最喜欢的方法:

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);
于 2009-12-07T01:05:40.733 回答