1

$_POST を使用した単純な html フォームから、PHP と PDO を使用してデータベースにデータを挿入しようとしています。エラーは発生していません。データベースには何も入っていません。コードに値を手動で入力すると機能しますが、html フォームに入力しても何も起こりません。ある時点で、「配列」と入力しました。

更新: 私が得ているエラーは次のとおりです:致命的なエラー:メッセージ「SQLSTATE[23000]:整合性制約違反:1048列「タイトル」をnullにすることはできません」を含む例外「PDOException」がキャッチされていません...

列のタイトルが null なのはなぜですか?

データベースは、4 つのフィールド (id、タイトル、メッセージ、および時刻/タイムスタンプ フィールド) を持つ単なるテーブルです 。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>

答え

すべてをまとめて、 $_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>
4

2 に答える 2

1

最後のコメントの Awser :

@Corum こんにちは、index.php はすべての投稿を表示しているため、フォームで index.php を呼び出しています。フォームを送信した後、ユーザーは index.php に誘導され、結果を確認できるはずです...本当にできますこれを解決していないようです:(

フォームデータで index.php を呼び出すと<form action="index.php">、処理されません。

post.php代わりに、index.php にリダイレクトした後に呼び出す必要があります。

修正されたコード (ファイルの先頭の PHP ブロックを置き換えますpost.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" ...>

于 2013-10-09T16:44:53.733 に答える
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);
    }
}

エラーが発生したかどうかはわかりませんが、

そして、これがpost.phpファイルです:
<formid="add_post" method="post" action=" index.php "

とにかく、問題の本当の原因はそれに似ています。どこかのばかげたタイプミス

于 2013-10-09T13:46:53.003 に答える