gpt4 book ai didi

php - mysqli_query() 和 mysqli_real_escape_string() 期望参数 1 为 mysqli,给定为 null

转载 作者:行者123 更新时间:2023-11-29 11:07:15 25 4
gpt4 key购买 nike

我正在编写一个登录程序,但我陷入了这个错误,无法想出解决方案来修复它。

错误:警告:mysqli_real_escape_string() 期望参数 1 为 mysqli,对于 mysqli_query() 给出的参数为 null。我已经知道 $connection 是问题所在,因为其他帖子+错误要求 msqli 对象。

我有一个文件,您可以在其中调用函数来打开或关闭includes/controller/dbcontroller.php 中的数据库连接。其中包含以下代码。

<?php

function openDBConnection(){
//1. create database connection
define("DB_SERVER","localhost");
define("DB_USER","root");
define("DB_PASS","");
define("DB_NAME","IppaSpil");

$connection = mysqli_connect(DB_SERVER, DB_USER, DB_PASS, DB_NAME);

// test if connection occured

if(mysqli_connect_errno()){
echo "err: ".$connection;
die("Database connection failed: ".
mysqli_connect_error().
"(" . mysqli_connect_errno . ")"
);
}
}

function closeConnection(){
//close database connection
mysqli_close($connection);
}
?>

然后我有一个文件登录 Controller 来处理登录请求。该文件也位于includes/controller/LoginController.php 中。其中包含以下代码。

<?php require_once("../session.php");?>
<?php require_once("DatabaseController.php");?>
<?php require_once("../functions.php");?>
<?php require_once("../validation_functions.php");?>
<?php
openDBConnection();
if (isset($_POST['login'])) {
$username = $_POST["username"];
$password = $_POST["password"];

//validations
$required_fields = array("username", "password");
validate_presences($required_fields);

if (empty($errors)){
$found_user = attempt_login($username, $password);

if ($found_user) {
// Succesa
redirect_to("profile_page.php");
} else {
//Failure
$_SESSION["failedlogin"] = "Username or password is wrong.";
echo"wrong pass";
closeConnection();
//redirect_to("login_page.php");
}
} else{
echo $errors;
$_SESSION["errors"] = $errors;
closeConnection();
//redirect_to("login_page.php");
}
}else{
//prob get request
closeConnection();
redirect_to("login_page.php");
}
?>

此过程中的最后一个文件是函数文件。该文件包含各种功能。但其中两个对我的程序很重要。该文件位于includes/functions.php 中。这就是代码。我在这个文件中收到 2 个错误。给出错误的行用 || 标记。

    function attempt_login($username, $password) {
$admin = find_user_by_username($username);
if ($admin) {
// found admin, now check password

if (password_check($password, $admin["password"])) {

// password matches
return $admin;
} else {
// password does not match

return false;
}
} else {
// admin not found
return false;
}
}

function find_user_by_username($username) {
global $connection;

$safe_username = mysqli_real_escape_string($connection, $username); ||

$query = "SELECT * ";
$query .= "FROM user ";
$query .= "WHERE username = '{$username}' ";
$query .= "LIMIT 1;";

$user_query = mysqli_query($connection, $query); ||

confirm_query($user_query);
if($user = mysqli_fetch_assoc($user_query)) {

return $user;
} else {

return null;
}
}

我怀疑全局$connection变量无法访问,但我不知道为什么......

提前谢谢您!

最佳答案

问题是 $connection 是在函数 openDBconnection() 的范围内定义的。

即使您尝试使用

访问它
global $connection

这不起作用。

一个小测试:

<?php

function test() {
$a = "test";
return $a;
}

test(); // run it, but don't take the return
//$a = test();

function test2() {
global $a;
echo $a; // doesn't show anything - $a is NULL
}

test2();

?>

如果我取消注释 //$a = test(); 我会得到一个结果,因为现在 $a 处于全局范围内。

因此,您可以在函数 openDBconnection() 的末尾返回 $connection ,然后将其分配给脚本中的全局变量:

 // end of openDBconnection
return $connection;

// where you establish connection in your script:
$connection = openDBconnection();

但是使用全局变量并不是一个好习惯。最好将该连接传递给您的函数:

function attempt_login($username, $password, $connection) {
$admin = find_user_by_username($username, $connection);
....
}

function find_user_by_username($username, $connection) {
....
}

关于php - mysqli_query() 和 mysqli_real_escape_string() 期望参数 1 为 mysqli,给定为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41204013/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com