我收到一个错误(非常明显的错误)
在非对象上调用成员函数bind_param()。。。
我想检查用户在验证他的信息时是否提供了他的信息。如果不是,这是一个成功的回声,但如果是,那么我会得到错误。。。我的php代码:
<?php
if(isset($_POST['configured'])){
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$username = $_SESSION['username'];
$stmt = $mysqli->prepare("SELECT gender FROM members WHERE username = ?");
$stmt->bind_param('s', $username);
$stmt->bind_result($gender);
$stmt->execute();
while ($stmt->fetch()){
if(empty($gender)){
echo "<font color='#DB4D4D'>Verification failed! Please provide your information and try again...</font>";
} else {
$_POST['configured'] = 1;
$sql = "
UPDATE members
SET configured = ?
WHERE username = ?
";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('ss', $_POST['configured'], $_SESSION['username']); // This is the error line
$ok = $stmt->execute();
if ($ok == TRUE) {
echo "<p><font color='#00CC00'>Your information has been verified.</font><p>
<form action='index.php'> <input type='submit' class='buttondiv' value='Continue to Home Page'>";
} else {
echo "Error: " .$stmt->error;
}
}
}
}
?>
问题出在哪里?
BTW:错误行本身并没有错。。肯定还有其他事情在发生…
您需要将session_start()
添加到页面顶部。绑定失败,因为没有$_SESSION['username']
mysqli->prepare()返回FALSE,因此$stmt->bind_param()实际上类似于FALSE->bind_paam(),FALSE不是一个对象,而是一个布尔值(不是PHP中的对象),因此错误消息Call to a member function bind_param() on a non-object
由于各种原因,mysqli->prepare()失败总是一种选择
因此总是检查返回值。
$stmt = mysqli_prepare(...);
if ( !$stmt ) {
trigger_error( __LINE__ . ': '.print_r($mysqli->error_list, true), E_USER_ERROR );
}
与大多数其他mysqli函数/方法相同,bind_param()、execute()。。。始终检查返回值。如果是FALSE或NULL,则表示出现了问题
简而言之:添加错误处理!
让我们稍微压缩一下你的脚本:
$stmt->execute();
while ($stmt->fetch()){
...
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('ss', $_POST['configured'], $_SESSION['username']);
$ok = $stmt->execute();
您在$stmt中有一个(活动)语句,您试图在循环中"覆盖"该语句
a) while ($stmt->fetch())
的下一次迭代会做什么
b) mysql不起作用;每个连接只有一个活动语句。
根据我的说法,你应该替换:
$stmt->bind_param('ss', $_POST['configured'], $_SESSION['username']);
$stmt->bind_param('s', $_POST['configured']);
$stmt->bind_param('s', $_SESSION['username']);