【问题标题】:PHP PDO: Object auto-deconstructs after calling functionPHP PDO:调用函数后对象自动解构
【发布时间】:2019-04-20 17:53:23
【问题描述】:

我有一种情况,在我的 PHP 文件顶部位置创建的对象在到达该文件的 PHP 代码末尾之前被解构

File1.php

//* This is all in the same PHP file *//

<?php
    session_start();
    include 'includes/user.inc.php';

    $userOBJ = new User; //Declaring the object
?>

//*** jQuery and HTML code here ***//

<?php
    if($userOBJ->isAdmin($_SESSION['session_u-name']) == true){
        AdminControl();
    } 

    // This code gets done without any problem

    function AdminControl(){
        echo "<a id='dbControlAdmin' onclick='changeDisplayAdm()'>Database 
        Control</a>";
    }
?>

//*** More HTML and jQuery Code here ***//

<?php
   $userOBJ->getUsersName(); //The object is no longer available when reaching this code
?>

在对象类中,我有这个函数作为解构函数:

public function __destruct(){
        echo "<b style='color: red;'>Status:</b> Database Connection->Disconnect";
    }

这是通过 Object 调用的函数:

    public function isAdmin($user){
    $userToGet = $user;

    $stmt = $this->Connect()->prepare("SELECT admin_db FROM user_secure WHERE username_db=?");
    $stmt->execute([$userToGet]);
    foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
        $value = $row["admin_db"];
            if($value == 1){
                return true;
            } else {
                return false;
            }
    }
}

public function getUsersName(){
    $stmt = $this->Connect()->prepare("SELECT username_db FROM user_secure");
    $stmt->execute();

    while($row = $stmt->fetchAll(PDO::FETCH_ASSOC)){
            echo "<option value='" . $row['username_db'] . "'>" . $row['username_db'] . "</option>";
        }
}

}

当我运行网站时,左上角会出现此消息

状态:数据库连接->断开连接

该对象在__destruct函数中的指令是什么,并且网站部署了一个PHP错误,其中最后一个函数调用是:$userOBJ-&gt;getUsersName();

错误是:

注意:未定义索引:C:\wamp64\www\NewKali\includes\user.inc.php 中的 username_db 位于第 57 行

我不知道 __destruct 函数的调用位置或调用它的原因!希望你能帮助我。

感谢您的宝贵时间!

【问题讨论】:

    标签: php jquery oop object pdo


    【解决方案1】:

    将列username_db重命名为列,该列实际存在于服务器上。

    【讨论】:

    • 这个我好像不太明白,但是这个专栏确实存在于服务器中:prntscr.com/ljortv
    • @AlanMaldonado 试试print_r($row)。那可能是一个空的array0 结果没有列名。所以你需要检查sizeof($row) &gt; 0
    • 好的,所以我已经将该函数中的代码更改为:3v4l.org/8eHpI,当我运行网站时,它告诉部署:prntscr.com/ljowuz ___ 所以这意味着数组是 0 ,但我不明白为什么,因为我的表已填充,我认为查询是正确的......你觉得呢?
    • 天哪,我发现了错误...我相信我的代码中的所有内容都是正确的,但不知何故不是...
    • @AlanMaldonado 我只是想知道,为什么你使用prepare,而不使用?...查询如此简单,无需准备语句。 query 应该足够了 - 并且可能会返回结果。
    【解决方案2】:

    所有者编辑:

    我将 $row['username_db'] 更改为 $row["username_db"] 并且它起作用了...(还更改了其他一些东西)

    我在函数中的最终代码是这样的:

    public function getUsersName(){
        $stmt = $this->Connect()->prepare("SELECT * FROM user_secure");
        $stmt->execute();
    
        foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
            $value = $row["username_db"];
            echo "<option value='" . $value . "'>" . $value . "</option>";
        }
    }
    

    【讨论】:

    • 只是指出:为您所做的更改是 while($row = $stmt-&gt;fetchAll(PDO::FETCH_ASSOC)) ...foreach ($stmt-&gt;fetchAll(PDO::FETCH_ASSOC) as $row) ...。其他的变化并没有改变任何东西。您也可以将其更改为 while($row = $stmt-&gt;fetch(PDO::FETCH_ASSOC)) ...(这可能是您最初尝试做的)
    【解决方案3】:

    你设置了两次$userOBJ = new User

    【讨论】:

    • 我知道这一点,删除它什么也没做 :( 还是一样
    • 这不是要求澄清或批评,这是造成他错误的原因之一(根据他的回答,还有第二个原因)。再次设置相同的变量会调用前一个对象的析构函数。
    猜你喜欢
    • 2019-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-04
    • 1970-01-01
    • 1970-01-01
    • 2010-11-10
    相关资源
    最近更新 更多