警告:mysqli_stmt :: close():无法在Y行的X中获取mysqli_stmt

时间:2014-09-13 13:05:35

标签: php mysqli

我对php编码很新,并设法自己解决了很多问题,但有1个我无法理解。

$prep_stmt = "SELECT id FROM members WHERE Email = ? LIMIT 1";
$stmt = $mysqli->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
        $error_msg .= '<p class="error">A user with this Email address already exists.</p>';
        $stmt->close();
    }
            $stmt->close();
} else {
    $error_msg .= '<p class="error">Database error Line 39</p>';
            $stmt->close();
}

我的猜测是代码无法到达上面代码中的第二个$stmt->close();(if中if之后的代码)。

如何解决此问题?真的需要$stmt->close();吗?

3 个答案:

答案 0 :(得分:2)

为什么你不删除第一个(在第二个if语句中)?同时删除close()语句中的else,因为您检查了$stmt是否为合法对象。基本上你说的是:$stmt不是合法对象,关闭它。但接近什么?

这适用于以下两种情况:

$prep_stmt = "SELECT id FROM members WHERE Email = ? LIMIT 1";
$stmt = $mysqli->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
        $error_msg .= '<p class="error">A user with this Email address already exists.</p>';
        //Remove this one: $stmt->close();
    }
    $stmt->close();
} else {
    $error_msg .= '<p class="error">Database error Line 39</p>';
    //This one can be removed because $stmt isn't a legal object: $stmt->close();
}

答案 1 :(得分:0)

只需删除if语句和close()方法调用即可。为什么将它添加到代码中?

出现此错误的原因是,您尝试在创建失败的情况下关闭语句。您无法关闭从未创建的对象。如果prepare()调用失败,并且您的错误报告已静音,则此函数将返回false而不是对象。

如果启用正确的错误报告,则不应有if条语句。参见How to get the error message in MySQLi?

这是您的代码的外观:

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

// check existing Email
$stmt->bind_param('s', $Email);
$stmt->execute();
$result = $stmt->get_result();

if ($result->fetch_assoc()) {
    // A user with this Email address already exists
    $error_msg .= '<p class="error">A user with this Email address already exists.</p>';
}

尽量避免使用store_result()。启用错误报告后,就没有理由使用任何if语句了。否则,您将需要在这样的语句中包装每一行,因为这些调用中的任何一个都可能失败:prepare()bind_param()execute(),...

如果获取所有结果,则无需关闭语句。调用get_result()时,您将从MySQL获取所有内容。

保持简单,不要添加不必要的代码。

答案 2 :(得分:-1)

您应该像下面这样在执行后放置store_result()

$stmt->execute();
$stmt->store_result();

如果您创建方法并传递查询,它将无法正常工作