使用ajax从Javascript函数调用Php函数


Php function call from Javascript function using ajax

大家好,我是php新手。当用户输入产品名称需要验证产品是否有效时,我一直在尝试这件事。为此,我在输入文本时使用了onchange事件。onchange函数将调用javascript函数。通过javascript函数,我正在调用同一文件中的php。因此,当我输入产品名称时,php函数不起作用。

这是我的代码:

<?php
  include 'conf.php';//it contains the php database configuration
   session_start();
   $quantityRequired=0; 
   $productName_error="";
    if(is_ajax()){
      if(isset($_POST["productName"])){
        $productName=$_POST["productName"];
        $row=mysqli_query($conn,"SELECT * from OrderDetails where ProductName='".$productName."'");
        if($row)
        {
          $result=mysqli_fetch_assoc($row);
          $quantityRequired=$result["Quantity"];
        }   
        else
         {
          $productName_error="The product name is not valid or product does not exist";
          echo $productName_error;
         }  
      }
    } 
  function is_ajax() {
    $flag=(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest'); 
    return $flag;
  }
?>
<html>
   <head>
       <title>Order Page </title>
       <script type = "text/javascript" 
         src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
   </head>
   <body>
      <form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" method="POST">
         <label for="userName">Username</label><br>
         Product Name<input type="text" name="productName" id="productName" onchange="validateProduct()"><?php echo $productName_error?><br>
         Quantity Required<input type="text" name="quantityRequired" id="quantityRequired"><br>
         Availability<input type="text" name="availability">
         <p id="demo"></p>
      </form>
      <script>
        function validateProduct()
        {
            $.ajax({
             type: "POST"
         });
        }
      </script>
   </body>  
</html> 

因此,代码是在用户输入产品名称时生成的。调用函数validate product。通过验证产品,它将调用同一文件中的php。is_ajax()函数用于检查是否是ajax请求。

Ajax的PHP库

Jaxon是一个开源PHP库,用于轻松创建Ajax web应用程序。它允许在网页中直接Ajax调用PHP类,从而更新其内容,而无需重新加载整个页面。

Jaxon实现了一套完整的PHP函数来定义网页的内容和属性。存在一些插件来扩展其功能,并提供与各种PHP框架和CMS的集成。

Jaxon如何工作

使用Jaxon定义并注册您的PHP类。

$jaxon->register(Jaxon::CALLABLE_OBJECT, new MyClass);

使用Jaxon生成的javascript代码调用您的类。

<input type="button" onclick="JaxonMyClass.myMethod()" />

检查链接https://www.jaxon-php.org/docs.html

我可能还没有发现其他问题,但首先想到的是您的服务器端代码有条件运行:

if(isset($_POST["productName"]))

这个条件从未得到满足,因为您没有在AJAX请求中发送任何值:

$.ajax({
    type: "POST"
});

发送您要查找的值:

$.ajax({
    type: "POST",
    data: { productName: $('#productName').val() }
});

如果默认值不正确,您可能还需要指定其他几个选项。在许多情况下,显式代码通常比隐式代码好:

$.ajax({
    url: 'yourUrl.php',
    type: "POST",
    dataType: 'html',
    data: { productName: $('#productName').val() }
});

一般来说,你可能想查看$.ajax()的文档,看看你能告诉它什么,应该告诉它什么。你还想看看浏览器的调试工具,更具体地了解它在测试这些东西时失败的原因和方式。

说到你应该做的事情,你应该读这个和这个。您的代码目前对SQL注入攻击非常开放,这基本上意味着您将作为代码执行用户发送给您的任何内容。

var data1 = "Something";
$.ajax({
    url: "script.php",
    type: "POST",
    data: { data1: data1 }
}).done(function(resp) {
    console.log( resp )
}).fail(function(jqXHR, textStatus) {
    alert("Request failed: " + textStatus + " - Please try again.")
})

这里有一个脚本,它将把data1变量发送到php脚本。done部分中的resp是您从php脚本发回的返回。

如果你想发送更多的数据,只需添加{ data1: data1, data2: data2 },以此类推

只需根据您的需要进行调整。