【问题标题】:Having problems inserting and updating tables in a database with prepared statements使用准备好的语句在数据库中插入和更新表时出现问题
【发布时间】:2009-03-17 03:41:25
【问题描述】:

对 PHP5 非常陌生,但仍有一些问题。我想出了如何使用准备好的语句进行选择,现在尝试插入/更新我的代码如下

function input_lab_results($name, $image, $descrip) {
    $query = "INSERT INTO pat_table (pat_name, pat_image, pat_descrip, pat_doctor, pat_resident, pat_create, pat_modify) VALUES (?, ?, ?, ?, ?, ?, ?)";

    if($stmt = $this->conn->prepare($query)){
        $stmt->bind_param('sssiidd', $name, $image, $descrip, 0, 0, date("Ymd"), date("Ymd"));
        $stmt->execute();
        die();
    } else{
        die($this->conn->error);
    }
}

我得到的错误是

致命错误:无法通过第 43 行的引用 html/classes/mySQL.php 传递参数 4

任何帮助/参考将不胜感激。谢谢。


每个人都在提到使用 PDO,请问你们有什么好的教程或示例吗?

【问题讨论】:

  • '$descrip' 变量的值是多少?

标签: mysql mysqli php


【解决方案1】:

问题不在于$descrip;它是 0(参数 4 和 5)。解决方案是传递变量而不是整数:

 `$query = "INSERT INTO pat_table (pat_name, pat_image, pat_descrip, pat_doctor, pat_resident, pat_create, pat_modify) VALUES (?, ?, ?, ?, ?, ?, ?)";`

    $pat_doctor = 0;
    $pat_resident = 0;

    if($stmt = $this->conn->prepare($query)){
            $stmt->bind_param('sssiidd', $name, $image, $descrip, $pat_doctor, $pat_resident, date("Ymd"), date("Ymd"));`

显然 mysqli_bind_param 希望其参数作为引用,因此它会查找它们在内存中的存储位置,而不是复制它们的值。这是有道理的,因为您希望绑定到 sql 语句的某些内容(例如该图像)可能足够大,以至于您不希望有多余的副本到处乱跑。文字,字符串或其他,不能通过引用访问。见:http://us.php.net/references

我不建议将 0 硬编码到 sql 语句中,因为它会不必要地混淆您的代码。

顺便说一下,让我建议 PDO。它的语法更加健全。

【讨论】:

    【解决方案2】:

    我改成

    function input_lab_results($name, $image, $descrip) {
        $query = "INSERT INTO pat_table (pat_name, pat_image, pat_descrip, pat_doctor, pat_resident, pat_create, pat_modify) VALUES (?, ?, ?, 0, 0, ?, ?)";
    
        if($stmt = $this->conn->prepare($query)){
            $stmt->bind_param('sssdd', $name, $image, $descrip, date("Ymd"), date("Ymd"));
            $stmt->execute();
            die();
        } else{
            die($this->conn->error);
        }
    }
    

    基本上我改变了它在哪里阅读??对于查询中的整数为0我没有绑定它。

    【讨论】:

      【解决方案3】:

      不要使用bind_param - 这是一个非常不直观且容易出错的界面,它主要是来自底层 C-api 的遗留物。使用bind_value 或更好——将一组值作为参数传递给PDOStatement->execute。例如:

      $query = "INSERT INTO pat_table (pat_name, pat_image, pat_descrip, pat_doctor, pat_resident, pat_create, pat_modify) VALUES (?, ?, ?, 0, 0, ?, ?)";
      if ($stmt = $this->conn->prepare($query)) {
        $stmt->execute(array($name, $image, $descrip, date("Ymd"), date("Ymd")));
        die();
      } else {
        die($this->conn->error);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-05
        • 1970-01-01
        • 2012-08-05
        • 1970-01-01
        • 2015-09-15
        • 2011-06-21
        • 1970-01-01
        • 2021-05-18
        相关资源
        最近更新 更多