2013-10-09 100 views
0

*問題解決了*查看答案在我的後下方

我要瘋了試圖從$ _ POST一個簡單的HTML表單數據插入到PHP和PDO的數據庫。目前我沒有收到任何錯誤,但沒有任何內容會進入數據庫。如果我在代碼中手動輸入值,但在輸入html表單時沒有任何反應。在某個時候,我輸入了「Array」。

如果有人能告訴我我做錯了什麼,或者指出我朝着正確的方向,我會非常感激!我是初學者所以請裸跟我:)

UPDATE: 我得到的錯誤是: 致命錯誤:未捕獲的異常「PDOException」有消息「SQLSTATE [23000]:完整性約束違規:1048列'標題'不能爲空'in ...

爲什麼列標題爲空?

數據庫僅僅是一個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> 
+0

將所有的東西,看看你發現任何錯誤。 – aynber

+1

@aynber讓你知道,例外完全可見沒有任何catch塊 –

+0

大多數情況下,如果你知道在哪裏看:-) catch塊讓你輸出它,如果有錯誤,你想要的。 – aynber

回答

0

Awser你最後的評論:

@Corum Hi, I´m calling index.php in the form because index.php are displaying all the posts and after sending the form the user should be directed to index.php and be able to see the results... I really can´t seem to solve this:(

如果調用<form action="index.php">您的表單數據的index.php將永遠不會被處理。

您必須改爲撥打post.php,然後重定向到index.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" ...>

在try/catch塊
+0

好吧,這拿走了當前的錯誤,但問題仍然是相同的,數據將不會進入數據庫,發送後的形式它只是顯示post.php沒有錯誤沒有什麼... – Lisa

+0

刪除'enctype =「text/plain」 ',添加'var_dump($ _ POST); die();'緊跟在'if(!empty($ _ POST){'並告訴我們你得到的結果。 – Elorfin

+0

我得到這個:array(2){[「title」] => string(5)「super」[ 「message」] => string(11)「bhbhbgkbgkj」} – Lisa

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

說不上來,如果它造成的錯誤,但

And here is the post.php file:
<form id="add_post" method="post" action="index.php"

無論如何,問題的真正原因與此類似。有些傻錯字某處

+0

嗨!我只是改變了這一點,並收到此錯誤:致命錯誤:帶有消息'SQLSTATE [23000]的未捕獲異常'PDOException':完整性約束違規:1048'標題'列不能爲空'在 – Lisa

+0

看來,所有的字段中的值都爲零......我認爲它與ID字段和AI有關,所以我嘗試添加:$ newId = $ db-> lastInsertId(); – Lisa

+0

這就是你正在尋找什麼,現在你可以自己閱讀和理解這個錯誤,或者谷歌(不是有意義的部分從「完整性」開始) –