0

と の準備済みステートメントに少し問題がPHPあり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 の返信が実際に重要なものであることを指摘しておく価値があるかもしれません。

$idSQL ステートメントはエラーではなく、変数が設定または初期化されていないため、たまたま行が影響を受けなかったことに注意してください。したがって、適切な行動方針は、次のようなものになります。

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 に答える