2016-06-07 128 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

相关问题