Я столкнулся с серьезной проблемой при изменении статуса определенной строки в таблице с <select>
.
Я использую jquery-Ajax так, вот идите в этом случае, когда нажимаете на <select
в любой конкретной строке для примера: Допустим, я изменил статус строки таблицы id 2
с Pending to Delivered. В этом событии триггера jquery change () вызывается значение из «тега» и отправляется значение в другой файл через ajax. До сих пор все идет правильно, данные проходят через ajax, а строка с определенным статусом id обновляется успешно.
Но на лицевой стороне он не изменяет статус конкретной строки. но он изменяет статус только первой строки.
Здесь мне нужно изменить статус конкретной строки.
Примечание. Я искал в stackoverflow для этого вопроса. но те не подошли близко к моему вопросу. Вот ссылки ниже. Ссылка 1 link2 link3
Вот вывод, и я объяснил детали в изображениях также
Существует полный код
HTML-страница: index.php
<?php include('processing.php'); $newobj = new processing(); ?> <html> <head> <title>Jquery Ajax select <tag> with PHP Mysql</title> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script> </head> <body> <table border="1"> <tr> <th>Id</th> <th>Product name</th> <th>Status</th> <th>Action</th> </tr> <?php echo $newobj->display();?> </table> <script> $(document).ready(function(){ $(".selectstatus").change(function(){ var statusname = $(this).val(); var getid = $(this).attr("status-id"); //alert(displid); $.ajax({ type:'POST', url:'ajaxreceiver.php', data:{statusname:statusname,getid:getid}, success:function(result){ $("#display").html(result); } }); }); }); </script> </body> </html>
в<?php include('processing.php'); $newobj = new processing(); ?> <html> <head> <title>Jquery Ajax select <tag> with PHP Mysql</title> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script> </head> <body> <table border="1"> <tr> <th>Id</th> <th>Product name</th> <th>Status</th> <th>Action</th> </tr> <?php echo $newobj->display();?> </table> <script> $(document).ready(function(){ $(".selectstatus").change(function(){ var statusname = $(this).val(); var getid = $(this).attr("status-id"); //alert(displid); $.ajax({ type:'POST', url:'ajaxreceiver.php', data:{statusname:statusname,getid:getid}, success:function(result){ $("#display").html(result); } }); }); }); </script> </body> </html>
AJAX HANDLER PAGE: ajaxreceiver.php
<?php include('processing.php'); $newobj = new processing(); if(isset($_POST['statusname'],$_POST['getid'])){ $statusid = $_POST['statusname']; $id = $_POST['getid']; $newobj->getdata($statusid,$id); } ?>
в<?php include('processing.php'); $newobj = new processing(); if(isset($_POST['statusname'],$_POST['getid'])){ $statusid = $_POST['statusname']; $id = $_POST['getid']; $newobj->getdata($statusid,$id); } ?>
PHP CLASSES FILE: processing.php
<?php class processing{ private $link; function __construct(){ $this->link= new mysqli('localhost','root','','example'); if(mysqli_connect_errno()){ die ("connection failed".mysqli_connect_errno()); } } function display(){ $sql = $this->link->stmt_init(); $id=1; if($sql->prepare("SELECT id,productname,status FROM ajaxselect")){ $sql->bind_result($id,$productname,$status); if($sql->execute()){ while($sql->fetch()){ ?> <tr> <td><?php echo $id;?></td> <td><?php echo $productname;?></td> <td><p id="display"><?php echo $status;?></p></td> <td> <select status-id=<?php echo $id;?> id="selectstatus" class="selectstatus"> <option>Pending</option> <option>Delivered</option> <option>Cancelled</option> <option>Amount Paid</option> </select> </td> </tr> <?php } } } } function getdata($statusid,$id){ $sql = $this->link->stmt_init(); if($sql->prepare("UPDATE ajaxselect SET status=? WHERE id=?")){ $sql->bind_param('si',$statusid,$id); if($sql->execute()){ echo $statusid; } else { echo "Update Failed"; } } } } ?>
в<?php class processing{ private $link; function __construct(){ $this->link= new mysqli('localhost','root','','example'); if(mysqli_connect_errno()){ die ("connection failed".mysqli_connect_errno()); } } function display(){ $sql = $this->link->stmt_init(); $id=1; if($sql->prepare("SELECT id,productname,status FROM ajaxselect")){ $sql->bind_result($id,$productname,$status); if($sql->execute()){ while($sql->fetch()){ ?> <tr> <td><?php echo $id;?></td> <td><?php echo $productname;?></td> <td><p id="display"><?php echo $status;?></p></td> <td> <select status-id=<?php echo $id;?> id="selectstatus" class="selectstatus"> <option>Pending</option> <option>Delivered</option> <option>Cancelled</option> <option>Amount Paid</option> </select> </td> </tr> <?php } } } } function getdata($statusid,$id){ $sql = $this->link->stmt_init(); if($sql->prepare("UPDATE ajaxselect SET status=? WHERE id=?")){ $sql->bind_param('si',$statusid,$id); if($sql->execute()){ echo $statusid; } else { echo "Update Failed"; } } } } ?>
В<?php class processing{ private $link; function __construct(){ $this->link= new mysqli('localhost','root','','example'); if(mysqli_connect_errno()){ die ("connection failed".mysqli_connect_errno()); } } function display(){ $sql = $this->link->stmt_init(); $id=1; if($sql->prepare("SELECT id,productname,status FROM ajaxselect")){ $sql->bind_result($id,$productname,$status); if($sql->execute()){ while($sql->fetch()){ ?> <tr> <td><?php echo $id;?></td> <td><?php echo $productname;?></td> <td><p id="display"><?php echo $status;?></p></td> <td> <select status-id=<?php echo $id;?> id="selectstatus" class="selectstatus"> <option>Pending</option> <option>Delivered</option> <option>Cancelled</option> <option>Amount Paid</option> </select> </td> </tr> <?php } } } } function getdata($statusid,$id){ $sql = $this->link->stmt_init(); if($sql->prepare("UPDATE ajaxselect SET status=? WHERE id=?")){ $sql->bind_param('si',$statusid,$id); if($sql->execute()){ echo $statusid; } else { echo "Update Failed"; } } } } ?>
проблема в этой строке:
$("#display").html(result);
так что здесь происходит?
вы создаете идентификатор display
для каждой строки, что не является хорошей практикой, особенно в вашем конкретном случае.
существуют различные решения этой проблемы,
1)
("#display", $(this).parent().parent()).html(result);
здесь вы собираетесь применить действие к определенному ID
который принадлежит родительскому элементу родителя определенного класса, который получил действие изменения
2)
давая уникальный идентификатор строки отображения для каждой строки
например, следующим образом:
<td><p id="display_<?php echo $id; ?>"><?php echo $status;?></p></td>
и затем примените свое действие к нему напрямую,
$("#display_" + getid).html(result);
3)
и это решение аналогично предыдущему, предоставив родительскому <tr>
уникальный идентификатор
например :-
<tr id='parent_<?php echo $id; ?>'>
а затем примените свое действие от своего ajax, как это
$("#display", $('#parent_' + getid)).html(result);
или даже :
$('#parent_' + getid + ' #display').html(result);
Да, есть проблема в $("#display").html(result);
line, потому что id ( $("#display")
) всегда выбирает первый элемент, найденный в DOM, вы можете его исправить –
<script> $(document).ready(function(){ $(".selectstatus").change(function(){ // make jquery object that make reference to select in which click event is clicked $this = $(this); var statusname = $(this).val(); var getid = $(this).attr("status-id"); //alert(displid); $.ajax({ type:'POST', url:'ajaxreceiver.php', data:{statusname:statusname,getid:getid}, success:function(result){ // this refer to the ajax callback function so we have to use $this which is initialized before ajax call $($this).parents('tr').find("#display").html(result); } }); }); }); </script>