当处理超过3或4个参数时,位置参数变成了一场噩梦。命名参数很详细。我正在考虑这样做:
query("SELECT * FROM users WHERE username = ", $username, " AND password = ", $password)
使用动态参数(使用func_get_args()
),每隔一秒转换为位置参数。
我以前从未见过这个,想知道是否有人之前已经这样做过,为什么不这样做?
答案 0 :(得分:4)
命名参数不必冗长,至少不与位置参数进行比较。您可以使用仍然显而易见的缩短版本:
$st = $dbh->prepare('SELECT * FROM users WHERE username = :u AND password = :p');
$st->bindValue(':u', $username);
$st->bindValue(':p', $password);
$st->execute();
答案 1 :(得分:2)
这是一个聪明的主意。我看到的唯一问题是如何区分SQL和传入变量。除非你假设每秒arg都是一个变量。我只是认为这个假设是脆弱的,并且使事情变得模糊不清,而不是让它们变得清晰。
更好的方法可能是使用插值:
query("SELECT foo FROM bar WHERE id = #{id}", array("id" => "23"));
然后编写逻辑来插入这些。
答案 2 :(得分: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);