用PDO $ _POST插入不起作用 [英] INSERT with PDO $_POST not working

查看:105
本文介绍了用PDO $ _POST插入不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

请有人帮助我,因为我不明白我到底在做什么错. 我有一个带有2个字段"title"和"message"的html表单.我试图将其与PDO和$ _POST一起进入数据库,但我只是遇到此错误:

Please can someone help me out as I can´t understand what the heck I am doing wrong. I have a html form with 2 fields "title" and "message". I´m trying to get this to go into the database with PDO and $_POST but I am just getting this error:

严重错误:消息为'SQLSTATE [23000]的未捕获异常'PDOException':违反完整性约束:1048中的列'title'不能为空'

我正在按照书上的说明做所有事情,但是没有用,我打算很快将计算机扔到窗外.因此,请任何人知道有什么问题吗?为什么标题变成"NULL"?

I´m doing everything by the book but it´s not working and I going to throw my computer out the window soon. So please anyone have any idea what is wrong? Why is title turning "NULL"?

数据库是一个4列的表(ID,标题,消息和时间戳记). id字段是主要字段和自动意图

The database is a 4 column table (id, title, message and timestamp). The id field is primary and auto intent

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

ANY help is really appreciated!!! And I´m a beginner...

这是post.php文件:

Here is post.php file:

<?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文件:

And here is the connect.inc.php file:

<?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';.另外,为了最小化代码,就像戴夫刚才说的那样,更改:

This issue was finally solved. The problem is you need to check if $_POST is empty or not. And right after the if (!empty($_POST)) { set the require 'connect.inc.php';. Also to minimize code do like Dave Just said, change :

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

收件人:

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

这是post.php中的工作代码:

Here is the working code in 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>

推荐答案

如果尚未将计算机扔出窗口,则应在将它们传递给PDO之前检查是否已设置$_POST变量执行语句.

If you haven't thrown the computer out the window already, you should've checked whether $_POST vars were set or not before passing them to a PDO execute statement.

<?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();
    }
?>

PS

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

PS

I have no idea what $time would do there.

这篇关于用PDO $ _POST插入不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