PDO插入$ _POST?

时间:2013-10-09 13:33:43

标签: php post pdo insert

*已解决的问题 * 在下面的帖子中查看答案

我很想尝试使用PHP和PDO将带有$ _POST的简单html表单中的数据插入到数据库中。目前我没有收到任何错误,数据库中没有任何内容。如果我在代码中手动键入值,它可以工作,但在键入html表单时没有任何反应。在某些时候我输入了“数组”。

如果有人能告诉我我做错了什么或者指出了我正确的方向,我真的很感激!我是初学者,所以请和我一起出去:)

更新 我得到的错误是: 致命错误:未捕获的异常'PDOException',消息'SQLSTATE [23000]:完整性约束违规:1048列'标题'不能为空'...

为什么列标题为空?

数据库只是一个包含4个字段的表(id,title,message和time / timestamp字段。 id字段是主AI,时间戳字段自动获取时间。

这是connect.inc.php文件:

<?php
class DB extends PDO
{
    public function __construct($dbname = "blogdata")
    {
        try {
            parent::__construct("mysql:host=localhost;dbname=$dbname;charset=utf8",
                                "root", "");
        } catch (Exception $e) {
            var_dump($e);
        }
    }
}

?>

这是post.php文件:

<?php 

require 'connect.inc.php';

$db = new DB('blogdata');

$stmt = $db->prepare("INSERT INTO blogposts (title, message, time) VALUES (:title, :message, :time)");

$stmt->bindParam(':title', $_POST['title']);
$stmt->bindParam(':message', $_POST['message']);
$stmt->bindParam(':time', $time);

$title = $_POST['title'];
$message = $_POST['message'];

$stmt->execute();

?>


<!DOCTYPE html>

<html>
<head>
<title>Create blog post</title>
<meta charset="utf-8" />

</head>

<body>

<!--- Add blog post ---> 

<div class="add_form">
    <form id="add_post" method="post" action="index.php" enctype="text/plain">
        <fieldset>
            <legend>Create post</legend>
            <label for="post_title">Title:
                <input id="title" type="text" name="title" value="<?php if (isset($title)) { echo htmlentities ($title); } ?>" >
            </label>
            <label for="message">Message:
                <textarea id="message" name="message" rows="20" cols="30" maxlength="50" value="<?php if (isset($message)) { echo htmlentities ($message); } ?>" ></textarea>
            </label>                                        
        </fieldset>
        <input id="send" type="submit" value="Send">
    </form>
</div>


</body>

</html>

ANSWER

你需要包装所有内容并检查$ _POST是否为空。问题还在于表单中的action =“index.php”。它需要设置为post.php。

这是post.php中的正确代码:

<?php 

if (!empty($_POST)) {

  require 'connect.inc.php';

  $db = new DB('blogdata');

  $stmt = $db->prepare("INSERT INTO blogposts (title, message) VALUES (:title, :message)");
  $stmt->bindParam(':title', $_POST['title']);
  $stmt->bindParam(':message', $_POST['message']);

  $title = $_POST['title'];
  $message = $_POST['message'];

  $stmt->execute();

  header ('Location: index.php');
  exit;
}
?>

<!DOCTYPE html>

<html>
<head>
<title>Create blog post</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="reset.css" />
<link rel="stylesheet" href="style.css" />

</head>

<body>

<!--- Add blog post ---> 

<div class="add_form">
    <form id="add_post" method="post" action="post.php">
        <fieldset>
            <legend>Create post</legend>
            <label for="post_title">Title:
                <input id="title" type="text" name="title" value="<?php if (isset($title)) { echo htmlentities ($title); } ?>" >
            </label>
            <label for="message">Message:
                <textarea id="message" name="message" rows="20" cols="30" maxlength="50" value="<?php if (isset($message)) { echo htmlentities ($message); } ?>" ></textarea>
            </label>                                        
        </fieldset>
        <input id="send" type="submit" value="Send">
    </form>
</div>


</body>

</html>

2 个答案:

答案 0 :(得分:1)

以下是正确的 connect.inc.php文件:

<?php
class DB extends PDO
{
    public function __construct($dbname = "blogdata")
    {
        $opt = array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION);
        $dsn = "mysql:host=localhost;dbname=$dbname;charset=utf8";
        parent::__construct($dsn, "root", "", $opt);
    }
}

Dunno,如果它导致错误,但

  

这是 post.php 文件:
  <form id =“add_post”method =“post”action =“ index.php

无论如何,问题的真正原因与此类似。某处有些愚蠢的错字

答案 1 :(得分:1)

您最后评论的好评:

  

@Corum嗨,我在表单中调用index.php,因为index.php是   显示所有帖子,并在发送用户应该的表单后   指向index.php并能够看到结果......我真的不能   似乎解决了这个问题:(

如果您使用<form action="index.php">调用index.php,您的表单数据将永远不会被处理。

您必须在重定向到index.php之后调用post.php

更正代码(替换文件post.php中的顶级PHP块):

<?php 
if (!empty($_POST) {
  // Only process if form is submitted (when page is launched, it use GET method)
  require 'connect.inc.php';

  $db = new DB('blogdata');

  $stmt = $db->prepare("INSERT INTO blogposts (title, message, time) VALUES (:title, :message, :time)");

  $stmt->bindParam(':title', $_POST['title']);
  $stmt->bindParam(':message', $_POST['message']);
  $stmt->bindParam(':time', $time);

  $title = $_POST['title'];
  $message = $_POST['message'];

  $stmt->execute();

  // Redirect to index.php
  header('Location : index.php');
  exit;
}
?>

并更改您的html表单:<form action="post.php" ...>