我对PHP
和MySQLi
的准备语句有一个小问题。我的代码采用POST
数据,准备语句,然后将POST数据绑定到查询。在此之后,它执行,似乎没有错误,但语句显然没有得到正确执行,因为没有发生数据库更改。
我的问题的快速概述:
- 我正在使用MySQLi和预处理语句。
- 我已经更新了一些以前的PHP/MySQLi代码,没有使用准备好的语句。
- 更新后,
$query->execute()
出现问题。
if($query = $this->mysqli->prepare("UPDATE article SET copy = ?, title = ?, alias = ?, description = ?, category = ?, category_id = ?, author = ?, permission = ?, mode = ?, comments = ?, revised = ?, frequency = ?, priority = ? WHERE id = ?"))
{
if
(
$query->bind_param
(
"sssssdsssssssd",
$_POST['edit_article'],
$_POST['edit_title'],
$_POST['edit_alias'],
$_POST['edit_description'],
$_POST['edit_category'],
$result['id'],
$_POST['edit_author'],
$_POST['edit_permission'],
$_POST['edit_mode'],
$_POST['edit_comments'],
$date_time,
$_POST['edit_frequency'],
$_POST['edit_priority'],
$id
)
)
{
if($query->execute())
{
echo $this->mysqli->error; // does nothing.
// These statements print to the screen successfully with the correct values.
echo $_POST['edit_frequency'] . "<br />";
echo $_POST['edit_priority'] . "<br />";
//$_SESSION['article_edited'] = true;
// die;
//exit(header("Location: " . __MANAGER__ . $_POST['edit_alias']));
}
else
{
$_SESSION['article_edited'] = false;
exit(header("Location: " . __MANAGER__ . $_POST['edit_alias']));
}
}
}
else
{
$_SESSION['article_edited'] = false;
exit(header("Location: " . __MANAGER__ . $_POST['edit_alias']));
}
谁能解释一个更好的方法来调试这段代码?这对我来说没有意义,因为我检查execute()
函数是否与if($query->execute())
一起工作并且它是成功的。当然,假设问题不在于execute函数,而在于其他地方。问题不可能是POST数据,因为它可以用:
if
(
$_POST['foo'] && isset($_POST['foo']) &&
$_POST['bar'] && isset($_POST['bar'])
)
{
// Statements.
}
我很笨。
编辑
我想指出的是,我回显了2个特定POST变量的值,因为它们是我在更新代码时添加的。它已经停止工作。还请注意,我使用了print_r($_POST)
,所有POST变量都设置并包含值。
如果SQL级别没有错误,您的更新将返回成功。注意,没有找到候选行进行更新并不是SQL错误。这是一个逻辑错误/预期条件。如果未能找到要更新的行是代码的错误条件,则需要修改错误检查,以包含对该行的检查。
if($query->execute())
{
if($mysqli->affected_rows == 0)
// some logical error
问题已解决
这个错误,正如预期的那样,不是由故障或错误的逻辑引起的,而是一个未改变的变量$id
,它应该被转换为$_POST['id']
。对于那些将来读到这篇文章的人来说,可能值得注意的是,Amit Agrawal的回复实际上是一个重要的回复。
请记住,SQL语句并没有出错,只是因为没有设置或初始化变量$id
,所以没有行受到影响。因此,适当的做法应该是这样的:
if($query->execute())
{
if($this->mysqli->affected_rows == 0)
{
// Appropriate action (such as raising an error), e.g.,
die("No rows were affected");
}
else
{
// Appropriate action.
}
}
else
{
die("Query could not be executed.");
}