【问题标题】:Ajax execute successfully but didn't update databaseAjax 执行成功但没有更新数据库
【发布时间】:2017-08-28 05:55:21
【问题描述】:

我在每一行都有带有编辑按钮的表格。然后我有 ajax 功能,按钮编辑/保存应该在数据库中保存新值但不更新它。

在控制台中,我看到它正在返回Success,并且参数传递正确。

这是我的按钮

foreach ($row as $r){
    echo '<tr id="row-'.$r['rate_id'].'">
             <td id="people-'.$r['number_of_people'].'">'.$r['number_of_people'].'</td>                        
             <td id="price_val-'.$r['rate_id'].'">$ '.$r['price_per_people'].'</td>
             <td>
                  <button id="edit_button'.$r['rate_id'].'" onclick="edit_row('.$r['rate_id'].')" class="btn btn-primary edit_button">Edit</button>
                  <input type="button" class="save_button" id="save_button'.$r['rate_id'].'" value="save" onclick="save_row('.$r['rate_id'].')">
             </td>
          </tr>';       
}

ajax函数

function edit_row(id)
{
 var price=document.getElementById("price_val-"+id).innerHTML;
 document.getElementById("price_val-"+id).innerHTML="<input type='text' id='price-"+id+"' value='"+price+"'>";

 document.getElementById("edit_button"+id).style.display="none";
 document.getElementById("save_button"+id).style.display="block";
}

function save_row(id)
{
 var price=document.getElementById("price-"+id).value;

 $.ajax
 ({
  type:'post',
  url:'includes/update.php',
  data:{
   edit_row:'edit_row',
   row_id:id,
   price_val:price,
  },
  success:function(response) {
   if(response=="success")
   {
    document.getElementById("price_val-"+id).innerHTML=price;
    document.getElementById("edit_button"+id).style.display="block";
    document.getElementById("save_button"+id).style.display="none";
   }
  }
 });
}

这是update.php

require 'connection.php';

if(isset($_POST['edit_row']))
{


    $sql = "UPDATE new_rates SET price_per_people = :price_for_people WHERE rate_id = :rate_id";
    $stmt = $db_con->prepare($sql);                                  
    $stmt->bindParam(':price_for_people', $_POST['price_val']);       
    $stmt->bindParam(':rate_id', $_POST['row_id']);      
    $stmt->execute(); 

    echo "success";
    exit(); 
}

在控制台中我看到了

edit_row:edit_row
row_id:1
price_val:$ 12

这似乎是正确的,但我不确定美元符号$,因为我没有将它保存在数据库中。必须只保存价格12

有人可以帮我清理一下并让它工作吗?由于success 即将出现在控制台上,我有点迷失了可能是什么问题。

【问题讨论】:

  • 你能打印最后执行的查询吗?
  • 我不知道该怎么做。
  • @MagnusEriksson 这条线 document.getElementById("price_val-"+id).innerHTML="&lt;input type='text' id='price-"+id+"' value='"+price+"'&gt;"; 没有传递价格 - id='price-"+id+"'
  • 更新是否发生在数据库中?
  • 您的price_per_people 列是什么数据类型?如果它是数字,它不会接受像"$ 12" 这样的值。仅供参考,$ 前缀来自document.getElementById("price_val-"+id).innerHTML,因为您的&lt;td&gt; 标签中有$

标签: javascript php ajax


【解决方案1】:

我不会创建和删除&lt;input&gt; 字段,而是将其隐藏并切换其可见性。例如

foreach ($row as $r) : ?>
<tr id="row-<?= $r['rate_id'] ?>">
  <td id="people-<?= $r['number_of_people']?>"><?= $r['number_of_people'] ?></td>                        
  <td>
    $ <span id="price_val-<?= $r['rate_id'] ?>"><?= $r['price_per_people']?></span>
    <input style="display:none" type="number" min="0.00" step="0.01" value="<?= $r['price_per_people'] ?>" id="price-<?= $r['rate_id'] ?>">
  </td>
  <!-- and so on -->
</tr>
<?php endforeach ?>

在您的 JS 中,只需切换元素的可见性。你的 JS 代码的其余部分应该是正确的。

例如

function edit_row(id) {
  var showThese = ['price-', 'save_button'].map(prefix => '#' + prefix + id).join(',')
  var hideThese = ['price_val', 'edit_button'].map(prefix => '#' + prefix + id).join(',')
  $(showThese).show()
  $(hideThese).hide()
}

在你的成功回调中

$('#price_val-' + id).text(price)
var hideThese = ['price-', 'save_button'].map(prefix => '#' + prefix + id).join(',')
var showThese = ['price_val', 'edit_button'].map(prefix => '#' + prefix + id).join(',')
$(showThese).show()
$(hideThese).hide()

注意我使用了 PHP 的替代语法。使用echo 创建一堆大部分是静态的 HTML 通常会导致问题。

【讨论】:

  • 感谢您的回答。关于JS部分的问题。我应该把它放在哪个函数或行上?
  • @Peter 在您的edit_row 和成功回调中。它取代了创建&lt;input&gt; 的需要。为了清楚起见,我会更新我的答案
猜你喜欢
  • 2012-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-20
  • 1970-01-01
  • 2017-08-26
  • 1970-01-01
相关资源
最近更新 更多