$query->execute()似乎工作,值没有在MySQL中使用' UPDATE '更新


$query->execute() seems to work, values not updated in MySQL using `UPDATE`

我对PHPMySQLi的准备语句有一个小问题。我的代码采用POST数据,准备语句,然后将POST数据绑定到查询。在此之后,它执行,似乎没有错误,但语句显然没有得到正确执行,因为没有发生数据库更改。

我的问题的快速概述:

  1. 我正在使用MySQLi和预处理语句。
  2. 我已经更新了一些以前的PHP/MySQLi代码,没有使用准备好的语句。
  3. 更新后,$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.");
}