使用PDO和HTML更新SQL表

时间:2019-06-13 09:57:13

标签: php html mysql

我创建了一个CMS,以便管理员用户无需编辑代码即可更轻松地对网站进行更改。

因此,基本上,管理员用户登录网站后,便应该能够添加,删除和编辑内容。我已经设法使添加和删除功能正常工作,但是我在编辑部分上很挣扎。

当用户决定编辑时,他们将被定向到显示存储在数据库中的每篇文章的页面,然后他们可以单击想要编辑的任何文章。数据通过功能$articles = $article->fetch_all();从数据库中获取。在新页面上,脚本将使用$data = $article->fetch_data($id);从mysql表中获取数据。这可以正常工作,并且可以按我想要的方式获取数据。但是,当我进行任何更改并单击“更新内容”按钮时,我仅被重定向到空白页,并且未保存任何更改。我试图查找错误,但未显示任何错误,也看不到我要去哪里。文章类是存储上述功能的地方。

我尝试了几种不同的更新方式,但实际上都没有,并且我看不到哪里出错了。

这是管理员决定进行编辑时首先看到的页面:

<?php

session_start();

include_once('../includes/connection.php');
include_once('../includes/article.php');

$article = new Article;
$articles = $article->fetch_all();


if (isset($_SESSION['logged_in'])) {

?>



<html>
    <head>
    <title>Select the content you want to edit</title>
    <link rel="stylesheet" href="../assets/style.css"/>
    </head>

    <body>
        <div class="container">
        <a href="index.php" id="logo">CMS</a>

        <br /><br />

        <h4>Select the content you want to edit</h4>

<table>
    <thead>
        <tr>
            <th>Article ID</th>
            <th>Artilce Title</th>
            <th>Article Content</th>
        </tr>
    </thead>
    <tbody>
    <?php foreach ($articles as $article) : ?>
        <tr>
            <td><?php echo ($article["article_id"]); ?></td>
            <td><?php echo ($article["article_title"]); ?></td>
            <td><?php echo ($article["article_content"]); ?></td>
            <td><a href="update.php?id=<?php echo $article['article_id'];?>">Edit</a></td>
        </tr>
    <?php endforeach; ?>
    </tbody>
</table>

</html>

<a href="index.php">Back to home</a>

    <?php

}else{
    header('Location: index.php');
}

?>

一旦管理员单击一个进行编辑,他们将被定向到update.php页面:

<?php

session_start();

include_once('../includes/connection.php');
include_once('../includes/article.php');

$article = new Article;

if (isset($_SESSION['logged_in'])) {
    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 = :article_content 
            WHERE article_id = :article_id";
            $stmt = $pdo->prepare($sql);                                  
            $stmt->bindParam(':article_title', $_POST['title'], PDO::PARAM_STR);       
            $stmt->bindParam(':article_content', nl2br($_POST['$content']), PDO::PARAM_STR);       
            $stmt->bindParam(':article_id', $_POST['article_id'], PDO::PARAM_INT);   
            $stmt->execute(); 

        header('Location: index.php');

            }

        }


    ?>
    <html>
    <head>
    <title>CMS Tutorial</title>
    <link rel="stylesheet" href="../assets/style.css"/>
    </head>

    <body>
        <div class="container">
        <a href="index.php" id="logo">CMS</a>

        <br />

        <h4>Update Article</h4>


        <?php if (isset($error)) { ?>

        <small style="color:#aa0000"><?php echo $error; ?></small> 
        <br /><br />

        <?php } ?> 

        <form action ="update.php" method="post"  autocomplete="off">
        <input type="text" value ="<?php echo $data['article_title']; ?>"name="title"/required><br /><br />
        <textarea  rows="15" cols="50" required name="content"> <?php echo $data['article_content']; ?></textarea><br /><br />
         <input type="submit" value="Update Content"/>




        </form>
    </div>  
    </body>
<html>

<?php

    }   

}else{
    header('Location: index.php');
}

?>

看着教程,看来我做得正确,但是每次我都被重定向到空白页面,而没有任何更新。

编辑:经过一番处理之后,问题似乎出在我提取数据的方式上:

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

