我正在设置一个有几种配置的页面。
所以我希望页面通过SELECT查询从数据库中提取内容,将其显示给用户,并让用户能够更新它并使用UPDATE将其保存到数据库中。
$buscarTemplates = " SELECT mailNombre, mailAsunto, mailMensaje, mailDetalle
FROM configMailsUsuarios
while loop
显示可用选项列表:$mostrarTemplates = mysqli_query($conectar,$buscarTemplates);
while ($mails=mysqli_fetch_array($mostrarTemplates)) {
echo '<h4>'.$mails['mailDetalle'].'</h4>';
echo '<div class="form-group">
<input type="text" name="mailNombre" value="'.$mails['mailNombre'].'" readonly>
<label for="mailAsunto">Asunto:</label>
<input type="text" name="mailAsunto" value="'.$mails['mailAsunto'].'">
</div>';
echo '<textarea class="form-control" name="mailMensaje" rows="4">'.$mails['mailMensaje'].'</textarea>';
}
if(isset($_POST['submit'])) {
$itemsFetched = mysqli_num_rows($mostrarTemplates);
for ($i=0; $i < $itemsFetched; $i++) {
$mailNombre = $_POST['mailNombre'];
$mailAsunto = $_POST['mailAsunto'];
$mailMensaje = $_POST['mailMensaje'];
$guardarTemplates = "UPDATE configMailsUsuarios
SET mailAsunto = '$mailAsunto',
mailMensaje = '$mailMensaje'
WHERE mailNombre = '$mailNombre'
";
if (mysqli_query($conectar,$guardarTemplates)) {
echo 'Configuraciones guardadas exitosamente.<br>';
echo '<a href="templateMails.php"><input type="submit" name="submit" class="btn btn-danger btn-xs" value="Recargar la página"></input></a><br>';
} else {
echo 'Oops!';
}
}
问题是获取的列表中有两个项目,只有第二个项目被保存。
This is what it is currently in the database table "configMailsUsuarios":
mail ID --- mailNombre ------ mailAsunto ----- mailMensaje -- mailDetalle
1 --------- mailBienvenida -- AvisoA --------- mensajeA ----- XXY
1 --------- mailMorosos ----- AvisoB --------- mensajeB ----- YYX
所以,我尝试使用echo $guardarTemplates.'<br>';
打印出for循环中实际返回的查询内容
结果显示循环运行两次(如预期的那样),用户输入新信息,但完全相同的查询,只需要列表中的第二项:
UPDATE configMailsUsuarios SET mailAsunto = 'Aviso2', mailMensaje = 'whatever' WHERE mailNombre = 'mailMorosos'
UPDATE configMailsUsuarios SET mailAsunto = 'Aviso2', mailMensaje = 'whatever' WHERE mailNombre = 'mailMorosos'
预期结果应该是第一行并更新它,然后是第二行:
UPDATE configMailsUsuarios SET mailAsunto = 'Aviso1', mailMensaje = 'blah blah' WHERE mailNombre = 'mailBienvenida'
UPDATE configMailsUsuarios SET mailAsunto = 'Aviso2', mailMensaje = 'whatever' WHERE mailNombre = 'mailMorosos'
我做错了什么?
答案 0 :(得分:1)
<input type="text" name="mailNombre[]" value="'.$mails['mailNombre'].'" readonly>
<input type="text" name="mailAsunto[]" value="'.$mails['mailAsunto'].'">
那些应该是数组,否则第一个被最后一个覆盖。
然后你必须稍微更改你的脚本,所以它访问你的$ _POST数组的正确索引,你已经设置了for循环以便这样做,但你应该通过元素的数量来定义它在您的请求中或向我们显示$itemsFetched = mysqli_num_rows($mostrarTemplates);
中的数据。
您应该查看How can I prevent SQL injection in PHP?因为您没有使用预准备语句,所以您的脚本容易受到攻击。
在foreach循环中,您可以访问以下字段:
if(isset($_POST['submit'])){
foreach ($_POST['mailNombre'] as $key => $value) {
$stmt = mysqli_prepare($link, "UPDATE configMailsUsuarios
SET mailAsunto = ?, mailMensaje = ?
WHERE mailNombre = ?");
mysqli_stmt_bind_param($stmt, "sss", $mailNombre, $mailAsunto, $mailMensaje);
$mailNombre = $_POST['mailNombre'][$key];
$mailAsunto = $_POST['mailAsunto'][$key];
$mailMensaje = $_POST['mailMensaje'][$key];
mysqli_stmt_execute($stmt);
}
}