php 无法使用mysqli_stmt_bind_param [duplicate]绑定包含@字符的字符串

oalqel3c  于 2022-12-10  发布在  PHP
关注(0)|答案(1)|浏览(98)

此问题在此处已有答案

mysqli bind_param() expected to be a reference, value given(3个答案)
4小时前关门了。
我的数据库类有一个问题。我有一个方法,它接受一个预处理语句和任意数量的参数,将它们绑定到语句,执行语句并将结果格式化为多维数组。一切都很好,直到我尝试在其中一个参数中包含一个电子邮件地址。电子邮件包含一个@字符,这个字符似乎破坏了一切。当我提供参数时:

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

我得到错误:
警告:mysqli_stmt_bind_param()的参数3应为引用,值在第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正在将参数转换为合并中的字符串,请将其更改为&$parameters,以使其保持引用
所以我尝试了那个(方法的第3行),但它没有做任何区别。
我应该怎么做?有没有更好的方法来做这个没有调用_用户_函数_数组?

wlp8pajw

wlp8pajw1#

我在Zend Framework的MySQLi适配器中编写了参数绑定代码。我发现MySQLi的参数绑定API很难使用。需要引用的不是数组,而是数组的 * 每个元素 *。
您可以看到我在这个类的_execute()方法中编写的代码:http://framework.zend.com/svn/framework/standard/trunk/library/Zend/Db/Statement/Mysqli.php
我建议你看看PDO,它更容易使用。你可以绑定参数,但是把参数值数组作为一个数组传递给PDOStatement的execute()方法会更容易。

相关问题