【问题标题】:What am I doing wrong to get this fatal error我在做什么错才能得到这个致命错误
【发布时间】:2011-11-11 16:15:20
【问题描述】:

我的代码:

<?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;
    }


} 


?>

错误:

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

【问题讨论】:

标签: php mysqli fatal-error


【解决方案1】:

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

尝试使用

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

【讨论】:

    【解决方案2】:

    您正在尝试从函数内访问在全局范围内创建的变量。

    要么将$conn 变量作为参数传递给函数(这是首选选项),要么使用global keyword 将其导入函数的作用域。

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

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

    ...或者这个... (不太好)

    function validate_details ($user, $pass) {
      global $conn;
      // function code goes here
    }
    

    将连接对象作为参数传入的原因有很多,但这里有几个:

    • 这意味着您可以在同一个脚本中使用多个连接来使用您的函数
    • 这意味着您可以在其他脚本中轻松回收未修改的函数
    • 如果在某些时候您需要在全局范围内重命名 $conn 变量,您不必担心在函数中更改它

    我想还值得一提的是 $GLOBALS 数组 - 这是一个 superglobal(即它随处可用),您可以使用它,但实际上这与 global 关键字没有太大区别,应该通常出于相同的原因避免使用。

    你可以这样使用它:

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

    【讨论】:

    • 很好的彻底修订 DaveRandom
    • ...我们的目标是取悦...并且仅供参考,我只是做了一些可能有点混乱的小更正。
    【解决方案3】:

    使用global $conn。否则它将无法正常工作。 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-25
      • 1970-01-01
      • 1970-01-01
      • 2017-09-18
      • 2019-10-08
      • 2017-09-29
      • 1970-01-01
      相关资源
      最近更新 更多