【问题标题】:PHP multiple select - option data sending with ajax [duplicate]PHP多选 - 使用ajax发送选项数据[重复]
【发布时间】:2016-10-19 22:28:20
【问题描述】:

我想通过选择下拉字段更改数据库中的状态。 我用ajax发送。第一行一直在工作,但有多个数据我无法更新第二、第三……等等

我尝试使用 serialize(),但它不起作用。

从数据库中选择:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://code.jquery.com/jquery-1.11.3.js"></script> 
<script type="text/javascript">
    $(document).ready(function(){
        $(".allbooks").change(function(){
            var allbooks = $(this).val();
            var dataString = "allbooks="+allbooks;
            $.ajax({
                type: "POST",
                data: dataString,
                url: "get-data.php",
                success: function(result){
                    $("#show").html(result);
                }
            });

        });
    });
</script>

</head>
<body>
 <?php
    define("HOST","localhost");
    define("USER","root");
    define("PASSWORD","");
    define("DATABASE","hotel");
    $euConn = mysqli_connect(HOST, USER, PASSWORD, DATABASE);

  $selectRooms = "SELECT * FROM proba WHERE status='inRoom'";
   $resultRooms = mysqli_query($euConn,$selectRooms);
     if (mysqli_num_rows($resultRooms) > 0) {
    echo "<div id='reserved' align='center'>";
   While ($row = mysqli_fetch_array($resultRooms)) {
    echo $row[1];
    echo $row[0];
?>

<select name="allbooks" id="allbooks">
<option name="years">Choose</option>
<?php

for($i=1; $i<=19; $i++)
{
    echo "<option value=".$i.">".$i."</option>";
}
?>
 </select><br />

<?php }

 }

else
echo "<h4>nothing in the db</h4></div>";
?>
<div id="show">
</div>
</body>
</html>

并得到结果:

if(!empty($_POST["allbooks"])) {
var_dump($_POST);
    $id = 2;
    //echo $_POST['modelS'];
    $room = $_POST['allbooks'];
    $sql2 = "UPDATE proba SET room='$room' WHERE id_reservation='$id'";
    $query = mysqli_query($euConn, $sql2);
var_dump($query);
}

如何改变,或者什么是简单的解决方案?感谢您的帮助。

【问题讨论】:

  • 你能更好地解释一下这是如何失败的吗? “第一行一直在工作,但有多个数据我无法更新第二、第三……等等”很模糊
  • 一张图片有助于更好地理解问题?
  • 您是说在呈现的页面上有多个元素与id allbooks?如果是这样,那就错了,ID 必须是唯一的。您想将它们更改为一个类并使用$(".allbooks").change(function(){ ....
  • 另外,如果每一行都有自己的 show 元素,你也需要在那里使用一个类,比如 .show 而不是 #show 并且你需要定位正确的元素。你如何做到这一点将取决于你的html。我举了一个例子,但你没有显示所有的 html,所以我不能
  • @barmar 这个问题根本不是关于从multi-select 传递多个选项的问题,OP 有 多个选择框,如其中,它们有多个并且他们对所有人都使用相同的ID。这不是这些问题的重复

标签: php jquery ajax select


【解决方案1】:

您在呈现的页面上有多个select 元素,ID 为allbooks 这是错误的,ID 必须是唯一的。您需要将它们更改为一个类并使用$(".allbooks").change(function(){ ....

就将行 ID 发送到服务器进行更新时,您需要先将行 ID 添加到选择框中,以便稍后检索它,类似 '&lt;select name="allbooks" class="allbooks" data-row-id="' . $row['id_reservation'] . '"&gt; 的方法会起作用。

我还建议将工作分成几个函数,以更好地组织代码(类会更好)

如果不访问数据库就很难进行测试,但这应该可以为您完成。请注意,我在同一页面上有更新功能,并将 ajax url 属性更新为 '',这会将数据发送到当前页面的新实例以处理更新。

<?php
require_once ("db_config.php");


function updateRoom($euConn, $newRoomVal, $id)
{
    $stmt = $euConn->prepare("UPDATE proba SET room=? WHERE id_reservation=?");
    $stmt->bind_param('ii', $newRoomVal, $id);
    /* execute prepared statement */
    $stmt->execute();
    /* close statement and connection */
    $affectedRows = mysqli_stmt_affected_rows($stmt) > 0;
    $stmt->close();
    return $affectedRows;
}
function getRooms($euConn)
{
    $selectRooms = "SELECT * FROM proba WHERE status='inRoom'";
    $resultRooms = mysqli_query($euConn,$selectRooms);
    $rows = mysqli_fetch_all($resultRooms,MYSQLI_ASSOC);
    return count($rows) < 1 ? '<h4>nothing in the db</h4></div>' : createSections($rows);
}

function createSections($rows)
{
    $sections = [];
    foreach( $rows as $row){
        $options = [];
        for ($i = 1; $i <= 19; $i++)
            $options[] = "<option value=" . $i . ">" . $i . "</option>";
        $options = implode('', $options);
        $select = '<select name="allbooks" class="allbooks" data-row-id="' . $row['id_reservation'] . '"><option value="">Choose</option>' . $options . '</select><br/>';
        // .. build all your other row elements here....
        $section = 'some other compiled html'.$select;
        $sections[]=$section;
    }
    return implode('', $sections);
}

$euConn = mysqli_connect(HOST, USER, PASSWORD, DATABASE); 

if(isset($_POST["allbooks"]) && $_POST["allbooks"] !='') {
    $updated = updateRoom($euConn,$_POST["allbooks"],$_POST["rowId"] );
    echo json_encode(['success'=>$updated]);
    exit;
}

$pageSections = getRooms($euConn);
?>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://code.jquery.com/jquery-1.11.3.js"></script>
    <script type="text/javascript">
        $(document).ready(function(){
            $(".allbooks").change(function(){
                var $this = $(this);
                var allbooks = $this.val();
                var rowId = $this.data('row-id');
                var dataString = "allbooks="+allbooks+'&rowId='+rowId;
                $.ajax({
                    type: "POST",
                    data: dataString,
                    url: "",
                    success: function(result){
                        $("#show").html(result);
                    }
                });

            });
        });
    </script>
</head>
<body>

<div id='reserved' align='center'>
<?php echo $pageSections ?>
<div id="show">
</div>
</body>
</html>

【讨论】:

  • @Janos 已编辑以包含该行
  • @Janos 已更新以解决关闭连接的问题。但是,我不确定您所说的“每次都是错误的。它不会运行。”是什么意思。你能再解释一下吗?
  • @Janos 你确定你正在为$newRoomVal 传递一个新值吗? UPDATE 语句足够聪明,可以知道何时用相同的数据更新了一行,在这种情况下,实际上不会发生更新,mysqli_stmt_affected_rows 将返回0。只有当数据实际发生变化时,行才会受到影响。在`updateRoom`里面添加var_dump( $id, $newRoomVal),输出是否如你所愿?
  • @Janos 实际上,我在该函数的签名中的参数乱序。请更新至function updateRoom($euConn, $newRoomVal, $id) 并尝试
  • 是的,这就是问题所在,谢谢你的帮助!!
猜你喜欢
  • 2017-11-15
  • 2012-03-18
  • 1970-01-01
  • 2021-05-11
  • 2016-03-19
  • 2011-02-09
  • 1970-01-01
  • 2021-05-25
  • 2013-12-25
相关资源
最近更新 更多