0

私は PDO を使用するのが初めてで、エントリの追加と削除を行うためにこれらすべてを使用しましたが、データを更新することはできません。私のSQLステートメントがオフなのか、それともここに何かが欠けているだけなのかはわかりません。

if (isset($_GET['id'])) {
    $id = $_GET['id'];
    $data = $article->fetch_data($id);

    if(isset($_POST['title'], $_POST['content'])) {
        $title = $_POST['title'];
        $content = nl2br($_POST['content']);

        if (empty($title) or empty($content)) {
            $error = 'All fields are required!';
        } else {
            $query = $pdo->prepare('UPDATE articles SET article_title = ?, article_content = ?, article_timestamp = ? WHERE article_id = $id');

            $query->bindValue(1, $title);
            $query->bindValue(2, $content);
            $query->bindValue(3, time());

            $query->execute();

            header('Location: index.php');
        }
    }
}
4

2 に答える 2

2

$id 変数を補間するには、クエリを二重引用符で囲む必要があります。一重引用符を使用すると、変数は $id として解釈されます。

$query = $pdo->prepare("UPDATE articles SET article_title = ?, article_content = ?, article_timestamp = ? WHERE article_id = $id");

他の人が言っているように、これは SQL インジェクションにつながる可能性があります。

代わりに、$id 変数もバインドする必要があります。ID として int を使用している場合は、PDO::PARAM_INT. 例$query->bindValue(4, $id, PDO::PARAM_INT);

$query = $pdo->prepare("UPDATE articles SET article_title = ?, article_content = ?, 

article_timestamp = ? WHERE article_id = ?");
$query->execute(array($title, $content, time(), $id));
于 2013-06-16T02:15:01.810 に答える
1

私は個人的にこれを次のように書きます:

if (isset($_GET['id'])) {
    $id = $_GET['id'];
    $data = $article->fetch_data($id);

    if(isset($_POST['title'], $_POST['content'])) {
    $title = $_POST['title'];
    $content = nl2br($_POST['content']);

    if (empty($title) or empty($content)) {
        $error = 'All fields are required!';
    } else {
        $sql = "UPDATE articles SET article_title = :title, article_content = :content, article_timestamp = :timestamp WHERE article_id = :id";
        $query = $pdo->prepare($sql);

        $query->bindValue(":title", $title);
        $query->bindValue(":content", $content);
        $query->bindValue(":timestamp", time());
        $query->bindValue(":id", $id);


        try {
          $result = $query->execute();
        } catch(PDOException $e) {
          echo $e->getCode() . " - " . $e->getMessage();
        }

        if($result) {
          header('Location: index.php');
        }
    }
}

}

これは私の好みの方法です。ユーザー入力を取得している場合 (これは$_GET['id']. また、私が PDO を学んだ方法は、変数を " : " でバインドすることでした。誰かが ? を使っているのを見たことがあるとは言えません。PDO を扱うときですが、私はもっとソロの開発者です。

とにかく、それはあなたに必要なものを与えるはずです。

編集:もう1つ、言及するのを忘れていました。$result = $query->execute();ステートメントが成功した場合は PDO が true を返し、そうでない場合は false を返すため、を追加します。そのため、別のページにリダイレクトしたり、フラッシュ メッセージなどでフォームを再表示したりできます。

于 2013-06-16T02:25:06.207 に答える