【问题标题】:Call to a member function close() on null [duplicate]在 null 上调用成员函数 close() [重复]
【发布时间】:2018-12-06 08:05:33
【问题描述】:

为一个学校项目做一个用户创建页面。

代码在使用 localhost 时运行良好,但在将其上传到 Web 主机时出现标题错误。

错误在“$stmt->close();”我相信它没有被调用,但不确定为什么它在我的系统内部工作。

<?php

/* entering localhost config instead
require_once "config.php"; 
*/

define('DB_SERVER', 'localhost');
define('DB_USERNAME', 'root');
define('DB_PASSWORD', '');
define('DB_NAME', 'users');

$mysqli = new mysqli(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);

if($mysqli === false){
die("ERROR: Could not connect. " . $mysqli->connect_error);
}

$username = $password = $confirm_password = "";
$username_err = $password_err = $confirm_password_err = "";

if($_SERVER["REQUEST_METHOD"] == "POST"){

if(empty(trim($_POST["username"]))){
    $username_err = "Please enter a username.";
} else{
    $sql = "SELECT id FROM users WHERE username = ?";
    
    if($stmt = $mysqli->prepare($sql)){
        $stmt->bind_param("s", $param_username);
        $param_username = trim($_POST["username"]);
        
        if($stmt->execute()){
            $stmt->store_result();
            
            if($stmt->num_rows == 1){
                $username_err = "This username is already taken.";
            } else{
                $username = trim($_POST["username"]);
            }
        } else{
            echo "Something went wrong.";
        }
    }

    $stmt->close();
}

if(empty(trim($_POST["password"]))){
    $password_err = "Please enter a password.";     
} elseif(strlen(trim($_POST["password"])) < 6){
    $password_err = "Password must have atleast 6 characters.";
} else{
    $password = trim($_POST["password"]);
}

if(empty(trim($_POST["confirm_password"]))){
    $confirm_password_err = "Please confirm password.";     
} else{
    $confirm_password = trim($_POST["confirm_password"]);
    if(empty($password_err) && ($password != $confirm_password)){
        $confirm_password_err = "Password did not match.";
    }
}

if(empty($username_err) && empty($password_err) && empty($confirm_password_err)){
    
    $sql = "INSERT INTO users (username, password) VALUES (?, ?)";
     
    if($stmt = $mysqli->prepare($sql)){
        $stmt->bind_param("ss", $param_username, $param_password);

        $param_username = $username;
        $param_password = password_hash($password, PASSWORD_DEFAULT); 
        
        if($stmt->execute()){
            header("location: login.php");
        } else{
            echo "Something went wrong.";
        }
    }
     
    $stmt->close();
}

$mysqli->close();
}
?>

已解决

愚蠢的错误

二手

declare(strict_types=1); 
error_reporting(-1); 
ini_set('display_errors', 'true');
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

发现这只是 db 配置文件中的字符错误。很抱歉浪费您的时间。

顺便说一句 - 密码在数据库中经过哈希处理。

【问题讨论】:

  • 也许您的$mysqli-&gt;prepare($sql) 以某种方式失败并返回null,但稍后您仍然调用-&gt;close()。如果将这个$stmt-&gt;close()移到里面
  • 实际上它被调用但$stmt为空。也许您的凭据已从本地数据库更改为远程数据库,而您尚未在代码中更改它。
  • 请不要存储纯文本密码,阅读有关如何使用password_hash()

标签: php


【解决方案1】:

您写道:if($stmt = $mysqli-&gt;prepare($sql)){ 如果条件不匹配 $sdmtp 将 ne null 因此您的 $stmt-&gt;close(); 将失败。

将$stmt-&gt;close(); 行移动到您的 if 执行块中。

您面临的另一个问题是您对您的代码确实在开发系统(非本地主机)上产生此错误这一事实感到困惑。这可能是由开发系统上$mysqli-&gt;prepare($sql) 中的异常引起的。

【讨论】:

    猜你喜欢
    • 2015-10-26
    • 2016-05-22
    • 2016-06-27
    • 1970-01-01
    • 2022-01-08
    • 2017-02-23
    • 1970-01-01
    • 2016-12-15
    • 1970-01-01
    相关资源
    最近更新 更多