首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向PDO传递参数的好方法

问向PDO传递参数的好方法
EN

Stack Overflow用户
提问于 2009-12-07 06:48:23
回答 3查看 1.6K关注 0票数 2

当处理3个或4个以上的参数时,位置参数就成了一个噩梦。命名参数是冗长的。我正在考虑这样做:

代码语言:javascript
复制
query("SELECT * FROM users WHERE username = ", $username, " AND password = ", $password)

使用动态参数(使用func_get_args()),每隔一段时间就转换成一个位置参数。

我以前从未见过这种情况,我想知道以前是否有人这样做过,为什么/为什么没有?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-12-07 06:50:52

这是个聪明的主意。我看到的唯一问题是如何区分SQL和传入的变量。除非你假设每隔一秒arg就是一个变量。我只是认为这种假设是脆弱的,它使事情变得更加混乱,而不是让它们变得清晰。

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

代码语言:javascript
复制
query("SELECT foo FROM bar WHERE id = #{id}",  array("id" => "23"));

然后编写逻辑来对这些进行插值。

票数 2
EN

Stack Overflow用户

发布于 2009-12-07 08:59:29

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

代码语言:javascript
复制
$st = $dbh->prepare('SELECT * FROM users WHERE username = :u AND password = :p');
$st->bindValue(':u', $username);
$st->bindValue(':p', $password);
$st->execute();
票数 4
EN

Stack Overflow用户

发布于 2009-12-07 09:05:41

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

代码语言:javascript
复制
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);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1856915

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档