【问题标题】:Dynamic mysqli prepared statement动态 mysqli 准备好的语句
【发布时间】:2013-07-17 22:10:40
【问题描述】:

我需要帮助为动态 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);
}

【问题讨论】:

    标签: php oop mysqli prepared-statement


    【解决方案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()

    【讨论】:

      猜你喜欢
      • 2012-12-01
      • 2010-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-18
      • 2011-03-07
      相关资源
      最近更新 更多