Bind_param致命错误PHP SQL

时间:2017-01-26 07:37:03

标签: php html mysql

我对PHP和SQL一起工作的主题非常新,到目前为止,除了更新SQL数据库中的数据库行外,我一直很好。我正在使用我的讲师代码的一部分,做练习和我自己的任务来修改网页和行为。

此代码的目的是更新我已设置的文章,因此我可以编辑标题或代码,然后单击确认,但是当我这样做时,我收到失败的返回消息,告诉我它无法绑定我的参数。我经常在使用其他语言传递参数时遇到麻烦,我一直在寻找和测试这几个小时,我希望能够获得有关该主题的一些信息和指导。

我想要做的就是更新articletext和articletitle字段。在数据库上还有另外3个字段blogID,blogtime,blogposter,不需要更改。

如果你查看底部的RESULT,你会看到变量确实有信息,但没有更新到数据库,而是在bind_param部分期间进程崩溃。

我的编辑文章代码部分:

<?php
$db=createConnection();
// get the first two articles
$sql = "select blogID,articletitle,articletext,blogtime,
                    blogposter,username,userid 
        from blogarticle 
            join registerdemo on blogposter = userid where blogID=?";

$stmt = $db->prepare($sql);
$stmt->bind_param(i,$article);
$stmt->execute();
$stmt->store_result();
$stmt->bind_result($articleid,$articletitle,$articletext,$blogtime,
                    $blogposter,$username,$userid);

//build article html
while($stmt->fetch()) {
	echo "<article id='a$articleid'>
			<h1>$articletitle</h1>
			<p>".nl2br($articletext)."</p>
			
			
			<footer><p>Posted on <time datetime='$blogtime'>$blogtime</time> by <em>$username</em></p></footer>";

	// if user is logged in and not suspended add comment button
	if($currentuser['userlevel']>2 || ($currentuser['userid']==$userid && $currentuser['userlevel']>1)) {
		?> <form method='post' action='applychanges.php'>
			<input type="hidden" name="articleid" id="articleid" size="30" value="<?php echo $articleid; ?>"/><br />
			<input type="text" name="articletitle" id="articletitle" size="30" required value="<?php echo $articletitle; ?>"/><br />
			<textarea name="articletext" id="articletext" cols="60" rows="5"><?php echo $articletext; ?></textarea></br>
			<button type="submit">Confirm</button>
			</form> 
		<?php
	}
	echo "</article>";
}
$stmt->close();
$db->close();

?>

我的应用更改代码:

这是参数失败的地方

<!doctype html>
<html lang="en-gb" dir="ltr">
<head>
</head>
<body>
<?php
ini_set('display_errors', 'On'); ini_set('html_errors', 0); error_reporting(-1);
print_r($_POST);
include('php/functions.php');
if(isset($_POST['articleid']) && isset($_POST['articletitle'])  && isset($_POST['articletext'])) {
	$db=createConnection();
	
	$articleid=$_POST['articleid'];
	$articletitle=$_POST['articletitle'];
	$articletext=$_POST['articletext'];

$updatesql = "UPDATE blogarticle SET articletitle=?, articletext=? WHERE articleid=?";
	$doupdate=$db->prepare($updatesql);

	$doupdate->bind_param("ssi",$articletitle, $articletext, $articleid);
	$doupdate->execute();
	$doupdate->close();
		
	$db->close();
	header("location: index.php");
} else {
	echo "<p>Some parameters are missing, cannot update database</p>";
	print_r($_POST);
}
?>
</body>
</html>

结果:

  

致命错误:在第18行的/home/16018142/public_html/Assessment/applychanges.php中调用boolean上的成员函数bind_param()

当我使用print_r($ _ POST)时,它会显示这些 -

Array ( [articleid] => 9 
        [articletitle] => THIS IS A TEST 
        [articletext] => Test Test Test Test Test Test Test Test Test Test Test Test Test Test Test Test Test Test Test Test Test Test Test Test Test Test Test Test Test Test Test Test Test Test Test Test Test Test ).

