无法将包含@ char的字符串与mysqli_stmt_bind_param绑定

时间:2010-05-29 16:49:41

标签: php mysqli prepared-statement sqlbindparameter array-merge

我的数据库类有问题。我有一个方法,它接受一个预准备语句和任意数量的参数,将它们绑定到语句,执行语句并将结果格式化为多维数组。 Everthing工作正常,直到我尝试在其中一个参数中包含电子邮件地址。电子邮件包含一个@字符,而且似乎打破了所有内容。 当我提供参数时:

$types = "ss" and $parameters = array("email@domain.com", "testtest")

我收到错误:

  

警告:参数3到   mysqli_stmt_bind_param()期待   作为参考,给出的价值   ...第63行的db / Database.class.php

以下是方法:

private function bindAndExecutePreparedStatement(&$statement, $parameters, $types) {
    if(!empty($parameters)) {
        call_user_func_array('mysqli_stmt_bind_param', array_merge(array($statement, $types), &$parameters));
        /*foreach($parameters as $key => $value) {
            mysqli_stmt_bind_param($statement, 's', $value);
        }*/
    }

    $result = array();

    $statement->execute() or debugLog("Database error: ".$statement->error);

    $rows = array();

    if($this->stmt_bind_assoc($statement, $row)) {
        while($statement->fetch()) {
            $copied_row = array();
            foreach($row as $key => $value) {
                if($value !== null && mb_substr($value, 0, 1, "UTF-8") == NESTED) { // If value has a nested result inside
                    $value = mb_substr($value, 1, mb_strlen($value, "UTF-8") - 1, "UTF-8");
                    $value = $this->parse_nested_result_value($value);
                }
                $copied_row[$ke<y] = $value;
            }
            $rows[] = $copied_row;
        }
    }

    // Generate result
    $result['rows'] = $rows;
    $result['insert_id'] = $statement->insert_id;
    $result['affected_rows'] = $statement->affected_rows;
    $result['error'] = $statement->error;

    return $result;
}

我有一个建议:

  

array_merge是强制转换参数   要在合并中将字符串更改为   &amp; $参数因此它仍然是参考

所以我尝试了(方法的第3行),但它没有任何区别。

我该怎么办?没有call_user_func_array,还有更好的方法吗?


更新:我找到了解决此问题的不太好的方法。我所做的是创建一个带循环的新参考数组,然后使用它。

private function bindAndExecutePreparedStatement($statement, $parameters, $types)
{
    if(!empty($parameters)) {
        $parameters_references = array();
        foreach($parameters as $key => $parameter) {
            $parameters_references[] = &$parameters[$key]; 
        }
        call_user_func_array('mysqli_stmt_bind_param', 
            array_merge(array($statement, $types), $parameters_references)); 
    } 
    .... 

我仍然有兴趣用PDO来解决这个问题,我觉得它还有许多其他功能。我还没学会使用它。

1 个答案:

答案 0 :(得分:1)

我在Zend Framework的MySQLi适配器中编写了参数绑定代码。我发现MySQLi的参数绑定API很难使用。这不是需要作为参考的数组,而是数组的每个元素

您可以在此类的_execute()方法中看到我编写的代码: http://framework.zend.com/svn/framework/standard/trunk/library/Zend/Db/Statement/Mysqli.php

我建议您查看PDO。它更容易使用。您可以绑定参数,但将参数值数组作为数组传递给PDOStatement的execute()方法更容易。