【问题标题】:Call a php function in MVC using AJAX?使用 AJAX 在 MVC 中调用 php 函数?
【发布时间】:2015-07-10 12:52:11
【问题描述】:

我目前正在将已构建的 Web 应用程序迁移到 MVC,并且我发现我太新手了,无法进行某些更改。有一些 ajax 调用让我感到害怕。我会尽量说清楚,但由于我缺乏经验,我不确定是否会顺便透露一些重要信息。

重点是在旧的应用程序中,事情是这样的:

在php代码中:

    if ($action_user == 'show_alerts') {
        $list = array();
        $query = "SELECT alert_type FROM alert_contact WHERE NOT 
        deleted AND user_email=" . typeFormat($email);
        $result = mysqli_query($db, $query) or die('Error in query "'.$query . '": ' . mysqli_error($db));
        while ($db_field = mysqli_fetch_assoc($result)) {
        $list[] = $db_field['alert_type'];
        }
        echo json_encode($list);

在jquery代码中:

    $.ajax({
            type: 'POST',
            url: 'userpost.php',
            data: $('#userForm').serialize(),
            cache: false,
            dataType: 'json'

我的问题来了,因为我不再有 userpost.php 文件,我必须将它发送到 index.php 并通过 get 请愿书调用我的用户组件,我不喜欢,但是我找不到另一种方法来做到这一点。而且,更糟糕的是,我根本不知道 ajax 是如何获得它需要的变量的。这一定是一个非常基本的错误,但我承认我目前的技能不太好。这就是我在我的版本中所做的:

在php代码中:

    if ($action_user == 'show_alerts') {
            $list = ModelUser::getAlertContact($act_email);
            echo json_encode($list);//I predict that ajax don't reach this line, but not sure
    }

在jquery代码中:

$.ajax({
        type: 'POST',
        url: 'index.php?option=users',
        data: $('#userForm').serialize(),
        cache: false,
        dataType: 'json',
    success: function(data) {
        alert ('gotcha');
        $.each(alertsarray, function(index, value) {
            if ($.inArray(value, data) === -1) {
                $("#sub" + value).prop("checked", false);
                $('#alert' + value).removeClass("list_alert_sub");
            }
            else {
                $("#sub" + value).prop("checked", true);
                $('#alert' + value).addClass("list_alert_sub");
            }
        });
    },
    error: function(data) {
        alert("¡Error (ajax)!");
    }
});

任何帮助将不胜感激,如果我错过了更多信息,请告诉我。提前致谢。

更新:

我已经取得了一些进展,但似乎没有找到真正的解决方案。现在我知道 url 必须是控制器,所以我使用 'components/userpost/controller.php' 作为它,它到达 ajax 调用,导致出现成功警报。问题是 MVC 方式,因为我将 ajax 发送到控制器,但由于我没有在页面中重新加载,所以所有包含都失败了,所以它们显然没有被加载,我收到这样的错误:

PHP 警告:include(components/userpost/model.php): 未能打开 流:中没有这样的文件或目录 /var/www/html/viewer_mvc/components/userpost/controller.php 在第 3 行, 推荐人:http://localhost/viewer_mvc/index.php

真的希望你们能告诉我我在哪里失败,以及是否有一种特殊的方法可以在 MVC 中做这些事情。

【问题讨论】:

  • 可能有助于提及您正在使用的框架并用它标记问题
  • 我没有使用任何框架。我所拥有的只是一个带有函数 loader($component) 的文件,该函数将路由返回到我要加载的组件的控制器。我不知道什么是标签问题,你能告诉我它是做什么用的吗?也许是我在这里想念的?感谢您的回答。

标签: php jquery ajax model-view-controller


【解决方案1】:

对于 JQuery 调用,它使用 JSON 数据向index.php?option=users 发出 POST 请求。 ID 为userForm 的表单使用Jquery serialize 方法进行序列化。

.serialize() 方法以标准 URL 编码表示法创建文本字符串。它可以作用于已选择单个表单控件的 jQuery 对象

$.ajax({
    type: 'POST',
    url: 'index.php?option=users',
    data: $('#userForm').serialize(),
    cache: false,
    dataType: 'json'

现在是您的 PHP 示例

if ($action_user == 'show_alerts') {
    $list = ModelUser::getAlertContact($act_email);
    echo json_encode($list);//I predict that ajax don't reach this line, but not sure
}

此代码将寻找可能不再存在的变量,如果它是不同的文件,即是否有 $action_user 变量?

要开始重新实现它,您需要添加逻辑,以便在您不使用框架代码时检查 POST 变量。因此,如果您有一个名为“name”的表单元素,那么它将在您的 PHP 脚本 POST 变量中可用

$_POST['name']

【讨论】:

  • 感谢您的回答。是的,在这个 if($action_user == 'show_alerts') 的正上方,我检查了 POST 变量,以便该变量在这个控制器中。无论如何,据我了解,之前在 userpost.php 中的变量现在位于 users/controller.php 中,我正在发送我的 ajax 调用,所以事情并没有改变很多。我真的不知道为什么 $list 数组没有被传递。
  • 您没有在 Ajax 调用中传递 $list。它传递 HTML 表单数据
  • 所以当我这样做时 echo json_encode($list) 我没有传递数组?我该怎么做?
  • @blinking_eyes 你需要一个done 回调在$.ajax 接受json
  • @charlietfl 我刚刚用整个函数编辑了我的 jquery 代码,不清楚,抱歉。我想问你有success和有done一样吗?或者我还需要done 吗?
【解决方案2】:

[如何使用 AJAX 在 MVC 中调用 PHP 函数]

$.ajax({
        type: 'POST',
        url: 'save-user.php',
        data: { fname: "manish", email: "manishkp@com",  role:"admin"},
        success: function(data) {
         console.log(data);
    if(data == 'error')
    {
     $('#Register_error').text('Must Be filled...');
     $('#Register_error').show();
    }
   else {      
                                        $('#Register_error').hide();
     $('#Register_success').text('Successfully submit');
     $('#Register_success').show();
    }
  }
    });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<?php 
   
  $fname = $_POST['fname'];
  $email = $_POST['email'];
  $role = $_POST['role'];
  
  if(!empty($fname) && !empty($email) && !empty($role))
  {
                      #MYSQL CONNECTION QUERY #
                       echo"success";
                }
                 else{
                         echo "error"; 
                }
?>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-19
    • 2011-05-08
    • 2011-01-17
    • 2018-04-03
    相关资源
    最近更新 更多