【发布时间】: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->prepare($sql)以某种方式失败并返回null,但稍后您仍然调用->close()。如果将这个$stmt->close()移到里面 -
实际上它被调用但
$stmt为空。也许您的凭据已从本地数据库更改为远程数据库,而您尚未在代码中更改它。 -
请不要存储纯文本密码,阅读有关如何使用password_hash()
标签: php