我对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 ).
答案 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()
的值1>
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=?;'.