4 个答案:

答案 0 :(得分:3)

根据http://php.net/manual/en/mysqli-stmt.prepare.php 你应该把你的参数作为?

所以,行

     $updatesql="UPDATE blogarticle SET articletitle='$articletitle', articletext='$articletext' WHERE articleid='$articleid'";

应该成为

 $updatesql="UPDATE blogarticle SET articletitle=?, articletext=? WHERE articleid=?";

UPDATE 此错误可能取决于您的查询。检查

的返回值
    $db->prepare

中讨论的

Fatal error: Call to a member function bind_param() on boolean

答案 1 :(得分:2)

在使用$article替换查询中的?之前,您似乎仍未设置bind_param()的值

bind_param中的数据类型参数也需要在引号中

另外一些错误检查也不错。

<?php
$db=createConnection();
// get the first two articles
$sql = "select blogID,articletitle,articletext,
                blogtime,blogposter,username,userid 
        from blogarticle 
            join registerdemo on blogposter = userid 
        where blogID=?";

$stmt = $db->prepare($sql);
if (!$stmt) {
    echo $stmt->error;
    exit;
}

// need to give $article a value before you try and use it
// also the datatype parameter need to be in quotes
$stmt->bind_param('i',$article);

$stmt->execute();
if (!$stmt) {
    echo $stmt->error;
    exit;
}

在此代码中添加一些错误检查,基本上如果绑定失败并且布尔错误,则准备失败,因此您可能有SQL语法错误

<?php
// set full debugability on for testing
ini_set('display_errors', 1); 
ini_set('log_errors',1); 
error_reporting(E_ALL); 
// next line makes MYSQLI generate exceptions on error
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

print_r($_POST);

include('php/functions.php');
if( isset($_POST['articleid']) && 
    isset($_POST['articletitle']) && 
    isset($_POST['articletext'])) 
{
    $db=createConnection();

    $updatesql = "UPDATE blogarticle 
                    SET articletitle=?, articletext=? 
                  WHERE articleid=?";

    $doupdate=$db->prepare($updatesql);
    if (!$doupdate) {
        echo $doupdate->error;
        exit;
    }

    $doupdate->bind_param("ssi",$_POST['articletitle'],
                                $_POST['articletext']
                                $_POST['articleid']);
    $doupdate->execute();
    if (!$doupdate) {
        echo $doupdate->error;
        exit;
    }

    header("location: index.php");
    // exit after a header as header does no stop
    // the script processing it just send a HTTP header
    exit;       
} else {
    echo "<p>Some parameters are missing, cannot update database</p>";
    print_r($_POST);
}

答案 2 :(得分:1)

  

在布尔值

上调用成员函数bind_param()

我猜第18行是这样的:

$doupdate->bind_param("ssi",$articletitle, $articletext, $articleid);

这意味着$doupdate是布尔值。其值在前一行中设置:

$doupdate=$db->prepare($updatesql);

您提供的代码没有透露数据库集成,也没有在代码中提供任何解释,但方法名称​​看起来像,如mysqli,因此您可能想要插入:

if ($db->error) {
    die ($db->error);
}

错误可能是密码错误,网络问题,或者由于未在查询中选择数据库/指定错误。

答案 3 :(得分:0)

感谢大家的发帖。最终通过发布每个人的建议来了解这一点,以了解价值观的设定和传递方式。

请注意,如果我发布了有关我正在使用的数据库的更多详细信息和信息,则用户会先解决这个问题。

我正在查看$ articleid并将其作为此变量传回数据库,但$ articleid具有来自数据库的blogID的设定值。 articleid不作为数据库中的列存在。

要解决此问题,我只需添加以下两行代码:

$blogID=$_POST['blogID'];
$blogID=$articleid;

然后改变了:

'WHERE articleid=?;' to 'WHERE blogID=?;'.