【问题标题】:Am I able to make an AJAX call to a specific function within a PHP file from a JS file我是否能够从 JS 文件对 PHP 文件中的特定函数进行 AJAX 调用
【发布时间】:2016-02-04 14:01:36
【问题描述】:

我有一个 Javascript 函数,它可以提取用户的纬度/经度并将其存储在一个数组中以供以后使用。我要做的是获取用户的纬度/经度并与存储在数据库中的其他几个纬度/经度进行距离比较。我正在尝试做的事情,我可能认为这一切都错了,是在该 Javascript 中使用 AJAX 调用 PHP 文件中的特定函数(该函数仅从每个相关商店中提取纬度/经度数据库)。通常,这应该很容易,但是 PHP 文件中有多个函数,所以我想知道这是否可以通过这种方式完成。

提前感谢您提供的任何帮助。我对这一切还很陌生,因此感谢您的耐心等待。

这是我到目前为止的代码(我是 AJAX 的新手,所以我还没有编写任何 AJAX 代码):

function userPosition() {

  navigator.geolocation.getCurrentPosition(function(position) {
  var lat = position.coords.latitude;
  var lng = position.coords.longitude;
  currentPos.push(lat, lng);

  }, function(error) {
    alert('Error occurred. Error code: ' + error.code);
    // error.code can be:
    //   0: unknown error
    //   1: permission denied
    //   2: position unavailable (error response from location provider)
    //   3: timed out
  });
};

这是 PHP 文件中的代码:

    public function get_closest_location() {
    $addresses = array();
    $i = 0;
    //Get primary address
    $addresses[$i]['lat'] = $this->dealer_info['lat_1'];
    $addresses[$i]['lng'] = $this->dealer_info['lng_1'];

    //Get Dealer Addresses
    global $wpdb;
    $results = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $wpdb->gdp_dealers_addresses WHERE dealerId = %d", $this->dealer_info['dealer_id'] ), ARRAY_A );

    foreach($results as $res){
        $i++;
        $addresses[$i]['lat'] = $res['lat'];
        $addresses[$i]['lng'] = $res['lng'];

    }

    return $addresses;
}

【问题讨论】:

  • 是的,你可以做到。但是如何做到这一点是一个太宽泛的问题。你需要说出你的问题是什么,也许可以提供一些代码。
  • 你有可以提供的例子吗?我完全迷失了,没有在网上找到任何东西。
  • 不知道你的问题是什么,很难给你准确的指示。
  • 你不能将 POST 或 GET 参数传递给 phpscript 吗?这将清理一切,您可以轻松检测 $_POST 参数并返回函数调用的结果
  • 我编辑了上面的评论以包含我拥有的代码。同样,我是 AJAX 的新手,所以我不知道如何进行。对不起。

标签: javascript php jquery ajax google-maps


【解决方案1】:

答案是“是”和“否”,所以解决方案并不完全直截了当

由于您只能让 AJAX 直接运行 PHP 脚本而不是其中的函数,因此您只需在发送到 PHP 脚本的 POST 数据中添加一些信息,以告诉它您的 PHP 中的函数您要运行的库。

所以你将这样的东西添加到发布的变量中

var params  = {.........};

$.ajax({
  method: "POST",
  url: "some.php",
  data: { toRun: 'userPosition', anyData: params }
})
.done(function( msg ) {
    alert( msg );
});

然后在你的 PHP 中,这是你测试的第一件事

<?php

     // check for existance of all required post variables
     switch ($POST['toRun']) {

     case : 'userPosition'
         // get any other parameters out of POST array you may need
         $params = array(.....);
         userPosition();
         break;

     case : 'otherFunction'
        ...
        ...

     default :
        echo 'Huston we have a problem';

这是一个基本大纲,您当然必须添加更多代码来处理传回数据,但这是基本大纲 }

【讨论】:

    【解决方案2】:

    Php 基本上是从上到下运行的。在浏览器中调用文件就是这样做的。 如果文件包含函数定义,但没有调用代码,则不会运行任何内容。

    要处理您的问题,您需要:

    1. 确定要调用的函数
    2. 检查它是否是允许的函数,以避免恶意代码注入
    3. 调用函数

    为此,您可以将所需的函数作为 get 参数发送,对照白名单检查它,然后调用它:

    //example.php
    
    function somefunc(){}
    function anotherfunc(){}
    function privatefunc(){}
    
    function onLoad(){
        $func = isset($_GET['func']) ? $_GET['func'] : false;
        $allowed = ['somefunc','anotherfunc'];
        if(in_array($func, $allowed){
            call_user_func($func);
        }
    }
    //call onload function when script is executed
    onLoad();
    

    要调用函数,您可以在 ajax 请求中使用正确的查询字符串,例如 /example.php?func=somefunc

    【讨论】:

    • 接下来,您将制作一个基本的路由器。我强烈建议您在谷歌上搜索一个不错的现代 php 微框架(slim、silex、fatfreephp),它将具有更强大的实现,以及更多功能。重新发明轮子并不是一个好主意。编写原始 php 经常属于这一类
    【解决方案3】:

    我建议您将 GET 参数传递给 php 脚本。如下所示:

    javascript:

    $.post( "script.php?action=userPosition", { lat: "2.0123123", long: "2.0319239123" })
      .done(function( data ) {
        alert( "Data Loaded: " + data );
    });    
    

    将此附加到您的 php 文件中:

    if (isset($_GET["action"]) && $_GET["action"] == "userPosition") {   
        echo get_closest_location($_POST["lat"], $_POST["long"]);
        exit;
    }
    

    你显然需要修改 php 函数的参数,但是这就是它所需要的。

    【讨论】:

      猜你喜欢
      • 2013-01-11
      • 2014-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-18
      相关资源
      最近更新 更多