0

ブログの投稿が編集されない理由がわかりません。3つのパラメーターを持つupdate_post()メソッドを持つクラス('blog')があります。これが私のコードです(接続と他の部分が機能していることがわかっているのでスキップしました):

<?php
class blog{
function update_post($id, $title, $contents) {
        try {
            $update = $this->db->prepare("UPDATE posts SET title = $title, contents = $contents WHERE id = $id");
            $update->execute();
        }
        catch (PDOException $e) {

        }
    }
}

$post = new blog;

if (isset($_GET['id'])) {
    if (isset($_POST['publish'])) { // If submit button is clicked
        $id = $_GET['id'];
        $title = $_POST['title'];
        $contents = $_POST['contents'];
        $post->update_post($id, $title, $contents);
    }
}
?>

編集:それで、私は複数のエラーがあったようです。上記の元のコードは、私のclass.blog.phpファイルとHTML形式のページ('edit_post.php')の2つのファイルからのものです。いくつかの実験の結果、エラーはedit_postページにあるはずであることがわかりました。2番目の「ifステートメント」を「if(1 <2)」に置き換えた後、投稿が更新されました。これがedit_postページの大部分です。

<?php
if (isset($_GET['id'])) {
    if (isset($_POST['publicera'])) {
        $id = $_GET['id'];
        $title = $_POST['title'];
        $contents = $_POST['contents'];
        $post->update_post($id, $title, $contents);
    }
?>
<form method="post" action="edit_post.php">
    Titel:<br /> 
    <input type="text" name="title" size="80" value="<?php $post->get_title($_GET['id']); ?>"><br />
    Inlägg:<br /><textarea name="contents" rows="20" cols="80"><?php $post->get_contents($_GET['id']); ?></textarea>
    <br /><input type="submit" name="publicera" value="Publicera!">
</form>

<?php
} else {
$post->show_post_list();
}
?>

編集#2:解決しました!誤ったSQLクエリとは別に、フォームアクションの値をに変更する必要がありましたaction="edit_post.php?id=<?php echo $_GET['id']; ?>"

4

1 に答える 1

0

構文的に無効であるため、クエリは失敗します。これは、変数$title, $contents, $idが引用符で囲まれていない文字列としてPDOプリペアドステートメントに直接渡されるためです。プリペアドステートメントのセキュリティ上の利点は得られません。実際、クエリはSQLインジェクションに対して非常に脆弱であり、変数が引用符で囲まれていないため壊れています。

適切にバインドされたパラメータを使用する必要があります。

function update_post($id, $title, $contents) {
    try {
        // Bind named parameters
        $update = $this->db->prepare("UPDATE posts SET title = :title, contents = :contents WHERE id = :id");
        // Pass the values in an array to execute()
        $update->execute(array(':title' => $title, ':contents' => $contents, ':id' => $id));
    }
    catch (PDOException $e) {
         // Or handle the error, assuming you have PDO setup in ERRMODE_EXCEPTION
         echo "Error in query!!!";
         print_r($this->db->errorInfo());
    }
}

アプリケーションの残りの部分も元の誤ったクエリのようなパターンを使用している場合(ただし、それらが機能する場合は正しく引用されます)、上記のようにバインドされたパラメーターを使用するように更新することをお勧めします。それ以外の場合は、SQLインジェクションに対しても脆弱であると想定する必要があります。

于 2013-01-06T03:19:47.520 に答える