尚不允许财产访问

Posted

技术标签:

【中文标题】尚不允许财产访问【英文标题】:Property access is not allowed yet in 【发布时间】:2018-07-27 04:34:51 【问题描述】:

我有一个简单的功能可以从我的数据库中删除帐户。我已经写了如下

public function removeAccount($email) 
    $response = array('code' => 0, 'error' => false);
    $stmt = $this->conn->prepare("SELECT id FROM user WHERE email = ?");
    $stmt->bind_param("s", $email);
    $stmt->execute();
    $result = $stmt->get_result();
    if ($result->num_rows) 
        $user   =  $result->fetch_assoc();
        $id = $user['id'];
        $stmt->close();

        $stmt = $this->conn->prepare("DELETE FROM number_list WHERE user_id = ?");
        $stmt->bind_param("i", $id);
        $stmt->execute();
        $stmt->close();

        $stmt = $this->conn->prepare("DELETE FROM number_status WHERE user_id = ?");
        $stmt->bind_param("i", $id);
        $stmt->execute();
        $stmt->close();

        $stmt = $this->conn->prepare("INSERT INTO old_user(email,serial,premium) SELECT email, device_id, membership FROM user WHERE id = ?");
        $stmt->bind_param("i", $id);
        $stmt->execute();
        $stmt->close();

        $stmt = $this->conn->prepare("DELETE FROM user WHERE id = ?");
        $stmt->bind_param("i", $id);
        $stmt->execute();
        $stmt->close();

        if ($stmt->affected_rows) 
            $response["code"] = 1;
        
    

    return $response;

它在下面的行中给我警告

if ($stmt->affected_rows) 

我已经寻找解决它的方法,但不知道什么是错误的以及什么可以解决它。请检查并让我知道是否有人可以对此有所了解。非常感谢。

【问题讨论】:

我不认为你可以在$stmt->close() 通话后使用$stmt->affected_rows。你应该在调用close()之前记录affected_rows的值。 @Nick 你是对的。非常感谢。它解决了我的问题。 【参考方案1】:
$stmt = $this->conn->prepare("DELETE FROM user WHERE id = ?");
$stmt->bind_param("i", $id);
$stmt->execute();
if($stmt->affected_rows > 0)  $response["code"] = 1; 
$stmt->close();

在这种情况下,我们检查是否有任何行被更新。作为参考,这里是 mysqli::$affected_rows 返回值的用法。

-1 - 查询返回错误;如果 execute() 已经存在错误处理,则冗余

0 - 在UPDATE 上没有更新记录,没有与WHERE 子句匹配的行或没有执行查询

大于 0 - 返回受影响的行数; SELECTmysqli_result::$num_rows 相当

【讨论】:

【参考方案2】:

您正在尝试从已关闭的语句中获取受影响的行数。 而不是

$stmt->execute();
$stmt->close();
if ($stmt->affected_rows) 
    $response["code"] = 1;

使用

$stmt->execute();
$num_affected_rows = $stmt->affected_rows;
$stmt->close();
if ($num_affected_rows) 
    $response["code"] = 1;

【讨论】:

【参考方案3】:

这个错误的原因有很多,但我今天遇到的一个是我在任何地方都没有找到记录的原因。

我有两 (2) 个相同的虚拟机副本在运行,它们都在以某种我不太理解的方式竞争,但进入 VirtualBox 并关闭其中一个解决了问题。

我知道这是一个晦涩难懂的场景,但如果其他人遇到同样的情况,我希望我的回答能阻止他们像我一样浪费时间。

【讨论】:

以上是关于尚不允许财产访问的主要内容,如果未能解决你的问题,请参考以下文章

Java 修饰符

访问另一类的财产

如何动态访问孩子的财产?

访问受保护或私有财产

从 TYPO3 v9 升级到 v10 后:显示页面不再工作(无法访问受保护的财产)

OCUnit 在私有财产上