致命错误:对admin.php中第219行的非对象调用成员函数query()

致命错误:对admin.php中第219行的非对象调用成员函数query(),php,mysqli,fatal-error,Php,Mysqli,Fatal Error,我已经搜索了很多基本相同的问题,但似乎没有帮助。我已经有一段时间没有接触过php了,所以我猜有一个简单的解决方案,但我真的想不出来 config.php:(包含在admin.php中) admin.php: $sqlQuery = "INSERT INTO `category` (`id`, `name`) VALUES ('', '$_POST[name]')"; $result = $mysqli->query($sqlQuery); var_dump($result)返回: 空的 并给出了

我已经搜索了很多基本相同的问题,但似乎没有帮助。我已经有一段时间没有接触过php了,所以我猜有一个简单的解决方案,但我真的想不出来

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

admin.php:

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

空的

并给出了错误:

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


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


另外,通过使用外部变量构建SQL语句,您将面临SQL注入攻击。此外,任何带有单引号的输入数据,如“O'Malley”的名称,都将破坏您的SQL查询。请了解如何使用参数化查询(最好是PDO模块)来保护您的web应用程序。我的网站有很多例子可以帮助您入门,并且有很多详细的例子。

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


另外,通过使用外部变量构建SQL语句,您将面临SQL注入攻击。此外,任何带有单引号的输入数据,如“O'Malley”的名称,都将破坏您的SQL查询。请了解如何使用参数化查询(最好是PDO模块)来保护您的web应用程序。我的网站有很多例子可以让你开始学习,并且有很多详细的例子。

在开始时,你应该打电话给

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();

}

出发时,你应该打电话

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();

}

是否尝试过调试?请检查数据库连接。您确定$mHost、$mUser等的值正确吗?有很多代码在第219行出现错误。看起来$mysqli不再是mysqli对象了。在此之前,可能有代码以某种方式更改了$mysqli。旁注:您可能希望将
$\u POST[name]
更改为
$\u POST['name']
,但是使用这种方法会导致SQL注入。@Fred ii-您错了。。。好:
“{$\u POST['name']}”
“$\u POST[name]”
;NG:
“$\u POST['name']”
您是否尝试过调试?请检查您的数据库连接。您确定$mHost、$mUser等的值正确吗?有很多代码在第219行出现错误。看起来$mysqli不再是mysqli对象了。在此之前,可能有代码以某种方式更改了$mysqli。旁注:您可能希望将
$\u POST[name]
更改为
$\u POST['name']
,但是使用这种方法会导致SQL注入。@Fred ii-您错了。。。好:
“{$\u POST['name']}”
“$\u POST[name]”
;NG:
“$\u POST['name']”