【问题标题】:Named placeholders in with PDO mySQL causing server errorPDO mySQL 中的命名占位符导致服务器错误
【发布时间】:2013-02-28 09:43:22
【问题描述】:

对于 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>

我一直在做研究,但在让它发挥作用时遇到了一点困难。想法?

【问题讨论】:

  • 绑定应该在准备之后?

标签: php mysql pdo


【解决方案1】:

首先创建/获取对象/实例,然后使用其方法;反之亦然。

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

并且(nit-picking mode: on)不需要变量$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']));

【讨论】:

  • 所以服务器错误消失了,但现在没有任何东西插入我的表中。有什么想法吗?
  • $DBH = new pdo ... 行之后尝试使用$DBH-&gt;setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);。这不会修复任何东西,但如果出现错误,你很难错过它;-)
  • 哦,顺便说一句:$DBH -&gt; query($STH) 是错误的。通过$STH-&gt;execute(); 重新申请。
【解决方案2】:

使用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);
...

【讨论】:

  • 我不再收到服务器错误,但现在当我检查我的表时,该输入不会出现。我的 php 代码连接到一个 html 表单。我将编辑我的代码,以便您查看。不知道这是否与问题有关...
【解决方案3】:

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

您的问题不是命名占位符,而是您不知从何而来的语法。

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

请阅读我在上面链接的 PDO 上的 Stackoverflow 标签 wiki,并使用那里的代码。用于连接和查询执行。
您必须设置错误报告才能查看错误。否则无法知道您的代码有什么问题。

【讨论】:

  • 无需投反对票。在此处使用-&gt;query($STH);错误的,第一轮中没有其他人发现它并且阅读维基页面是一个好建议...
猜你喜欢
  • 2012-01-24
  • 2014-04-11
  • 2012-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-23
相关资源
最近更新 更多