我的fetch_data函数的工作方式:

公共函数fetch_data($ article_id){     全球$ pdo;

$query = $pdo->prepare("SELECT * FROM articles WHERE article_id = ?");
$query->bindValue(1, $article_id);
$query->execute();

return $query->fetch();

}

我更改了添加的sql,因为我知道我可以使它工作,但是它做了同样的事情(在提交表单时进入空白页),直到我摆脱了获取数据的方式。所以我知道这一定与它有关,但我一生都无法弄清楚

我在哪里可能会出错?

2 个答案:

答案 0 :(得分:1)

以前,我建议未定义$ pdo。您评论的情况并非如此,您说得对,因此我进行了详细介绍。

主要原因是,当您发布表单时,“ article_id”未提交。表格中仅有的两个字段是“标题”和“内容”。查询字符串中的“ id =”不会神奇地包含在您的表单中。因此,我们将ID作为隐藏输入添加到表单中:

<input type="hidden" name="id" value="<?php echo $data['article_id']; ?>">

我们还没有-因为只有在设置了$ _GET ['id']后才处理表单,但是这次我们使用POST。 $ _REQUEST ['id']将解决问题,它将处理$ _GET ['id']和$ _POST ['id'],因此请替换这两行:

if (isset($_REQUEST['id'])) {
$id = $_REQUEST['id'];

在您的PDO语句中,用id替换article_id,并且由于您已经分配了$ title和$ content,我们也要对其进行清理:

$stmt->bindParam(':article_title', $title, PDO::PARAM_STR);       
$stmt->bindParam(':article_content', $content, PDO::PARAM_STR);  
$stmt->bindParam(':article_id', $id, PDO::PARAM_INT);   

答案 1 :(得分:1)

因此,在经过Jeroen Flamman和Jacques Barker提供的非常有帮助的答案之后(真的很感谢帮助!),在尝试了它之后,我设法通过以下方法使它最终起作用:

<?php

session_start();

include_once('../includes/connection.php');
include_once('../includes/article.php');

$article = new Article;

if (isset($_SESSION['logged_in'])) {
    if (isset($_REQUEST['id'])) {
    $id = $_REQUEST['id'];
    $data = $article->fetch_data($id);
    if (isset($_POST['title'], $_POST['content'])) {
        $title = $_POST['title'];
        $content = nl2br($_POST['content']);

    //if form has been submitted process it
    if(isset($_POST['submit'])){

        //collect form data
        extract($_POST);

        if($title ==''){
            $error[] = 'This post is missing a valid id!.';
        }

        if($content ==''){
            $error[] = 'Please enter the title.';
        }


        if($id ==''){
            $error[] = 'Please enter the content.';
        }

        if(!isset($error)){

            try {

                //insert into database
                $stmt = $pdo->prepare('UPDATE articles SET article_title = :title, article_content = :content WHERE article_id = :id') ;
                $stmt->execute(array(
                    ':title' => $title,
                    ':content' => $content,
                    ':id' => $id
                ));

                //redirect to index page
                header('Location: index.php');
                exit;

            } catch(PDOException $e) {
                echo $e->getMessage();
            }

        }

    }
        }

    }


    ?>
    <html>
    <head>
    <title>CMS Tutorial</title>
    <link rel="stylesheet" href="../assets/style.css"/>
    </head>

    <body>
        <div class="container">
        <a href="index.php" id="logo">CMS</a>

        <br />

        <h4>Update Article</h4>


        <?php if (isset($error)) { ?>

        <small style="color:#aa0000"><?php echo $error; ?></small> 
        <br /><br />

        <?php } ?> 

        <form action ="update.php" method="post"  autocomplete="off">
        <input type="text" value ="<?php echo $data['article_title']; ?>"name="title"/required><br /><br />
        <textarea  rows="15" cols="50" required name="content"> <?php echo $data['article_content']; ?></textarea><br /><br />
        <input type="hidden" name="id" value="<?php echo $data['article_id']; ?>">
         <input type="submit" name="submit" value="Update Content"/>




        </form>
    </div>  
    </body>
<html>

<?php



}else{
    header('Location: index.php');
}

?>