我正在尝试根据文本框中的值更新我的数据库。第一个 foreach 循环工作正常($emails是从另一个类中抓取的),但在第二个循环中,我无法在不获取未定义的索引错误的情况下获取每个表单的名称("form_UD")。我也非常确定我在第二个 foreach 循环中的语法是错误的。我试图做的是检查对于这些表单中的每一个,如果用户单击其相应的"btn_update"按钮,则调用$RUD类的updateEmail方法并插入此按钮中的值,以及表单的相应"input_email"值中的值。
foreach ($emails as $email) {
echo "<li>
<form action='' method='POST' id='form_email' name='form_UD'>
<input type='text' value='" . $email['news_email'] . "' name='input_email'/>
<button type='submit' class='btn_update' name='btn_update' value='" . $email['news_id'] . "'>Update</button>
</form>
</li>";
}
foreach (($_POST['form_UD']) as $form) {
if ((isset($form->$_POST['btn_update']))) {
$RUD->updateEmail($form->$_POST['btn_update'], $form->$_POST['input_email']);
}
编辑:新想法:
<form action='' method='POST' id='form_email'>
<ul>
<?php
foreach ($emails as $email) {
echo "<li>
<input type='text' value='" . $email['news_email'] . "' name='input_email" . $email['news_id'] . "'/>
<button type='submit' class='btn_update' name='btn_update" . $email['news_id'] . "' value='" . $email['news_id'] . "'>Update</button>
</li>";
}
foreach ($emails as $email) {
if (isset($_POST['btn_update' . $email['news_id']])) {
echo $_POST['btn_update' . $email['news_id']];
echo $_POST['input_email' . $email['news_id']];
$RUD->updateEmail(($_POST['btn_update' . $email['news_id']]), ($_POST['input_email' . $email['news_id']]));
}
}
?>
</ul>
</form>
echo 语句在单击时获取正确的值。顺便说一下,$RUD是在同一文件中的其他地方实例化的。这让我相信处理更新的方法可能存在问题?在这里:
public function updateEmail($id, $email){
$db = Dbclass::getDB();
$query = "UPDATE newsletter
SET news_email = :email,
WHERE id = :id ";
$statement = $db->prepare($query);
$statement->bindParam(':id', $id);
$statement->bindParam(':email', $email, PDO::PARAM_STR, 100);
$statement->execute();
}
Dbclass:getDB() 确实有效。我用其他方法确认了它。
我可能是错的 - 但我认为这是不可能的,除非您通过 XHR 提交。 原因是您有 1 个提交按钮到 1 个表单来提交该表单 - 您不能从提交表单中提交许多表单,它只会提交提交按钮作为子元素存在的表单,它将到达您的 $_POST。
如果没有客户端脚本并将语句准备为 $_GET 请求或 XHR 帖子(也可以通过 XHR 使用),则无法通过 1 个按钮提交所有表单。 通常,当您希望输入作为数组值到达时,您会在名称中使用 [] 命名输入,以将其表示为表单上的数组。
您似乎正在尝试将表单用作数组,并假设它作为对象数组到达,所有输入元素都作为以表单命名的属性的数组元素 - 这不是这样工作的。 也许现在有一些我还没有见过或接触过的 PHP 的更黑暗的艺术,但我对此表示怀疑,我已经有一段时间没有用这种方法处理表单了。
退房: 一键提交多个表单 了解如何通过 XHR 执行此操作。
有关 XHR 的更多详细信息:http://www.w3schools.com/ajax/ajax_xmlhttprequest_create.asp
查看此链接以获取HTML5表单标准:https://www.w3.org/TR/html5/forms.html
可以在这里找到更简单的文章:http://www.w3schools.com/html/html_forms.asp
进一步阅读有关它如何与 PHP 一起工作的信息:http://www.w3schools.com/php/php_forms.asp
最后阅读以下内容,了解 $_POST 的工作原理:http://php.net/manual/en/reserved.variables.post.php
同样,我可能是错的,但这是值得怀疑的。
从下面的注释中添加了调试代码的示例:
if (isset($_POST) && count($_POST) > 0) {
print_r($_POST);
die();
}
这是工作代码:
主 PHP 文件:
<form action="" method="POST" id="form_email">
<ul>
<?php
foreach ($emails as $email) {
echo "<li>
<input type='text' value='" . $email['news_email'] . "' name='input_email" . $email['news_id'] . "'/>
<button type='submit' class='btn_update' name='btn_update" . $email['news_id'] . "' value='" . $email['news_id'] . "'>Update</button>
</li>";
}
foreach ($emails as $email) {
if (isset($_POST['btn_update' . $email['news_id']])) {
$RUD->updateEmail(($_POST['btn_update' . $email['news_id']]), ($_POST['input_email' . $email['news_id']]));
}
}
?>
</ul>
</form>
RUD 类中的方法:
public function updateEmail($id, $email){
$db = Dbclass::getDB();
$query = "UPDATE newsletter
SET news_email = :email
WHERE news_id = :id ";
$statement = $db->prepare($query);
$statement->bindParam(':id', $id);
$statement->bindParam(':email', $email, PDO::PARAM_STR, 100);
$statement->execute();
}
我的 SQL 语句中有一些愚蠢的错别字/错误......删除了 WHERE 子句中":email"后面的逗号,并将"id"更新为表中正确的"news_id"。医 管 局!