使用PHP OOP更新博客文章

时间:2013-01-06 02:51:43

标签: php sql pdo sql-update

我不明白为什么我的博文不会被编辑。我有一个类('blog'),方法update_post()有三个参数。这是我的代码(因为我知道它们正在工作,我跳过了连接和其他部分):

<?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')。经过一些实验,我发现错误必须在edit_post页面中。我用“if(1&lt; 2)”替换了第二个“if语句”,然后更新了我的帖子。这是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']; ?>"

1 个答案:

答案 0 :(得分: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注入的攻击。<​​/ p>