在非对象上调用成员函数

时间:2013-02-23 23:43:15

标签: php mysqli

function connect(){
$db = new mysqli(localhost, bludevel_PMI, password1, bludevel_PMIForm);
if ($db->connect_errno) {
        echo json_encode(array($mysqli->connect_error));
    return false;
        exit();
}}

function disConnect(){
mysqli_close($db);
}

function downloadData(){
if ($_POST['cmd'] == "downloadData"){

$result = $db->query("SELECT * FROM Jobs");//error on this line
if($result){

    while ($row = $result->fetch_array()){
    $jobs[$row['PMINumber']] = $row['Address'];
    }
    //$result->close();
        //$db->next_result();
}


$result = $db->query("SELECT * FROM Installers ORDER BY `Order` ASC");
if($result){

    while ($row = $result->fetch_array()){
    $installers[] = $row['Names'];
    }
    //$result->close();
        //$db->next_result();
}
echo json_encode(array($jobs, $installers));
return true;

}}

我收到错误PHP Fatal error: Call to a member function query() on a non-object 当我运行这个脚本。 $ db确实是一个对象,我已成功地在其他对象中使用它 函数,所以问题必须在函数本身内。我是php的新手,所以任何 非常感谢帮助。

2 个答案:

答案 0 :(得分:0)

您的$db变量是connect函数的本地变量。您需要使用$db的全局实例(不是一个好主意)或从函数返回变量,并在调用范围内跟踪它:

function connect() {
  $db = new mysqli(localhost, bludevel_PMI, password1, bludevel_PMIForm);
  // ...
  return $db;
} 


function disconnect($db) {
  mysqli_close($db);
}


$db = connect(...);

// Later..

disconnect($db);

答案 1 :(得分:0)

许多人已经指出了一个范围问题。

如果您出于某种原因希望坚持使用全局$db变量(绝对不是最好的方式),那么应该使用 global < / strong>关键字在所有依赖它的函数中明确定义$db的范围,如下所示:

function connect(){
    global $db;
    //your code
}

function downloadData(){
    global $db;
    //your code
}

function disConnect(){
    global $db;
    //your code
}

但更好的方法是从connect()返回$ db并将其传递给downloadData()disConnect()

function connect(){
    $db = new mysqli(...);
    ...
    return $db
}

function downloadData($db){
    ...
}

function disConnect($db){
    ...
}

$db = connect();
if (!downloadData($db)) {
    //
}
disConnect($db);