【问题标题】:Fatal error: Call to a member function query() on a non-object in admin.php on line 219致命错误:在第 219 行的 admin.php 中的非对象上调用成员函数 query()
【发布时间】:2014-02-10 06:35:12
【问题描述】:

我搜索了很多关于 SO 的基本相同的问题,但似乎没有帮助。自从我接触 php 以来已经有一段时间了,所以我猜有一个简单的解决方案,但真的无法弄清楚。

config.php:(包含在admin.php中)

$mysqli = new mysqli($mHost, $mUser, $mPass, $db);

admin.php:

$sqlQuery = "INSERT INTO `category` (`id`, `name`) VALUES ('', '$_POST[name]')";
$result = $mysqli->query($sqlQuery);

var_dump($result) 返回:

并给出错误:

致命错误:在非对象中调用成员函数 query()

【问题讨论】:

  • 您是否尝试过调试?
  • 检查您的数据库连接。您确定 $mHost、$mUser 等具有正确的值吗?
  • 您有很多代码在第 219 行出现错误。似乎 $mysqli 不再是 mysqli 对象了。也许在此之前有代码以某种方式更改了 $mysqli。
  • 旁注:您可能希望将$_POST[name] 更改为$_POST['name'],但是使用这种方法会使您面临SQL 注入。
  • @Fred-ii- 你错了...好的:"{$_POST['name']}" "$_POST[name]" ; NG:"$_POST['name']"

标签: php mysqli fatal-error


【解决方案1】:

您没有检查对new mysqli 的调用结果。如果失败,则 $mysqli 将为 null,并且不是您可以查询的有效对象。

此外,通过使用外部变量构建 SQL 语句,您将面临 SQL 注入攻击。此外,任何带有单引号的输入数据,例如“O'Malley”的名称, 会炸毁你的 SQL 查询。请了解如何使用参数化查询(最好使用 PDO 模块)来保护您的 Web 应用程序。我的网站http://bobby-tables.com/php 有一些示例可以帮助您入门,this question 有很多详细示例。

【讨论】:

    【解决方案2】:

    在出发时,你应该打电话

    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    

    这使您不必检查任何返回值,只需输入try { ... } catch { ... } 块。

    try {
    
        if (
            !isset($_POST['name'])     ||
            !is_string($_POST['name']) ||
            $_POST['name'] === ''
        ) {
            throw new UnexpectedValueException('$_POST[\'name\'] is empty');
        }
    
        $mysqli = new mysqli($mHost, $mUser, $mPass, $db);
        $stmt = $mysqli->prepare("INSERT INTO `category` (`name`) VALUES (?)");
        $stmt->bind_param('s', $_POST['name']);
        $stmt->execute();
    
        echo 'Success';
    
    } catch (Exception $e) {
    
        echo $e->getMessage();
    
    }
    

    【讨论】:

      猜你喜欢
      • 2015-02-15
      • 1970-01-01
      • 2015-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-09
      相关资源
      最近更新 更多