2016-06-07 130 views
0

當試圖從表單中獲取數據並將其添加到名爲test的數據庫內的稱爲對象的表時,我遇到了一個小問題。嘗試通過表單插入數據庫時​​出錯。 SQLSTATE [42S22]

當我打開窗體上添加一些信息,然後按提交,我得到這個錯誤:

Fatal error: Uncaught PDOException: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'Mr' in 'field list' in *path**

的HTML和PHP代碼都在同一目錄下,兩個單獨的文件。

page_1.php

<form action="connect.php" method="post"> 
    Title: <input type="text" name="title"><br /> 
    First name: <input type="text" name="fname"><br /> 
    About: <textarea name="about"></textarea><br /> 
    <input type="reset" name="reset"> 
    <input type="submit" name="submit" value="OK"> 
</form> 

connect.php

try{ 
    $dh = new PDO('mysql:host=127.0.0.1;dbname=test','root',''); 
    $dh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
}catch(PDOException $e){ 
    echo $e->getMessage(); 
    die(); 
} 

$title = $_POST['title']; 
$content = $_POST['about']; 
$name = $_POST['fname']; 


$sql = "INSERT INTO objects (post_title, post_content, post_name, post_date) 
      VALUES ({$title}, {$content}, {$name})"; 
$query = $dh->query($sql); 

while($r = $query->fetch(PDO::FETCH_OBJ)){ 
    echo $r->post_name, '<br>'; 
} 
+2

你剛剛錯過了添加日期 –

+0

'post_date'是否有'CURDATE()'的默認約束?如果是這樣,從'INSERT INTO'中刪除'post_date' – Arulkumar

回答

1

您有4次失誤。

  • 列數不匹配(4列,3個值)值的數量
  • 你插入不帶引號的字符串 - 你不使用準備語句不工作
  • 但您使用的是PDO,所以不應有任何藉口
  • 您正在發出INSERT查詢,並且您正試圖將其視爲SELECT查詢。這根本沒有意義。使用準備好的語句,並且產生的安全對SQL注入是這樣工作的查詢

代碼:

$stmt = $pdo->prepare("INSERT INTO objects (post_title, post_content, post_name, post_date) VALUES (?, ?, ?, NOW())"); 

$stmt->execute(array($_POST['title'], $_POST['about'], $_POST['fname'])); 

如果需要插入的記錄,然後發出用於選擇新創建的記錄另一個查詢,也使用準備好的語句。

$stmt = $pdo->prepare("INSERT INTO objects (post_title, post_content, post_name, post_date) VALUES (?, ?, ?, NOW())"); 

$stmt->execute(array($_POST['title'], $_POST['about'], $_POST['fname'])); 

$id = $pdo->lastInsertId(); 

$stmt = $pdo->prepare("SELECT * FROM objects WHERE id = ?"); 

$stmt->execute(array($id)); 

// Now the record is in an array, no need to while loop over it. 
$record = $stmt->fetchAll(PDO::FETCH_ASSOC); 
+0

謝謝,我最終得到了它的工作。我使用準備好的語句,只是爲了學習「表單到數據庫」的工作方式而刪除它們。 – Jobake

相關問題