【问题标题】:What's wrong with my code? I'm having an error to call undefined method mysqli::error()我的代码有什么问题?我在调用未定义的方法 mysqli::error() 时出错
【发布时间】:2019-01-13 17:31:31
【问题描述】:

我遇到了一个错误

致命错误:未捕获的错误:调用未定义的方法 mysqli::error() in C:\xampp\htdocs\dentalclinic\edit-index.php:83 堆栈跟踪:#0 {main} 抛出

在这一行

$mysqli->query("DELETE from schedule WHERE patient_id=$patient_id") or die($mysqli->error());

我不断将die($mysqli->error()) 更改为此$mysqli->error,但又遇到了另一个错误

您的 SQL 语法有错误;查看与您的 MariaDB 服务器版本相对应的手册,了解在附近使用的正确语法

我也把我的代码改成这个

$mysqli->query("DELETE from schedule WHERE patient_id='$patient_id'") or die($mysqli->error); 

因为我注意到我没有在 $patient_id 中添加任何单引号,并且出现另一个错误提示

“where 子句”中的未知列“患者 ID”

下面是我的全部代码

<?php
  $mysqli= new mysqli('localhost','root','','databasename') or 

  die(mysqli_error($mysqli));

  if(isset($_GET['delete'])){

    $mysqli->query("DELETE from schedule WHERE patient_id='$patient_id'") or die($mysqli->error);

  }

我的结果假设是删除我要在我的表中删除的行,并将读取 patient_id 并给出其给定的 id。

【问题讨论】:

    标签: php sql mysqli


    【解决方案1】:

    您已成为误解和谎言的受害者。有人告诉您检查 MySQL 错误,您尝试使用or die($mysqli-&gt;error());。事实上这是you should NEVER do!

    如果您打开错误报告,MySQLi 可以自动告诉您什么是错误的。把这一行放在$mysqli= new mysqli()之前就行了

    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    

    此外,您不应该将变量连接到 SQL 查询中。使用准备好的语句。

    您的固定代码应如下所示。

    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    $mysqli = new mysqli('localhost', 'root', '', 'databasename');
    $mysqli->set_charset('utf8mb4');
    
    if (isset($_GET['delete'])) {
        $stmt = $mysqli->prepare('DELETE from schedule WHERE patient_id=?');
        $stmt->bind_param('s', $patient_id);
        $stmt->execute();
    }
    

    【讨论】:

      【解决方案2】:

      出了什么问题:

      您的 $mysqli object 未能正确初始化。很可能是由于身份验证或连接问题。

      为什么这个错误不明显?

      因为您没有在 PHP 代码中设置正确的错误输出 OR 语句。您在 object 实例上使用了 procedural 语句。

      die(mysqli_error($mysqli));
      

      我该如何解决这个问题?

      您需要阅读PHP Manaul for mysqli_error 并调整您的代码以适应收到object 错误消息,而不是*procedural 错误消息。这两种样式在同一个变量上不可互换。

      因此:

      die ("DB Error: ". $mysqli->error);
      

      但我还是不明白怎么了?

      您需要read your PHP Error log。这对于发现和解决这些问题非常宝贵。

      如果需要,将以下行添加到 PHP 页面的最顶部(仅在开发中)

      <?php
      error_reporting(E_ALL); // add this line. Development only. 
      

      其他建议:

      祝你好运。


      固定代码:

      <?php
       $mysqli = new mysqli('localhost','root','','databasename');
       if (!$mysqli) {
           error_log('Connect Error (' . mysqli_connect_errno() . ') ' . mysqli_connect_error()); 
           die("A critical error was encountered. Check the logs.");
        }
      
        if(isset($_GET['delete'])){
           $mysqli->query("DELETE FROM schedule WHERE patient_id='".$patient_id."'") or error_log(print_r($mysqli->error,true));
      
        }
      

      使用准备好的语句:

      <?php
       $mysqli= new mysqli('localhost','root','','databasename') or error_log('Connect Error (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error);
       if(!is_object($mysqli)){
           die("A critical error was encountered. Check the logs.");
      }
      
        if(isset($_GET['delete'])){
           $stmt = $mysqli->prepare("DELETE FROM schedule WHERE patient_id=? ") or error_log(print_r($mysqli->error,true));
           $stmt->bind_param("i", $patient_id); //maybe s instead of i if a string.
           $stmt->execute();
      
        }
      

      【讨论】:

      • 你不能使用$mysqli-&gt;error,因为这个对象还不存在。除此之外还有什么好处?无论如何,您应该会在屏幕上收到警告。
      • @Dharman 答案是向 OP 展示如何解决他们的问题。我的“固定代码”的哪一部分是错误的?此外,永远不要将错误输出到屏幕上,这简直是糟糕的做法!
      • 我的意思是你的代码有错误。我不建议显示错误消息。如果构造函数失败,将没有对象可用于从中读取消息。
      • 构造函数以一种或另一种方式抛出警告,因此附加这样的错误处理程序几乎没有意义。如果您真的想知道错误消息,您可以在赋值后从对象中获取它,但通过另一个名为 connect_error 的属性
      • @Dharman 啊,好的,我明白你现在指出了什么,我已经更新了我的最终答案。
      猜你喜欢
      • 2013-07-12
      • 1970-01-01
      • 1970-01-01
      • 2015-10-12
      • 1970-01-01
      • 1970-01-01
      • 2012-08-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多