多次调用bind_param的方法

时间:2013-06-16 08:26:13

标签: php mysql pdo sqlbindparameter

我正在尝试构建一个带有2个参数的函数:一个表名和一个params列表,并构建一个SELECT查询。

以下是一个例子:

$params['user'] = 'myTestUsername';
$params['pass'] = 'myTestPassword';
echo $dbCon->countBy('users', $params);

这应该构建(并执行)此查询:

SELECT * FROM users WHERE user='myTestUsername' AND pass='myTestPassword'

然后返回所选行的数量......

我有这两种方法:

1)主要方法(应该发生SQL魔法):

public function countBy($table, $params) {
    $query = $this->buildQuery($table, $params);

    $mySelect = $this->dbh->prepare($query);
    $params = array_merge(array(count($params)), array_values($params));
    call_user_func_array(array(&$mySelect, 'bind_param'), $params);

    if ($mySelect) {
        $mySelect->execute();
        return $mySelect->rowCount();  
    }
    return 0;
}

2)使用给定参数构建查询的方法:

public function buildQuery($table, $params) {
    $i = 0;
    $where = '';

    if (count($params) > 0) {
        $query = 'SELECT * FROM ' . $table . ' WHERE ';
        foreach(array_keys($params) as $pList) {
            $i++;
            $where .= $pList . '=?' . ($i<count($params) ? ' AND ' : '') ;
        }
        $query .= $where;

        // output is like : SELECT * FROM users WHERE user=? AND pass=?

        return $query;
    }
    return null;
}

第二种方法效果很好,但我在第一种方法上遇到了一些问题。它与使用“ call_user_func_array ”方法有关。

我真的不明白我做错了什么......有什么想法吗?

call_user_func_array的“解决方案”取自here,但我不确定这一部分:

$params = array_merge(array(str_repeat('s', count($params))), array_values($params));

在我的代码中,我尝试使用它:

$params = array_merge(array(count($params)), array_values($params));

但仍然没有...

2 个答案:

答案 0 :(得分:3)

使用PDO,绑定工作有点不同:

$mySelect = $this->dbh->prepare($query);
if ($mySelect) {
    $mySelect->execute(array_values($params));
    return $mySelect->rowCount();
}

答案 1 :(得分:0)

bind_parammysqli对象的方法,对于PDO,它被称为bindParam,并且它不会同时接受多个参数。您必须遍历$params并单独添加它们。