这是另一篇帖子(link)
的后续问题我正在尝试使用预准备语句来处理我如何执行mysql更新。我需要添加WHERE id =?..我很困惑我是如何从我的数组中获取的。谢谢!
我的表单:
<form action="update.php" method="post">
<input type="hidden" name="id" value=""/>
<input type="text" name="name" value=""/>
<input type="text" name="age" value=""/>
<input type="hidden" name="id" value=""/>
<input type="text" name="name" value=""/>
<input type="text" name="age" value=""/>
<input type="submit" value="submit" name="submit" />
</form>
PHP:
// Create statement object
$stmt = $db->stmt_init();
if (isset($_POST['submit'])) {
// Create a prepared statement
if($stmt->prepare("UPDATE contact SET (name, age) VALUES (?, ?)")) {
// Bind your variables to replace the ?s
$stmt->bind_param('si', $name, $age);
$returnedData = $_POST['data'];
for($i=0;$i<count($returnedData);$i+=3){
$id = $returnedData[$i]['id']
$name = $returnedData[$i+1]['name'];
$age = $returnedData[$i+2]['age'];
$stmt->execute();
}
// Close statement object
$stmt->close();
}
}
答案 0 :(得分:2)
表单中的数据会显示在$_POST['id']
,$_POST['name']
和$_POST['age']
中,但您未在所发布的代码中使用这些变量。
您实际上并未在表单中为id
设置值。你隐藏的ipputs看起来应该更像这样:
<input type="hidden" name="id" value="myID"/>
将返回$_POST['id'] == "myID"
另请注意,您的表单要求提供两组这些变量。除非你以某种方式修改名称,否则你不会看到第一组。
答案 1 :(得分:2)
首先,您需要在表单中使用数组样式名称:
<form action="update.php" method="post">
<input type="hidden" name="id[]" value=""/>
<input type="text" name="name[]" value=""/>
<input type="text" name="age[]" value=""/>
<input type="hidden" name="id[]" value=""/>
<input type="text" name="name[]" value=""/>
<input type="text" name="age[]" value=""/>
<input type="submit" value="submit" name="submit" />
</form>
我不知道你从哪里得到$_POST['data']
,这在你的表单中没有出现。 $_POST
的键是表单中输入元素的名称。
最后,如果您在查询中未包含WHERE
子句,则会更新表中的每个行。
// Create a prepared statement
if($stmt->prepare("UPDATE contact SET (name, age) VALUES (?, ?) WHERE id = ?")) {
// Bind your variables to replace the ?s
$stmt->bind_param('sii', $name, $age, $id);
for($i=0;$i<count($_POST['id']);$i++){
$id = $POST['id'][$i]
$name = $_POST['name'][$i];
$age = $_POST['age'][$i];
$stmt->execute();
}
// Close statement object
$stmt->close();
}