使用PDO mySQL命名占位符导致服务器错误

时间:2013-02-28 09:43:23

标签: php mysql pdo

对于mySQL,我是新手,在PDO方面更是如此。我正在尝试创建一些简单的插入代码,但我不断收到服务器错误。我觉得它与定义$STH两次有关。这是我的代码:

$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>

我一直在做研究但只是有点困难才能让它发挥作用。想法?

3 个答案:

答案 0 :(得分: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']));

答案 1 :(得分:0)

命名占位符与您的问题无关 而且他们不是“最好的选择”。它只是一种语法糖,非常不必要。

您的问题不是命名占位符,而是您无处不在的语法。

  1. 请务必阅读您正在使用的功能的手册页。 query()方法不支持占位符。
  2. 在提问之前,请务必先阅读tag wiki。在那里你可以看到正确的例子。
  3. 请在上面链接的PDO上阅读Stackoverflow标记wiki并使用其中的代码。用于连接和查询执行 您必须设置错误报告才能查看错误。否则,现在可以知道您的代码有什么问题。

答案 2 :(得分:0)

使用bindValue代替bindParam,因为您是绑定值,而不是参数。在bindValue声明后调用prepare

...
$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);
...