0

我需要帮助为动态 mysqli 准备语句创建方法。下面的代码有错误。我知道我完全不喜欢 mysqli_stmt_bind_param 的设置方式,但我想不出解决方案。我的编码风格可能很奇怪,因为我使用的是 OO php,但程序是 mysqli。自从我阅读/观看的书籍和视频使用程序 mysqli 以来,我没有时间弄清楚 OO mysqli。我为这个问题看到的大多数解决方案都使用 OO mysqli。在我花了这么多时间学习 mysqli 之后,我宁愿为此获得一个短期解决方案,而不是不得不学习 PDO。

public function create($sql, $param_type, $param){
    //param_type should be set as $param_type = "'ssss'" so that single quotes get passed into the variable
    //param should be an array
    //param array items should be escaped
    $stmt = mysqli_prepare($this->dbc, $sql);
    mysqli_stmt_bind_param($stmt, $param_type, join(array_values($param), ", "));
    $result = mysqli_stmt_execute($stmt);

    if($result){
        return true;
    } else{
        return false;
    }
    mysqli_stmt_close($stmt);
}
4

1 回答 1

1

使用 OO mysqli 很简单:

  1. 将每次mysqli_blah($this->dbc)调用更改为$this->dbc->blah().
  2. 将每次mysqli_stmt_blah($stmt)调用更改为$stmt->blah().
  3. 利润!

此外,请始终prepare()检查和的返回值execute()。当解析或执行出错时,它们返回 false,您需要检查这些并每次报告错误。

mysqli_stmt_bind_param()函数很棘手,因为它需要可变数量的参数,参数类型参数中的每个字母一个,而不是逗号分隔值的字符串。此外,它要求您通过引用传递变量,而不是标量,而不是单个数组。

  • 错误的:mysqli_stmt_bind_param($stmt, "sss", "red,green,blue");

  • 错误的:mysqli_stmt_bind_param($stmt, "sss", "red", "green", "blue");

  • 错误的:mysqli_stmt_bind_param($stmt, "sss", $param_array);

  • 正确的:mysqli_stmt_bind_param($stmt, "sss", $param1, $param2, $param3);

这使得您正在做的事情变得困难和混乱:编写一个通用函数来准备和执行具有动态参数数量的 SQL 语句。您必须使用call_user_func_array(),但必须将参数数组重写为引用数组。

我在过去的几个 SO 答案中写了一些例子:

PDO 更容易解决这个问题,你没有绑定任何东西,你只需将一个数组传递给execute().

于 2013-07-17T22:35:34.280 回答