Ajax 调用 PHP 文件,但某些数据不返回 [closed]

Ajax calls PHP file but some datas doesn't return [closed]

提问人:sedric alonso 提问时间:9/22/2022 最后编辑:ADysonsedric alonso 更新时间:9/23/2022 访问量:43

问:


想改进这个问题吗?通过编辑这篇文章添加详细信息并澄清问题。

去年关闭。

返回“undone”或“error”。但是“完成”不会返回。 当邮件地址存在时,“撤消”返回,将新用户插入数据库有效,但“完成”不会返回。我希望在插入用户时看到 $data[“status”] 中的“undone”返回。我该如何解决?

js

$(document).ready(function(){
   $("#form").submit(function(){
     $.ajax({
       url: "file.php",
       type: "POST",
       dataType: "json",
       data: $('#form').serialize(),
       success: function(data){
         alert(data.status);
       }
     })
   })
 })

file.php

<?php
   session_start();
   if (isset($_POST['submit'])){

     include 'config.php';
     $data = array();
     $name = $conn -> real_escape_string($_POST['username']);
     $mail = $conn -> real_escape_string($_POST['mail']);
     $psw = $conn -> real_escape_string($_POST['password']);
     $code = $conn -> real_escape_string(uniqid());
 
 
 
     $qry = $conn->query("SELECT * FROM member WHERE mail='{$mail}'");
     if (mysqli_num_rows($qry)>0) {
       $data["status"] = "undone";
     }else {
       $qry2 = $conn->prepare("INSERT INTO member (name, mail, psw, code) VALUES ('{$name}','{$mail}','{$psw}','{$code}')");
       if($qry2){
         $qry2->execute();
         $_SESSION['SESSION_MAILADDRESS'] = $mail;
         $data["status"] = "done";
 
         mysqli_free_result($qry2);
       }else {
         $data["status"] = "error";
       }
     }
     echo json_encode($data);
     mysqli_free_result($qry);
     $conn->close();
   }
  ?>

    
 
php ajax mysqli

评论

0赞 Nico Haase 9/22/2022
您尝试过如何解决问题?另外,请注意,您的查询对 SQL 注入广泛开放。查看准备好的报表以避免被黑客入侵
1赞 ADyson 9/23/2022
警告:您的代码容易受到 SQL 注入攻击。应使用准备好的语句和参数来帮助防止攻击者使用恶意输入值破坏数据库。bobby-tables.com 给出了风险的解释,以及如何使用PHP / mysqli安全地编写查询的一些示例。切勿将未经清理的数据直接插入 SQL 中。现在你的代码编写方式,有人可以很容易地窃取、错误地更改甚至删除你的数据。real_escape_string并未涵盖所有漏洞。
1赞 ADyson 9/23/2022
phpdelusions.net/mysqli 还包含使用 mysqli 编写安全 SQL 的好例子。另请参阅 mysqli 文档和这个: 如何防止 PHP 中的 SQL 注入?.参数化查询还将大大降低由于未转义或错误引用的输入值而导致意外语法错误的风险。如果您从教程或书籍中学到了当前的技术,请不要再次使用它。
1赞 ADyson 9/23/2022
另外,请不要以纯文本形式存储密码 - 这是另一个安全风险。请改为了解密码哈希。参见 如何使用 PHP 的password_hash对密码进行哈希处理和验证
1赞 ADyson 9/23/2022
那么,如果控制台中什么都没有,那么浏览器中的网络工具呢?在工具打开的情况下运行代码。然后,找到 AJAX 请求以file.php .单击它以打开它。看一看 - 从服务器接收回的 HTTP 响应代码是什么?“响应”选项卡中有哪些内容?我们可以理解PHP实际上在做什么。

答:

0赞 ADyson 9/23/2022 #1

您需要删除

mysqli_free_result($qry2);

从您的代码中。

根据 https://php.net/manual/en/mysqli-result.free.php 您应该将 mysqli 结果对象传递给该函数,但现在我仔细观察,您向它传递了一个 mysqli 语句对象。所以这应该会导致崩溃。我希望您的 AJAX 调用返回 500(内部服务器错误)状态和一条错误消息,正如我所描述的那样,该消息应该从浏览器的网络工具中可见。

在任何情况下,使用该命令在此上下文中都没有意义,因为您没有要释放的结果 - INSERT 查询不会生成结果集。mysqli_free_result