0

我对PHPand的准备好的语句有一点问题MySQLi。我的代码获取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())并且它是否成功。当然,假设问题不在于执行功能,而在于其他地方。问题不可能是 POST 数据,因为它可以通过以下方式验证:

if
(
    $_POST['foo'] && isset($_POST['foo']) &&
    $_POST['bar'] && isset($_POST['bar'])
)
{
    // Statements.
}

我一无所知。

编辑

我想指出我回显了 2 个特定 POST 变量的值,因为这些是我在更新代码时添加的值。它已经停止工作。另请注意,我已使用print_r($_POST)并且所有 POST 变量都已设置并包含值。

4

2 回答 2

1

如果 SQL 级别没有错误,您的更新将返回成功。请注意,未找到要更新的候选行不是 SQL 错误。这是一个逻辑错误/预期条件。如果未能找到要更新的行是您的代码的错误条件,那么您将需要修改错误检查以包括对它的检查。

if($query->execute())
{
    if($mysqli->affected_rows == 0)
        // some logical error 
于 2013-01-18T05:35:38.463 回答
1

问题已解决。

正如预期的那样,该错误不是由故障或逻辑错误引起的,而是一个未更改的变量$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.");
}
于 2013-01-18T07:31:41.737 回答