【问题标题】:Multi Delete using checkbox使用复选框多删除
【发布时间】:2011-05-22 07:00:37
【问题描述】:

我正在学习 Cakephp,我一直在尝试使用复选框删除多个(选中的)记录,但仍然没有成功。这是我的 jQuery :

            var ids = [];
  $(':checkbox:checked').each(function(index){
   ids[index] = $(this).val();;
   alert(ids[index]);

  });

  //alert(ids);
  var formData = $(this).parents('form').serialize();


  $.ajax({
         type: "POST",
         url: "tickets/multi_delete",
         data:"id="+ids,
         success: function() {
     alert('Record has been delete');
    },
    error:  function(XMLHttpRequest, textStatus, errorThrown) {
       alert(XMLHttpRequest);
       alert(textStatus);
       alert(errorThrown); 
             }
   });

这是控制器中的代码:

function multi_delete() {
  $delrec=$_GET['id'];
  //debuger::dump($del_rec);
  foreach ($delrec as $id) {

   $sql="DELETE FROM tickets where id=".$id;

   $this->Ticket->query($sql);
  }; 


 }

请任何人帮助我。谢谢

【问题讨论】:

  • 您可以在 ID 数组上尝试 .join(','),然后在服务器端尝试 explode() 以获取传递给脚本的 ID 数组。
  • 小心 - 这看起来像 sql 注入在这里真的会伤害你。你不应该使用 $_GET 数据而不对其进行清理
  • 请使用$this->Ticket->deleteAll(array('id' => /* array of ids */)) 使用Cake 为您提供的SQL 注入预防和抽象。您不应该编写手动 SQL,除非没有其他方法可以让 Cake 做您想做的事。 book.cakephp.org/complete/1000/Models#Deleting-Data-1035
  • 您在 AJAX 调用中使用 POST,然后在 PHP 中使用 _GET。这不会引起问题吗?或者您可以从 _GET 访问 POST 变量吗?
  • 我支持 deceze 所说的,另外,对于您的 AJAX 调用,CakePHP 中已经有一个带有 Prototype 库的组件。一个简单的$ajax->form() 可以创建您需要的一切。

标签: php jquery ajax cakephp checkbox


【解决方案1】:

您可以在 ID 数组上尝试 .join(','),然后在服务器端尝试 explode() 以将 ID 数组传递给脚本。

例如

var idStr = ids.join(','); 

将它 (idStr) 传递给 ajax 调用

$.ajax({
     type: "POST",
     url: "tickets/multi_delete",
     data: {id:idStr},
    //more code cont.

在服务器端:

$ids = explode(',',$_POST['ids']);

检查 jquery 文档中的 jquery.param() 函数。将 and 应用于 IDS 数组,然后将其传递给 $.ajax({});

注意:您在提供的代码中使用的是 POST 而不是 GET HTTP METHOD

【讨论】:

  • 其实我试过炸 $ids = explode(',',$_POST['ids']);但仍然无法正常工作。它总是报告成功,但什么也不做,数据仍在表数据库中。
  • 似乎错误在数据中:{id:idStr},未定义索引:ids
  • 抱歉,未定义索引:ticket/delete2 中的 idStr
【解决方案2】:

使用json编解码进行序列化数据传输

【讨论】:

    【解决方案3】:

    由于jQuery默认不支持JSON编码,请下载JSON Plugin for jQuery

    你的 javascript 然后变成:

    $.ajax({
         type: "POST",
         url: "tickets/multi_delete",
         data: { records: $.toJSON(ids) },
         success: function() {
             alert('Records have been deleted.');
         },
    });
    

    控制器中:

    var $components = array('RequestHandler');
    
    function multi_delete() {
            if (!$this->RequestHandler->isAjax()) {
                die();
            }
            $records = $_POST['records'];
            if (version_compare(PHP_VERSION,"5.2","<")) {
                require_once("./JSON.php"); //if php<5.2 need JSON class
                $json = new Services_JSON();//instantiate new json object
                $selectedRows = $json->decode(stripslashes($records));//decode the data from json format
            } else {
                $selectedRows = json_decode(stripslashes($records));//decode the data from json format
            }
            $this->Ticket->deleteAll(array('Ticket.id' => $selectedRows));
            $total = $this->Ticket->getAffectedRows();
            $success = ($total > 0) ? 'true' : 'false';
            $this->set(compact('success', 'total'));
        }
    

    RequestHandler 组件确保这是一个 AJAX 请求。这是可选的。

    对应的视图

    <?php echo '({ "success": ' . $success . ', "total": ' . $total . '})'; ?>
    

    祝你好运!

    【讨论】:

      猜你喜欢
      • 2014-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 2014-08-05
      • 2012-04-26
      • 1970-01-01
      相关资源
      最近更新 更多