使用 AJAX 和 PHP,创建的表单提交错误的错误值

如何解决使用 AJAX 和 PHP,创建的表单提交错误的错误值

***更新 我已经按照建议取消了表格元素,并且正在使用 CSS。我还看到有一个“表单”属性,我也试过了。当我提交时,它仍然像以前一样运行 - 发送错误的值,因为它正在发送整个表。我已经用更新的 HTML 输出和 PHP 代码更新了下面的内容。看起来是正确的,这是我最近的尝试。我错过了什么?


我正在使用 PHP 为每一行数据创建一个表单。我通过 AJAX 调用 PHP。表单正确构建。每一行都正确地列出了它的值并且有它自己的形式。在这个例子中,有三行,因此是三种形式。当我在第一行提交用户名时,发送的 ID 来自第三行。不知道发生了什么。

AJAX 调用 PHP FORM - 主页

<script>
    window.onload = function signupForm() {       
        var xmlHttp = new XMLHttpRequest();
        xmlHttp.onreadystatechange = function() {
                if(xmlHttp.readyState == 4 && xmlHttp.status == 200) {
                    document.getElementById("signupForm").innerHTML = this.responseText;
                }
        }
        xmlHttp.open("GET","ajaxInput.php",true); 
        xmlHttp.send(); 
    }
</script>

PHP 表单 - signupForm.php

