AJAX request and PHP class functions

后端 未结 8 862
小鲜肉
小鲜肉 2020-12-08 05:29

How to call a PHP class function from an ajax call

animal.php file

class animal
{     
  function getName()
  {
    return \"lion\";
  }         


        
相关标签:
8条回答
  • 2020-12-08 05:35

    OOP Currently with php:

    ajax.html program(client tier) -> program.php (middle tier) -> class.php (middle tier) -> SQL call or SP (db tier)

    OOP Currently with DotNet:

    ajax.html program(client tier) -> program.aspx.vb (middle tier) -> class.cls (middle tier) -> SQL call or SP (db tier)

    My real-life solution: Do OOA, do not OOP.

    So, I have one file per table -as a class- with their proper ajax calls, and select the respective ajax call with a POST parameter (i.e. mode).

    /* mytable.php */

    <?
    session_start();
    header("Content-Type: text/html; charset=iso-8859-1");
    $cn=mysql_connect ($_server, $_user, $_pass) or die (mysql_error());
    mysql_select_db ($_bd);   
    mysql_set_charset('utf8');
    
    //add
    if($_POST["mode"]=="add")   {
        $cadena="insert into mytable values(NULL,'".$_POST['txtmytablename']."')"; 
        $rs=mysql_query($cadena,$cn) or die(mysql_error().' : '.$cadena); 
    };
    
    //modify
    if($_POST["mode"]=="modify")    {
        $cadena="update mytable set name='".$_POST['txtmytablename']."' where code='".$_POST['txtmytablecode']."'"; 
        $rs=mysql_query($cadena,$cn) or die(mysql_error().' : '.$cadena); 
    };
    
    //erase
    if($_POST["mode"]=="erase") {
        $cadena="delete from mytable where code='".$_POST['txtmytablecode']."'"; 
        $rs=mysql_query($cadena,$cn) or die(mysql_error().' : '.$cadena); 
    };
    
    // comma delimited file
    if($_POST["mode"]=="get")   {
        $rpta="";
        $cadena="select * from mytable where name like '%".$_POST['txtmytablename']."%'"; 
        $rs=mysql_query($cadena,$cn) or die(mysql_error().' : '.$cadena); 
        while($row =  mysql_fetch_array($rs)) {
            $rowCount = mysql_num_fields($rs);
            for ($columna = 0; $columna < $rowCount; $columna++)    {
                $rpta.=str_replace($row[$columna],",","").",";
            }
            $rpta.=$row[$columna]."\r\n";
        }
        echo $rpta; 
    };
    
    //report
    if($_POST["mode"]=="report_a")  {
        $cadena="select * from mytable where name like '%".$_POST['txtmytablename']."%'"; 
        $rs=mysql_query($cadena,$cn) or die(mysql_error().' : '.$cadena); 
        while ($row=mysql_fetch_array($rs)) {
            echo $row['code']." ".$row['name']."<br/>"; // colud be a json, html
        };  
    };
    
    //json
    if($_POST["mode"]=="json_a")    {
        $cadena="select * from mytable where name like '%".$_POST['txtmytablename']."%'"; 
        $rs=mysql_query($cadena,$cn) or die(mysql_error().' : '.$cadena); 
        $result = array();
        while ($row=mysql_fetch_array($rs)) {
            array_push($result, array("id"=>$row['code'],"value" => $row['name']));
        };  
        echo json_encode($result);
    };
    ?>
    
    0 讨论(0)
  • 2020-12-08 05:36

    For every ajax request add two data, one is class name and other is function name create php page as follows

     <?php
    require_once 'siteController.php';
    if(isset($_POST['class']))
    {
        $function = $_POST['function'];
        $className = $_POST['class'];
        // echo $function;
        $class = new $className();
        $result = $class->$function();
    if(is_array($result))
    {
        print_r($result);
    }
    elseif(is_string($result ) && is_array(json_decode($result , true)))
    {
    print_r(json_decode($string, true));
    }
    else
    {
    echo $result;
    }
    
    }
    ?>
    

    Ajax request is follows

    $.ajax({
                            url: './controller/phpProcess.php',
                            type: 'POST',
                            data: {class: 'siteController',function:'clientLogin'},
                            success:function(data){
                                alert(data);
                            }
                        });
    

    Class is follows

    class siteController
    {     
      function clientLogin()
      {
        return "lion";
      }
    }
    
    0 讨论(0)
  • 2020-12-08 05:44

    My answer is the same as Surreal Dreams answer, but with the code.

    First. Class animal is OK. Leave it like that:

    animal.php

    <?php
    
    class animal
    {     
      function getName()
      {
        return "lion";
      }
    }
    

