PHP / MYSQL:在for循环中的UPDATE查询再次运行相同的查询而不是循环遍历每个项目?

时间:2016-07-30 20:40:56

标签: php mysql

我正在设置一个有几种配置的页面。

所以我希望页面通过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' 

我做错了什么?

1 个答案:

答案 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);
    }
}