2014-09-13 34 views
0

我很新的PHP编码,并设法自己解决很多问题,但有1我不能让我的头转过身来。警告:mysqli_stmt :: close():无法在X行上获取mysqli_stmt Y行

$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)。

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

+0

那么你可以包装在一个一个'其他{}'块,但说实话,没有显式调用来'$ stmt-> close()方法'可能是必要的。 PHP将自行清理它们。 – 2014-09-13 13:10:18

+0

@MichaelBerkowski,所以它可以安全地删除所有这些? (发布一个答案,所以我可以给一些代表:)) – Krowi 2014-09-13 13:11:37

+0

可能。如果有要读取的行,[调用'$ stmt-> close()'](http://php.net/manual/en/mysqli-stmt.close.php)释放RDBMS执行一个新的查询,但是如果你不打算在这个脚本中发出一个新的查询,这不是问题,因为PHP会在脚本终止时清除它们。另外,如果我没有记错,调用'store_result()'无论如何都避开了这个问题。 – 2014-09-13 13:14:51

回答

1

为什么你不只是删除第一个(在第二个if语句)?还请删除else声明中的close(),因为您检查了是否$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(); 
} 
相关问题