php - 带有 $_POST的PDO插入?

  显示原文与译文双语对照的内容
0 0

*PROBLEM * 请参见下面的post answer

我疯狂地尝试用 $_POST 和PDO将来自简单html表单的数据插入到数据库中。 目前我没有获得任何错误,没有任何东西进入数据库。 如果在代码中手动键入值,但在键入html窗体时没有发生任何情况。 有些时候我把"array"打出来了。

我是初学者,请跟我一起去。

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

为何列标题为空?

为代价的数据库只是一个带有 4字段( id 。标题。消息和时间/时间戳字段)的table 。 id field字段,时间戳字段自动提取时间。

这是 connect.inc.php file:


<?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 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"/>

</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>

回答

你需要把所有东西包装起来,检查 $_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>

时间: 原作者:

0 0

你的最后一条评论的Awser:

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

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

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


<?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".. .>

原作者:
0 0

下面是正确的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.php的价格
<form id="add_post"method="POST"action=" index.php""

无论如何,问题的真正原因是类似的。 有些愚蠢的错误

原作者:
...