<?php
    $con=mysqli_connect("localhost","xxxxxx","xxxxxxx","xxxxxxxx");
    // Check connection
    if (mysqli_connect_errno())
    {
    echo "Failed to connect to MySQL: " . mysqli_connect_error();
    }

    $result = mysqli_query($con,"SELECT id,DATE_FORMAT(startTime,'%b-%d-%Y') as eventDate,endTime FROM events
    WHERE now() < endTime");

    echo "
        <style>
            .table { display: table; } 
            .table>* { display: table-row; }
            .table>*>* { display: table-cell; padding: 5px; border-style: inset;}        
        </style>

        <div class='table'>     
        <div>    
            <div><b>Event Id</b></div>
            <div><b>Date</b></div>
            <div><b>@username</b></div>
            <div><b>Sign Up!</b></div>
        </div>";

    while($row = mysqli_fetch_array($result))
    {
    //echo "<form action='ajaxSignup.php' method='post'>";
    echo "<div>";
    echo "<div>" . $row['id'] . "</div>";
    echo "<div>" . $row['eventDate'] . "</div>";
    echo "<div><form id='form" .$row['id']. "' method='post'><input class='formSignup' type='text' name='pi_username' id='pi_username' maxlength='20' placeholder='@username' form='form" .$row['id']. "'></div>";
    echo  "<div><input class='formSignup' type='hidden' name='event_id' id='event_id' value='" . $row['id'] . "' form='form" .$row['id']. "'>
    <input name='submit". $row['id'] . "' type='submit' value='Sign up!' onclick='signup(); return false;'></form></div>";
    echo "</div>";
    }
    //echo "</div>";
    echo "</div>";

    mysqli_close($con);

?>

表格绘制正确。我也在不同的地方放置了表单标签。下面,我在输入标签中使用了 form 属性。表格是用 CSS 而不是表格元素绘制的。

<html>
   <head></head>
   <body>
      <p>Something here</p>
      <div id="signupForm">
         <style>
            .table { display: table; } 
            .table>* { display: table-row; }
            .table>*>* { display: table-cell; padding: 5px; border-style: inset;}        
         </style>
         <div class="table">
            <div>
               <div><b>Event Id</b></div>
               <div><b>Date</b></div>
               <div><b>@username</b></div>
               <div><b>Sign Up!</b></div>
            </div>
            <div>
               <div>11</div>
               <div>Feb-25-2021</div>
               <div><input class="formSignup" type="text" name="pi_username" id="pi_username" maxlength="20" placeholder="@username" form="form11"></div>
               <div>
                  <input class="formSignup" type="hidden" name="event_id" id="event_id" value="11" form="form11">
                  <form id="form11" method="post"><input name="submit11" type="submit" value="Sign up!" onclick="signup(); return false;"></form>
               </div>
            </div>
            <div>
               <div>12</div>
               <div>Feb-26-2021</div>
               <div><input class="formSignup" type="text" name="pi_username" id="pi_username" maxlength="20" placeholder="@username" form="form12"></div>
               <div>
                  <input class="formSignup" type="hidden" name="event_id" id="event_id" value="12" form="form12">
                  <form id="form12" method="post"><input name="submit12" type="submit" value="Sign up!" onclick="signup(); return false;"></form>
               </div>
            </div>
            <div>
               <div>13</div>
               <div>Feb-27-2021</div>
               <div><input class="formSignup" type="text" name="pi_username" id="pi_username" maxlength="20" placeholder="@username" form="form13"></div>
               <div>
                  <input class="formSignup" type="hidden" name="event_id" id="event_id" value="13" form="form13">
                  <form id="form13" method="post"><input name="submit13" type="submit" value="Sign up!" onclick="signup(); return false;"></form>
               </div>
            </div>
         </div>
      </div>

正如在 PHP 中所见,每一行都是它自己的形式。但是查看开发人员工具中的元素,表单很早就关闭了。我认为这与问题有关。 Elements

当我在第一行(顶行)输入用户名时,该用户名似乎没有出现,而产生它的 ID 是 13 而不是 11。

处理提交按钮 onclick(主页)的 AJAX 脚本...

<script>
    function signup() {
        var elements = document.getElementsByClassName("formSignup");
        var formData = new FormData(); 
        for(var i=0; i<elements.length; i++) {
            formData.append(elements[i].name,elements[i].value);
        }
        var xmlHttp = new XMLHttpRequest();
        xmlHttp.onreadystatechange = function() {
            if(xmlHttp.readyState == 4 && xmlHttp.status == 200) {
                document.getElementById("signupSuccess").innerHTML = this.responseText;
            }
        }
        xmlHttp.open("post","ajaxSignup.php"); 
        xmlHttp.send(formData); 
        }
</script>

注册页面上的 PHP 代码。早些时候我收到了一些回声,显示 id 是 13,而不是 11,并且没有用户名。

<?php
    $pi_username = $high_score = $attempts = $event_id = "";
    echo $event_id;
    echo $pi_username;

    if ($_SERVER["REQUEST_METHOD"] == "POST") {
        $pi_username = test_input($_POST["pi_username"]);
        $event_id = test_input($_POST["event_id"]);
    }

    function test_input($data) {
        $data = trim($data);
        $data = stripslashes($data);
        $data = htmlspecialchars($data);
        return $data;
    }

    echo $event_id;
    echo $pi_username;

    if($_SERVER["REQUEST_METHOD"] == "POST") {
        /* Attempt MySQL server connection. Assuming you are running MySQL
        server with default setting (user 'root' with no password) */
        $link = mysqli_connect("localhost","xxxxxx");
        
        // Check connection
        if($link === false){
            die("ERROR: Could not connect. " . mysqli_connect_error());
        }
        
        //check if user has already signed up for event
        $alreadySignedUp = mysqli_query($link,"SELECT count(*) AS total FROM signup WHERE event_id = $event_id AND pi_username = '$pi_username'");
        while ($worm = mysqli_fetch_array($alreadySignedUp)){
            //echo $bird['total'];
            if($worm['total'] >= 1 ){
                echo "You have already signed up for this event.";
                echo $event_id;
                echo $pi_username;
                echo $worm['total'];
                mysqli_close($link);
                return; 
            }
        }
    
        // Attempt insert query execution
        $sql = "INSERT INTO signup (event_id,pi_username) VALUES ('$event_id','$pi_username')";
        if(mysqli_query($link,$sql)){
            echo "You have been successfully added to event ".$event_id."!";
            mysqli_close($link);
            return;
        } else{
            echo "ERROR: Could not able to execute $sql. " . mysqli_error($link);
        }
    }
    else {
        echo "Don't forget to submit your high scores before you leave!";
   }   
?>

我哪里出错了?

解决方法

signup() 函数正在寻找具有相同类 (formSignup) 的元素。所有输入字段都具有相同的类名,并且都被发送到 signup() 函数。我已将类名更新为每行唯一。现在只发送一行。 signup() 函数更新为:

window.onload = function signupForm(getClass) {       
        var xmlHttp = new XMLHttpRequest(getClass);

具有唯一类名的输入字段示例:

<input class='formSignup" .$row['id']. "' type='hidden' name='event_id' id='event_id' value='" . $row['id'] . "' form='form" .$row['id']. "'>

删除了表格元素并按照建议创建了一个 CSS 样式的“表格”。现在都在工作。问题已更新为 CSS 样式的表格。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-