Codeigniter / jQuery更新数据库,无需重新加载/重定向

时间:2012-04-20 14:28:31

标签: jquery database codeigniter

我一直在尝试更新数据库行而不必重新加载页面或重定向到另一个页面来提交查询。我尽我所能,但没有运气。我有一个画廊页面。当用户提交作品时,默认情况下它不被批准,并且可以由授权用户(例如主持人)批准。主持人页面列出了未经批准的艺术作品。该数据库有一个名为approved的列,其值为0或1.

这是我的代码。

更新:

非常感谢您抽出宝贵时间。我做了你说的改变,但它仍然无法正常工作。不可否认,我对jQuery / Ajax并不是那么好,所以我的错误就是为什么它不起作用。我的代码现在是这样的:

模特功能:

function approve($id)
{
    $this->db->where('id', $id);
    $this->db->update('galeri', array('approved' => '1')); 
    return TRUE;
}

控制器

function approve($id)
{
    if ($this->galeri->approve($id)) {
        echo("VALID");
    }
}

HTML

.
.
.
<script type="text/javascript">
        $(document).ready(function() {

            var test = $("a.approval").attr("id").replace('artid-','');
            $.ajax({
                  type: 'post',
                  url: 'approve',
                  data: test,
                  beforeSend: function() {
                    parent.animate({'backgroundColor':'#fb6c6c'},300);
                  },
                  success: function(data, textStatus, jqXHR) {
                    if (data == "VALID") {
                        parent.slideUp(300,function() {
                          parent.remove();
                        });
                    };
                  }
            });
          });
        });
    </script>
.
.
.
    <?php foreach ($query->result() as $list): ?>
        <span style="display: block">
            <?php echo $list->path; ?> -- <a href="javascript:void(0)" id="artid-<?php echo $list->id; ?>'" class="approval">Approve artwork</a>
        </span>
    <?php endforeach; ?>
.
.
.

3 个答案:

答案 0 :(得分:2)

你不回应任何东西,因此成功不会评估任何事情

尝试添加:

PHP

function approve($id) {
    $this->db->where('id', $id);
    $this->db->update('galeri', array('approved' => '1')); 
    return TRUE; // you could use several dif methods to check if updated
}

function approve($id) {
    if ($this->galeri->approve($id)) {
       echo("VALID");
    }
}

AJAX

$.ajax({
      type: 'post',
      url: 'approve',
      data: test, // Not sure what to put here. 
      beforeSend: function() {
        parent.animate({'backgroundColor':'#fb6c6c'},300);
      },
      success: function(data, textStatus, jqXHR) {
        if (data == "VALID") {
            parent.slideUp(300,function() {
              parent.remove();
            });
        };
      }
});

另外,我建议您删除链接上的“e.preventDefault”以获取严重的原因

  • 你不必在链接上点击命令
  • 如果你这样做,将它的href设置为javascript:void(0),效果与e.preventDefault一样好,可能的交叉浏览器功能读取问题(组织?)
  • 如前所述,某些浏览器的某些版本(咳嗽即咳嗽)不喜欢在功能开始时看到e.preventDefault,我不记得是什么版本,但我曾经遇到过这个问题而几乎让我疯狂搞清楚我不得不删除我的防止默认! (LOL)

答案 1 :(得分:0)

我认为你应该在某些事件上触发那个jquery / ajax请求。所以如果我认为你在用户点击批准链接时试图执行那个ajax,那么尝试这样的事情:

<script type="text/javascript">
        $(document).ready(function() {

       $('.approval').each(function(){
                  $(this).click(function(){
               var test = $("a.approval").attr("id").replace('artid-','');
            $.ajax({
                  type: 'post',
                  url: 'approve',
                  data: test,
                  beforeSend: function() {
                    parent.animate({'backgroundColor':'#fb6c6c'},300);
                  },
                  success: function(data, textStatus, jqXHR) {
                    if (data == "VALID") {
                        parent.slideUp(300,function() {
                          parent.remove();
                        });
                    };
                  }
            });
          });

      });
    });


        });
    </script>
.
.
.
    <?php foreach ($query->result() as $list): ?>
        <span style="display: block">
            <?php echo $list->path; ?> -- <a href="javascript:void(0)" id="artid-<?php echo $list->id; ?>'" class="approval">Approve artwork</a>
        </span>
    <?php endforeach; ?>
.
.
.

请检查config.php文件中的global_csrf保护是否设置为false。

$config['csrf_protection'] = TRUE;

如果设置为true,那么您还需要在ajax请求中传递csrf令牌,否则codeigniter将不会执行您的请求。

答案 2 :(得分:0)

谢谢你们抽出时间回答。我发现问题是$ .ajax的'data'属性。这就是我提出的解决方案(正是按照我想要的方式工作):

<script type="text/javascript">
        $(document).ready(function () {
            $('a.approval').click(function () {
                var test = $(this).attr('id');
                $.ajax({   
                    url: "site/approve/"+test, 
                    type: "POST", 
                    // data: test,
                    success: function(data) {

                        $('.asdf-'+test).css("background-color", "green");
                    }
                })
            });
        });
</script>

这是一种使用$ .ajax的健康方式,我想知道。