【问题标题】:CakePHP and AJAX to update Database without page refreshCakePHP 和 AJAX 在不刷新页面的情况下更新数据库
【发布时间】:2011-03-23 05:29:49
【问题描述】:

我正在使用 CakePHP 1.3.7,我正在尝试执行以下操作:

在给定的页面上,用户可以单击一个链接(或图像,或按钮,无关紧要),该链接传递一个保存到数据库中的参数。但是,所有这一切,无需刷新页面

我一直在做一些研究,我相信我也需要使用 AJAX 来完成这项工作。但是,我找不到一个很好的例子/解释如何做到这一点。

我认为这个想法是使用 AJAX 创建链接,它调用将接收变量作为参数的控制器/动作并执行操作以将其保存在数据库的相应字段/表中。

有人有我想做的小例子吗?或者也许指向我一些解释它的教程......提前非常感谢!

编辑

好的,谢谢大家的回复。他们没有直接工作,但我认为我越来越接近我想要的。这是我现在正在做的事情:

我认为有这段代码:

<div id="prev"><a>click me</a></div>

<div id="message_board"> </div>

我把这个JS文件叫做:

$(document).ready(function () {

$("#prev").click(function(event) {      
    $.ajax({data:{name:"John",id:"100"}, dataType:"html", success:function (data, textStatus) {$("#message_board").html(data);}, type:"post", url:"\/galleries\/add"});
    return false;
});
});

我在 galleries 控制器中的 add 操作如下所示:

function add() {

    $this->autoRender = false;  

    if($this->RequestHandler->isAjax()) {

    echo "<h2>Hello</h2>";
    print_r($this->data);
        $this->layout = 'ajax';

        if(!empty($this->data)) {

    $fields = array('phone' => 8, 'modified' => false);
        $this->User->id = 6;
            $this->User->save($fields, false, array('phone'));

        }
}
}

单击“#prev”元素时,我从 add 操作中得到响应,我知道是因为文本“Hello”打印在 #message_board 中。它在不刷新页面的情况下执行此操作,这就是我需要的原因。我的问题是我不能让 $.ajax() 函数发送任何数据,当它到达控制器时 $this->data 是空的,所以它永远不会进入将信息保存到数据库的 if 中(现在它保存只是一件简单的事情,但我希望它保存来自视图的数据)。

谁能看到我做错了什么?如何将数据发送到控制器?

【问题讨论】:

  • 更正并澄清了答案。
  • 阿尔伯特 print_r($_REQUEST);你可能会找到答案!
  • 我试过了,你是对的,我可以找到那里发送的数据。只是我认为 $this->data 将保存所有 POST 数据,但正如 Amadan 在下面解释的那样,它仅在通过表单提交数据时才起作用。非常感谢您的帮助!

标签: database ajax cakephp


【解决方案1】:

CakePHP 无关紧要,您需要的大部分代码都在客户端。自己实现 AJAX 是个痛点,所以你真的很想用一个库;目前最流行的可能是jQuery。他们的 AJAX 页面上有很多示例:http://api.jquery.com/jQuery.ajax/

所以,假设您在文档中有这样的内容:

<form id="s">
  <input id="q"/>
  <input type="submit" href="Search!"/>
</form>
<div id="r"/>

你可以把它放在 JavaScript 中:

$('#s').submit(function(evt) {
  evt.preventDefault();
  $.ajax({
    url: 'foo.php',
    data: {
        query: $('#q').val()
      },
    success: function(data) {
        $('#r').html(data);
      }
  });
  return false;
});

那么您的foo.php 只需返回将进入div#r 的HTML 片段。

编辑:我忘了停止提交 :( 感谢@Leo 的更正。

编辑:我知道你的困惑是什么。你不会得到data。我没有使用 CakePHP,但我认为 $this-&gt;data 是你从 $_REQUEST['data'] 得到的?你不会在服务器上得到它。 data 是提交内容的哈希值;您将直接获得$_REQUEST['name']$_REQUEST['id'](我假设将其转换为CakePHP 为$this-&gt;name$this-&gt;id)。

【讨论】:

  • 感谢您的回复!不过,我真正需要知道的是,我是否可以从视图调用控制器/动作来执行它所拥有的任何代码,而无需离开(或刷新)当前页面。
  • 如果不使用表单呢?这可能吗?我的意思是,点击一个链接...
  • 然后使用 $('some-selector').click(function(){...}) 而不是提交。您必须阅读有关 jQuery 的更多信息...
  • 抱歉,这对我不起作用...我确实读过有关 jQuery 的文章,但是当我必须将它与我的 CakePHP 网络混合使用时,我无法让它在这种情况下工作。跨度>
  • $this->data** 是一个包含您发送到服务器的变量的数组,我不太确定确切的格式。我相信要访问这些变量,它将类似于 **data['name']** 和 **data['id']**。无论如何,无论格式如何,在 **add()** 函数中执行 **empty($this->data)** 时,它不应该是真的(当然,如果我正确地这样做了) .也许我需要使用 dome other **dataType** 或其他东西,因为做 **$_REQUEST['variable'] 这不是你应该在 CakePHP 中做的,我相信。
【解决方案2】:

你需要添加

$('#s').submit(function(evt) {
evt.preventDefault();

为了防止页面刷新,就像在 Amadans 中的回答一样,只需在 url 变量中引用您的控制器/操作

$('#s').submit(function(evt) {
  $.ajax({
    url: '/patients/search/',
    data: {
        query: $('#q').val()
      },
    success: function(data) {
        $('#r').html(data);
      }

在患者/添加控制器操作中确保返回有效结果(在 json 中是好的)

【讨论】:

  • 我刚刚用新信息编辑了我的问题,我正在尝试做你在这里所做的事情,但没有表格。你能看看它,看看我做错了什么吗?谢谢!
  • 天啊!忘记了重要的一步!的确,你是对的。为了完整起见,我会忍者...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-24
  • 1970-01-01
  • 2015-03-26
相关资源
最近更新 更多