2013-02-28 65 views
0

当谈到mySQL时,我是一个新手,在涉及到PDO时更是如此。我试图创建一些简单的插入代码,但我不断收到服务器错误。我有一种感觉,它与定义$STH两次有关。这里是我的代码:PDO mySQL中的命名占位符导致服务器错误

$dsn = "mysql:host=localhost;dbname=Menu_Items"; 
$user = "root"; 
$pass = "root"; 

// Connect to database 
try{ 
    $DBH = new pdo($dsn, $user, $pass); 
} 
catch(PDOException $e) { 
    echo $e->getMessage(); 
} 

// Define user input as $food 
$name = $_POST['food']; 

$STH->bindParam(':name', $name); 

// Insert user input into table 
$STH = $DBH->prepare("INSERT INTO foods (name) VALUES (:name)"); 

$result = $DBH -> query($STH); 
if($result){ 
    echo("<br>Input data is succeed"); 
}else{ 
    echo("<br>Input data is fail"); 
} 

这PHP代码连接到一个简单的HTML表单:

<form id="menu_input" name="menu_input" method="post" action="insert.php"> 
     <table> 
     <thead>Enter a new item</thead> 
     <tr> 
      <th><label for="food">Food</label></th> 
      <td><input type="text" name="food" id="food" placeholder="Food Name" required></td> 
     </tr> 
     <tr> 
      <td><input type="submit"></td> 
     </tr> 
     </table> 
</form> 

我一直在做研究,但只是有得到它的工作有点困难。思考?

+0

绑定应该是准备后? – 2013-02-28 09:45:48

回答

3

首先创建/获取对象/实例,然后使用它的方法;而不是相反。

// Insert user input into table 
$STH = $DBH->prepare("INSERT INTO foods (name) VALUES (:name)"); 
$STH->bindParam(':name', $name); 
$STH->execute(); 

和(吹毛求疵模式:上)没有必要为变量$name

// Insert user input into table 
$STH = $DBH->prepare("INSERT INTO foods (name) VALUES (:name)"); 
$STH->bindValue(':name', $_POST['food']); 
$STH->execute(); 

会做,所以会

// Insert user input into table 
$STH = $DBH->prepare("INSERT INTO foods (name) VALUES (:name)"); 
$STH->execute(array('name'=>$_POST['food'])); 
+0

所以服务器错误消失了,但现在没有任何东西插入到我的表中。有任何想法吗? – Brian 2013-02-28 10:01:51

+0

使用'$ DBH-> setAttribute(PDO :: ATTR_ERRMODE,PDO :: ERRMODE_EXCEPTION);'在'$ DBH = new pdo ...'行之后执行。这不会_fix_任何东西,但在发生错误的情况下,你很难错过它;-) – VolkerK 2013-02-28 10:41:07

+0

哦,并且btw:'$ DBH - > query($ STH)'是错误的。通过'$ STH-> execute();'重新获得它。 – VolkerK 2013-02-28 10:48:05

0

命名占位符有无关你的问题。
而且他们不是“最好的选择”。这只是一种语法糖,相当不必要的。

你的问题不是一个命名的占位符,而是你从哪里冒出来的语法。

  1. 请务必阅读您正在使用的功能的手册页。 query()方法不支持占位符。
  2. 提问之前总是阅读tag wiki。在那里你可以看到正确的例子。

请阅读我在上面链接的Stackoverflow标签wiki,并使用上面的代码。用于连接和查询执行。
您必须设置错误报告来查看错误。否则,现在就知道你的代码有什么问题了。

+0

无需投票。使用' - >查询($ STH);'在这里_is_错误,没有其他人在第一轮发现它并阅读wiki页面是一个很好的建议... – VolkerK 2013-02-28 10:55:54

0

使用bindValue而不是bindParam,因为你是绑定值,而不是参数。后prepare声明呼吁bindValue

... 
$name = $_POST['food']; 

// Insert user input into table 
$STH = $DBH->prepare("INSERT INTO foods (name) VALUES (:name)"); 
$STH->bindValue(':name', $name); 

$result = $DBH->query($STH); 
... 
+0

我不再收到服务器错误,但现在当我检查我的表时,该输入不会出现。我的php代码连接到一个html表单。我将编辑我的代码,以便您可以看到。不知道这与问题有什么关系,但... – Brian 2013-02-28 09:58:50