对于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>
我一直在做研究但只是有点困难才能让它发挥作用。想法?
答案 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)
命名占位符与您的问题无关 而且他们不是“最好的选择”。它只是一种语法糖,非常不必要。
您的问题不是命名占位符,而是您无处不在的语法。
请在上面链接的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);
...