动态mysqli准备声明

时间:2013-07-17 22:10:40

标签: php oop mysqli prepared-statement

我需要帮助为动态mysqli预处理语句创建方法。以下代码有错误。我知道我完全偏离mysqli_stmt_bind_param的设置方式,但我无法找到解决方案。我的编码风格可能很奇怪,因为我使用的是OO php,但程序性的mysqli。我没有时间弄清楚OO mysqli,因为我阅读/观看的书籍和视频使用程序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);
}

1 个答案:

答案 0 :(得分:1)

使用OO mysqli很简单:

  1. 将每次mysqli_blah($this->dbc)来电更改为$this->dbc->blah()
  2. 将每次mysqli_stmt_blah($stmt)来电更改为$stmt->blah()
  3. 利润!
  4. 此外,始终检查prepare()execute()的返回值。当解析或执行出错时,它们会返回false,您需要检查这些错误并每次报告错误

    mysqli_stmt_bind_param()函数很棘手,因为它需要可变数量的参数,一个用于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(),但必须将参数数组重写为引用数组。

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

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