我做错了什么导致这个致命错误


What am I doing wrong to get this fatal error

我的代码:

<?php
$conn = new MySQLi("localhost", "root", "", "barman");
function validate_details($user, $pass){
$sql = "SELECT * FROM users";
$result = $conn->query($sql);
    if($user==$row->user && isset($user)){
        if($pass == $row->pass && isset($pass)){
            return true;
        }
    }else{
        return false;
    }

} 

?>

错误:

致命错误:在C:'xampp'htdocs'barman'assets'login'functions.php第8行调用非对象的成员函数query()(第8行是$result = $conn->query($sql);)

你不能在函数之外使用变量或对象,除非是全局设置的。

尝试使用

function validate_details($user, $pass){
    global $conn;
    ......................
}

您试图从函数内部访问在全局作用域中创建的变量。

$conn变量作为参数传递给函数(这是首选选项),或者使用global关键字将其导入函数的作用域。

你可以这样做:(首选选项)

function validate_details ($conn, $user, $pass) {
  // function code goes here
}
// Call the function like this
$result = validate_details($conn, 'myuser', 'mypass');

…或者这个……(not so good)

function validate_details ($user, $pass) {
  global $conn;
  // function code goes here
}
有很多原因可以更好地将连接对象作为参数传入,但这里有几个:
  • 这意味着你可以在同一个脚本中使用多个连接来使用你的函数
  • 这意味着您可以很容易地在其他脚本中不加修改地回收该函数
  • 如果在某些时候你需要在全局作用域中重命名$conn变量,你不必担心在
  • 函数中更改它。

我想它也值得一提的$GLOBALS数组-这是一个超全局(即它在任何地方都可用),你可以使用,但在实践中,这与global关键字没有太大的不同,通常应该避免出于同样的原因。

你可以这样使用:

function validate_details ($user, $pass) {
  // ...
  $result = $GLOBALS['conn']->query($sql);
  // ...
}

使用global $conn。否则它将不起作用。:)