    Next. Create a new animalHandler.php file.

    <?php
    require_once 'animal.php';
    
    if(isset( $_POST['invoiceno'] )) {
         $myAnimal = new animal();
         $result = $myAnimal->getName();
         echo $result;
    }
    

    Finally. Change your Javascript.

    <script type=text/javascript>
      $.ajax({
        type: "POST",
        data: {
          invoiceno:jobid
        },
        url: "animalHandler.php",
        dataType: "html",
        async: false,
        success: function(data) {
          result=data;
        }
      });    
    </script>
    

    That's is.

    0 讨论(0)
  • 2020-12-08 05:44

    For what it is worth, I have used a PHP proxy file that accepts an object as a post -- I will post it here. It works by providing class name, method name, parameters (as an array) and the return type. This is limited as well to only execute classes specified and a limited set of content types to return.

            <?php
    
    
        // =======================================================================
            $allowedClasses = array("lnk","objects");    // allowed classes here
        // =======================================================================
    
        $raw =  file_get_contents("php://input");  // get the complete POST
    
        if($raw) {
    
                $data = json_decode($raw);
                if(is_object($data)) {
    
                    $class =   $data->class;        // class:       String - the name of the class (filename must = classname) and file must be in the include path
                    $method =  $data->method;       // method:      String - the name of the function within the class (method)
                    @$params = $data->params;       // params:      Array  - optional - an array of parameter values in the order the function expects them
                    @$type =   $data->returntype;   // returntype:  String - optional - return data type, default: json || values can be: json, text, html
    
            // set type to json if not specified
                    if(!$type) {
                        $type = "json";
                    }
    
            // set params to empty array if not specified
                    if(!$params) {
                        $params = array();
                    }
    
            // check that the specified class is in the allowed classes array
                    if(!in_array($class,$allowedClasses)) {
    
                        die("Class " . $class . " is unavailable.");
                    }
    
                    $classFile = $class . ".php";
    
            // check that the classfile exists
                    if(stream_resolve_include_path($classFile)) {
    
                        include $class . ".php";
    
                    } else {
    
                        die("Class file " . $classFile . " not found.");
                    }           
    
                    $v = new $class;
    
    
            // check that the function exists within the class
                    if(!method_exists($v, $method)) {
    
                        die("Method " . $method . " not found on class " . $class . ".");
                    }
    
            // execute the function with the provided parameters
                    $cl = call_user_func_array(array($v,$method), $params );
    
            // return the results with the content type based on the $type parameter
                    if($type == "json") {
                        header("Content-Type:application/json");
                        echo json_encode($cl);
                        exit();
                    }
    
                    if($type == "html") {
                        header("Content-Type:text/html");
                        echo $cl;
                        exit();
                    }
    
                    if($type == "text") {
                        header("Content-Type:text/plain");
                        echo $cl;
                        exit();
                    }
                }
                else {
                    die("Invalid request.");
                    exit();
                }       
    
        } else {
    
            die("Nothing posted");
            exit();
        }
    
        ?>
    

    To call this from jQuery you would then do:

                var req = {};
                var params = [];
                params.push("param1");
                params.push("param2");
    
                req.class="MyClassName";
                req.method = "MyMethodName";
                req.params = params;
    
                    var request = $.ajax({
                      url: "proxy.php",
                      type: "POST",
                      data: JSON.stringify(req),
                      processData: false,
                      dataType: "json"
                    });
    
    0 讨论(0)
  • 2020-12-08 05:47

    Can you please mention which are you using any Framework? You method is correct but I want to mention two things over here. First try your URL from the browser and check if its working correctly. Secondly don't use return, in *success: function(data) * data will contain only the output. so use Echo rather then return

    0 讨论(0)
  • 2020-12-08 05:51

    Try this: Updated Ajax:

    $("#submit").on('click', (function(e){
    
        var postURL = "../Controller/Controller.php?action=create";
    
        $.ajax({
            type: "POST",
            url: postURL,
            data: $('form#data-form').serialize(),
            success: function(data){
                //
            }
        });
        e.preventDefault();
    });
    

    Update Contoller:

    <?php
    
    require_once "../Model/Model.php";
    require_once "../View/CRUD.php";
    
    class Controller
    {
    
        function create(){
            $nama = $_POST["nama"];
            $msisdn = $_POST["msisdn"];
            $sms = $_POST["sms"];
            insertData($nama, $msisdn, $sms);
        }
    
    }
    
    if(!empty($_POST) && isset($_GET['action']) && $_GET['action'] == ''create) {
        $object = new Controller();
        $object->create();
    }
    
    ?>
    
    0 讨论(0)
提交回复
热议问题