0

已解决 - 在帖子底部添加了答案

请有人可以帮助我,因为我无法理解我做错了什么。我有一个带有 2 个字段“标题”和“消息”的 html 表单。我正在尝试使用 PDO 和 $_POST 将其输入数据库,但我只是收到此错误:

致命错误:未捕获的异常“PDOException”和消息“SQLSTATE [23000]:违反完整性约束:1048 列“标题”不能为空”

我按照书本做所有事情,但它不起作用,我很快就会把我的电脑扔出窗外。所以请任何人知道有什么问题吗?为什么标题变成“NULL”?

该数据库是一个 4 列的表(id、title、message 和 timestamp)。id 字段是主要和自动意图

任何帮助都非常感谢!!!而我是初学者...

这是 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" />
<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" 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>

这里是 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);
    }
}

?>

回答:

这个问题终于解决了。问题是您需要检查 $_POST 是否为空。并且在if (!empty($_POST)) {设置之后require 'connect.inc.php';。还要像 Dave Just 所说的那样最小化代码,改变:

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

到:

$stmt->execute(array(':title' => $_POST['title'], ':message' => $_POST['message']));

这是 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->execute(array(':title' => $_POST['title'], ':message' => $_POST['message']));

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

  // Redirect to index.php
  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">
        <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>
4

1 回答 1

3

如果您还没有将计算机扔出窗口,您应该在$_POST将变量传递给 PDO 执行语句之前检查是否设置了变量。

<?php 
    require 'connect.inc.php';
    if( isset($_POST['title'], $_POST['message']) ) {
        $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();
    }
?>

附言

我不知道$time在那里会做什么。

于 2013-10-09T18:02:43.470 回答