有没有办法让bind_param接受可变数量的参数

时间:2013-04-03 05:24:21

标签: php mysqli prepared-statement sqlbindparameter

我正在尝试为PHP创建一个mysql查询包装函数,现在我正在尝试使用预处理语句,因为它们显然是在SQL中进行MySQL查询的最佳方式,到目前为止这就是我所拥有的

public function run_query($query)
{
    $arguments = $query['arguments'];
    $prep = $this->connection->prepare($query['query'])
    $dtString = '';

    foreach($arguments as $_field => $_argument)
    {
        $dtString .= array_keys($_argument);
    }
}

$query的结构就像这样

$query =    array( "query" => QUERY,
                  "arguments" => array(FIELD => array(DATATYPE => VALUE)))

以及$query可能是什么的例子

$query =    array( "query" => "SELECT * FROM table_1 WHERE active = ? AND group = ?",
                  "arguments" => array("active" => array("i" => 1),
                                       "group" => array("i" => 17)))

现在你可以看到,我正在尝试做的是让我的函数允许任何查询,无论查询是什么以及你想要使用多少个参数。

现在在我的函数中,for each之后的下一步是使用$prep->bind_param($dtString, [VALUES]);但是我读到每个值都是函数中的一个单独的参数,它有点混乱

我想知道是否有办法让我的函数bind_param接受可变数量的参数

我目前的解决方案是创建另一个函数,将$ arguments作为参数传递给函数,将每个函数移动到新函数中,然后在创建$dtString后计算它的大小并设置一个只有多个bind_param但具有不同数量的参数,例如

switch($count)
{
    case 1:
        $prep->bind_param($dtString, $array[0]);
        break;
    case 2:
        $prep->bind_param($dtString, $array[0], $array[1]);
        break;
    case 3:
        $prep->bind_param($dtString, $array[0], $array[1], $array[2]);
        break;
}

但我宁愿避免编写像这样的代码

1 个答案:

答案 0 :(得分:1)

如果你只想坚持原生预备陈述,PDO是唯一的[理智]选择 不知道你的函数打算返回什么,但假设查询中的所有数据:

public function run_query($query, $params)
{
    $stm = $this->connection->prepare($query)
    $stm->execute($params);
    return $stm->fetchAll();
}

$query = "SELECT * FROM table_1 WHERE active = ? AND group = ?";
$data  =  $db->run_query($query, array(1, 17));