*已解决的问题 * 在下面的帖子中查看答案
我很想尝试使用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>
答案 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" ...>