【问题标题】:Fatal errir : Uncaught Error: Call to a member function close() on [duplicate]致命错误:未捕获的错误:在 [重复] 上调用成员函数 close()
【发布时间】:2018-12-18 12:03:09
【问题描述】:

错误:

致命错误:未捕获的错误:调用成员函数 close() on C:\xampp\htdocs\Project\script\register.php:69 中的布尔值

堆栈跟踪:#0 C:\xampp\htdocs\Project\index.php(2): include_once() #1 {main} 在 C:\xampp\htdocs\Project\script\register.php 中抛出在线69

当我传递通过验证的正确数据时发生错误。

文件:

<?php 
include_once 'functions.php';
include_once 'dbconnect.php';
// Returns the request method used to access the page
if ($_SERVER["REQUEST_METHOD"] == "POST"){
    $err="";


// Validation .... 
 .....
// End of it

 $prep_stmt = "SELECT id FROM members WHERE email = ? LIMIT 1";
$stmt = $sql_db->prepare($prep_stmt);

// check existing email  
if ($stmt) {
    $stmt->bind_param('s', $email);
    $stmt->execute();
    $stmt->store_result();

    if ($stmt->num_rows == 1) {
        // A user with this email address already exists
        $err .= '<p class="error">A user with this email address already exists.</p>';
                    $stmt->close();
    }
} else {
    $err .= '<p class="error">Database error Line 39</p>';
            $stmt->close();
}

// check existing username
$prep_stmt = "SELECT id FROM members WHERE username = ? LIMIT 1";
$stmt = $sql_db->prepare($prep_stmt);

if ($stmt) {
    $stmt->bind_param('s', $username);
    $stmt->execute();
    $stmt->store_result();

            if ($stmt->num_rows == 1) {
                    // A user with this username already exists
                    $err .= '<p class="error">A user with this username already exists</p>';
                    $stmt->close();
            }
    } else {
            $err .= '<p class="error">Database error line 55</p>';
            $stmt->close();
    }

// Hashing, salting and inserting the values.
   ....
// End of file.

搜索了一些答案,为什么会出现问题,但什么也没找到。

Another thread like this - $stmt->close() 在 if 函数中。

【问题讨论】:

  • 想想 - 你运行if ($stmt)...所以如果失败并进入else 那么它一定意味着$stmtfalse...即一个 boolean 就像错误消息所说的那样。那么,您如何在布尔值上调用方法(在您的情况下为->close())?微不足道,我们可以看到它没有任何意义。 (如果语句失败,无论如何也没有什么可以关闭的......所以你只是不需要那条线)。然后接下来你需要找出为什么语句失败了。

标签: php mysql


【解决方案1】:
if ($stmt) {
    $stmt->bind_param('s', $email);
    $stmt->execute();
    $stmt->store_result();

    if ($stmt->num_rows == 1) {
        // A user with this email address already exists
        $err .= '<p class="error">A user with this email address already exists.</p>';
                    $stmt->close();
    }
} else {
    $err .= '<p class="error">Database error Line 39</p>';
    // Remove this. $stmt does not exist here due to your if/else condition
    //$stmt->close();  
}

【讨论】:

  • "$stmt 不存在"...严格来说并非如此。从某种意义上说,您是对的,它不是 mysqli Statement 对象。但实际上$stmtfalse(因此在错误消息中引用了布尔值)
  • @ADyson 当然可以,但是如果 OP 不了解这个基本逻辑,那么就不值得深入讨论。
  • OTOH 同样没有理由给他们稍微不准确的信息,这可能会进一步混淆他们......特别是因为它直接与他们看到的错误消息相关 - 错误谈论一个布尔值,而不是一个未定义的变量。你可以花两秒钟纠正你的评论,然后你的问题是 100% 准确的。理解代码就是关于精确的细节——这真的是我的观点。 false 的东西和不存在的东西不是同一个状态。
猜你喜欢
  • 2022-01-21
  • 1970-01-01
  • 2020-02-15
  • 2018-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
相关资源
最近更新 更多