Javascript/ajax 不向 php 发送空字段


Javascript/ajax not sending empty fields to php

我是编程初学者,我有一个java脚本函数,可以将表单的变量发送到php脚本。

在表单中,我有两个表,每个表包含两个下拉列表。我可以单击加号按钮克隆第一个表行,也可以单击删除以删除克隆。

对于原生语言,可以生成的最大数量限制为 3,对于练习,可以生成的最大数量限制为 6。

我已经设置了可以在 php 和 javascript 中生成的所有变量,如果我生成最大数量,那么一切正常。

但是如果我不生成任何或只生成几个,那么 ajax.send 什么都不做,实际上表单按钮停止工作。

我怀疑这是因为已经声明的变量中的预期数据是空的,因为我没有生成下拉列表。

以下是可能导致问题的代码:

ajax.send("u="+u+"&e="+e+"&p="+p1+"&c="+c+"&g="+g+"&ct="+ct+"&nl="+nl+"&nll="+nll+"&nl0="+nl0+"&nll0="+nll0+"&nl1="+nl1+"&nll1="+nll1+"&nl2="+nl2+"&nll2="+nll2+"&pl="+pl+"&pll="+pll+"&pl0="+pl0+"&pll0="+pll0+"&pl1="+pl1+"&pll1="+pll1+"&pl2="+pl2+"&pll2="+pll2+"&pl3="+pl3+"&pll3="+pll3+"&pl4="+pl4+"&pll4="+pll4);

并返回此错误:

未捕获的类型错误:无法读取 null 注册的属性"值".php:954 注册注册.php:893 单击时

如何让它发送字段,即使它是空的? 还是 php 代码?我假设 php 只会保存保存数据的字段,如果一个变量没有数据,那么它只是作为空保存到数据库中,对吗?

所以这就是为什么我认为它一定是javascript。

如果有人能帮助我完成这项工作,那就太好了:)

注册脚本:

function signup(){
var u = _("username").value;
var e = _("email").value;
var p1 = _("pass1").value;
var p2 = _("pass2").value;
var c = _("country").value;
var g = _("gender").value;
var ct = _("city").value;
var nl = _("nativelang").value;
var nll = _("nlanglevel").value;
var nl0 = _("nativelang0").value;
var nll0 = _("nlanglevel0").value;
var nl1 = _("nativelang1").value;
var nll1 = _("nlanglevel1").value;
var nl2 = _("nativelang2").value;
var nll2 = _("nlanglevel2").value;
var pl = _("practlang").value;
var pll = _("planglevel").value;
var pl0 = _("practlang0").value;
var pll0 = _("planglevel0").value;
var pl1 = _("practlang1").value;
var pll1 = _("planglevel1").value;
var pl2 = _("practlang2").value;
var pll2 = _("planglevel2").value;
var pl3 = _("practlang3").value;
var pll3 = _("planglevel3").value;
var pl4 = _("practlang4").value;
var pll4 = _("planglevel4").value;
var status = _("status");
if(u == "" || e == "" || p1 == "" || p2 == "" || c == "" || g == "" || ct == "" || nl == "" || pl == ""){
    status.innerHTML = "Fill out all of the form fields marked with a star";
} else if(p1 != p2){
    status.innerHTML = "Your passwords do not match";
} else {
    _("signupbtn").style.display = "none";
    status.innerHTML = 'Email has been sent!';
    var ajax = ajaxObj("POST", "signup.php");
    ajax.onreadystatechange = function() {
   if(ajaxReturn(ajax) == true) {
       if(ajax.responseText.trim()!= "signup_success"){
        status.innerHTML = ajax.responseText;
        _("signupbtn").style.display = "block";
            } else {
                window.scrollTo(0,0);
                _("signupform").innerHTML = "<div id='"status'">OK "+u+", <h2>check your email</h2> inbox and junk mail box at <u>"+e+"</u> in a moment to complete the sign up process by activating your account. You will not be able to do anything on the site until you successfully <h2>activate your account!</h2></div>";
            }
        }
    }
    ajax.send("u="+u+"&e="+e+"&p="+p1+"&c="+c+"&g="+g+"&ct="+ct+"&nl="+nl+"&nll="+nll+"&nl0="+nl0+"&nll0="+nll0+"&nl1="+nl1+"&nll1="+nll1+"&nl2="+nl2+"&nll2="+nll2+"&pl="+pl+"&pll="+pll+"&pl0="+pl0+"&pll0="+pll0+"&pl1="+pl1+"&pll1="+pll1+"&pl2="+pl2+"&pll2="+pll2+"&pl3="+pl3+"&pll3="+pll3+"&pl4="+pl4+"&pll4="+pll4);
}

}

用于在表中添加或删除行的按钮的脚本(表保留下拉列表):

    var ncount = -1;
$(document).ready(function(){
    $('#addBtnNative').on('click', function(e){
        if($('.nativelangdrop').length < 4) {
            ncount++;
            var initialn_row = $('tr.initialn').first().clone();
            var nativelang_name = initialn_row.find('td:eq(0) select').attr('name'); // first td select
            var nlanglevel_name = initialn_row.find('td:eq(1) select').attr('name'); // second td select
            initialn_row.find('td:eq(0) select').attr('name', nativelang_name + ncount);
            initialn_row.find('td:eq(1) select').attr('name', nlanglevel_name + ncount);
            var nativelang_id = initialn_row.find('td:eq(0) select').attr('id'); // first td select
            var nlanglevel_id = initialn_row.find('td:eq(1) select').attr('id'); // second td select
            initialn_row.find('td:eq(0) select').attr('id', nativelang_id + ncount);
            initialn_row.find('td:eq(1) select').attr('id', nlanglevel_id + ncount);
            $('table.nativelanguages').append(initialn_row);
        }
    });
});
$(document).ready(function(){
    $('#remBtnNative').on('click', function(e){
        if($('.nativelangdrop').length > 1) {
            ncount--;
            var initialn_row = $('tr.initialn').last().remove();
        }
    });
});
var pcount = -1;
$(document).ready(function(){
    $('#addBtnPract').on('click', function(e){
        if($('.practlangdrop').length < 6) {
            pcount++;
            var initialp_row = $('tr.initialp').first().clone();
            var practlang_name = initialp_row.find('td:eq(0) select').attr('name'); // first td select
            var planglevel_name = initialp_row.find('td:eq(1) select').attr('name'); // second td select
            initialp_row.find('td:eq(0) select').attr('name', practlang_name + pcount);
            initialp_row.find('td:eq(1) select').attr('name', planglevel_name + pcount);
            var practlang_id = initialp_row.find('td:eq(0) select').attr('id'); // first td select
            var planglevel_id = initialp_row.find('td:eq(1) select').attr('id'); // second td select
            initialp_row.find('td:eq(0) select').attr('id', practlang_id + pcount);
            initialp_row.find('td:eq(1) select').attr('id', planglevel_id + pcount);
            $('table.practlanguages').append(initialp_row);
        }
    });
});

$(document).ready(function(){
    $('#remBtnPract').on('click', function(e){
        if($('.practlangdrop').length > 1) {
            pcount--;
            var initialp_row = $('tr.initialp').last().remove();
        }
    });
});

.PHP:

if(isset($_POST["u"])){
include_once("php_includes/db_conx.php");
$u = preg_replace('#[^a-z0-9]#i', '', $_POST['u']);
$e = mysqli_real_escape_string($db_conx, $_POST['e']);
$p = $_POST['p'];
$g = preg_replace('#[^a-z]#', '', $_POST['g']);
$c = preg_replace('#[^a-z ]#i', '', $_POST['c']);
$ct = $_POST['ct'];
$nl = preg_replace('#[^a-z]#', '', $_POST['nl']);
$nll = preg_replace('#[^a-z]#', '', $_POST['nll']);
$nl0 = preg_replace('#[^a-z]#', '', $_POST['nl0']);
$nll0 = preg_replace('#[^a-z]#', '', $_POST['nll0']);
$nl1 = preg_replace('#[^a-z]#', '', $_POST['nl1']);
$nll1 = preg_replace('#[^a-z]#', '', $_POST['nll1']);
$nl2 = preg_replace('#[^a-z]#', '', $_POST['nl2']);
$nll2 = preg_replace('#[^a-z]#', '', $_POST['nll2']);
$pl = preg_replace('#[^a-z]#', '', $_POST['pl']);
$pll = preg_replace('#[^a-z]#', '', $_POST['pll']);
$pl0 = preg_replace('#[^a-z]#', '', $_POST['pl0']);
$pll0 = preg_replace('#[^a-z]#', '', $_POST['pll0']);
$pl1 = preg_replace('#[^a-z]#', '', $_POST['pl1']);
$pll1 = preg_replace('#[^a-z]#', '', $_POST['pll1']);
$pl2 = preg_replace('#[^a-z]#', '', $_POST['pl2']);
$pll2 = preg_replace('#[^a-z]#', '', $_POST['pll2']);
$pl3 = preg_replace('#[^a-z]#', '', $_POST['pl3']);
$pll3 = preg_replace('#[^a-z]#', '', $_POST['pll3']);
$pl4 = preg_replace('#[^a-z]#', '', $_POST['pl4']);
$pll4 = preg_replace('#[^a-z]#', '', $_POST['pll4']);
$ip = preg_replace('#[^0-9.]#', '', getenv('REMOTE_ADDR'));
$sql = "SELECT id FROM users WHERE username='$u' LIMIT 1";
$query = mysqli_query($db_conx, $sql); 
$u_check = mysqli_num_rows($query);
// -------------------------------------------
$sql = "SELECT id FROM users WHERE email='$e' LIMIT 1";
$query = mysqli_query($db_conx, $sql); 
$e_check = mysqli_num_rows($query);
if($u == "" || $e == "" || $p == "" || $g == "" || $c == "" || $ct == "" || $nl == "" || $pl == ""){
    echo "The form submission is missing values.";
    exit();
} else if ($u_check > 0){ 
    echo "The username you entered is alreay taken";
    exit();
} else if ($e_check > 0){ 
    echo "That email address is already in use in the system";
    exit();
} else if (strlen($u) < 3 || strlen($u) > 25) {
    echo "Username must be between 3 and 25 characters";
    exit(); 
} else if (is_numeric($u[0])) {
    echo 'Username cannot begin with a number';
    exit();
} else {
    $p_hash = md5($p);
    $sql = "INSERT INTO users (username, email, password, gender, country, city, nativelang, nlanglevel, nativelang0, nlanglevel0, nativelang1, nlanglevel1, nativelang2, nlanglevel2, practlang, planglevel, practlang0, planglevel0, practlang1, planglevel1, practlang2, planglevel2, practlang3, planglevel3, practlang4, planglevel4, ip, signup, lastlogin, notescheck)       
            VALUES('$u','$e','$p_hash','$g','$c','$ct','$nl','$nll','$nl0','$nll0','$nl1','$nll1','$nl2','$nll2','$pl','$pll','$pl0','$pll0','$pl1','$pll1','$pl2','$pll2','$pl3','$pll3','$pl4','$pll4','$ip',now(),now(),now())";
    $query = mysqli_query($db_conx, $sql); 
    $uid = mysqli_insert_id($db_conx);
    $sql = "INSERT INTO useroptions (id, username, background) VALUES ('$uid','$u','original')";
    $query = mysqli_query($db_conx, $sql);
    if (!file_exists("user/$u")) {
        mkdir("user/$u", 0755);
    }
    $to = "$e";                          
    $from = "email@site.com";
    $subject = 'blah | Account Activation';
    $message = '<!DOCTYPE html><html><head><meta charset="UTF-8"><title> Message</title></head><body style="margin:0px; font-family:Tahoma, Geneva, sans-serif;"><div style="padding:10px; background:#333; font-size:24px; color:#CCC;"><a href="http://www.dandani.eu"></a>Account Activation</div><div style="padding:24px; font-size:17px;">Hello '.$u.',<br /><br />Click the link below to activate your account when ready:<br /><br /><a href="http://www.dandani.eu/activation.php?id='.$uid.'&u='.$u.'&e='.$e.'&p='.$p_hash.'">Click here to activate your account now</a><br /><br />Login after successful activation using your:<br />* E-mail Address: <b>'.$e.'</b></div></body></html>';
    $headers = "From: $from'n";
    $headers .= "MIME-Version: 1.0'n";
    $headers .= "Content-type: text/html; charset=iso-8859-1'n";
    mail($to, $subject, $message, $headers);
    echo "signup_success";
    exit();
}
exit();

}

.HTML:

<legend class="legend"><h3>Select your languages</h3></legend>
    <ul class="list-unstyled">
        <li>
        <div class="lala">

                <table class="nativelanguages">
                    <tr>
                        <td>Spoken language</td>
                        <td style="padding-left: 5px;">Level</td>
                    </tr>
                    <tr class="initialn">
                        <td>
                            <select class="nativelangdrop" id="nativelang" name="nativelang" required>
                            <option value="none" selected disabled>Select language</option>
                            <?php
                                        if ($file = @fopen('txt/languages.txt', 'r')) {
                                            while(($line = fgets($file)) !== false) {
                                                echo "<option>{$line}</option>";
                                            }
                                            fclose($file);
                                        }
                                        ?>
                        </select></td>
                        <td>
                        <select class="langleveldrop" id="nlanglevel" name="nlanglevel" required>
                            <option value="none" selected disabled>Select level</option>
                                <?php
                                        if ($file = @fopen('txt/levels.txt', 'r')) {
                                            while(($line = fgets($file)) !== false) {
                                                echo "<option>{$line}</option>";
                                            }
                                            fclose($file);
                                        }
                                        ?>
                        </select>
                        </td>
                    </tr>
                </table>
                <div class="pmbutton">
                <button href="javascript:;" type="button" class="btn btn-default" id="addBtnNative">
                <span class="glyphicon glyphicon-plus-sign" aria-hidden="true"></span>
                </button>
                <button href="javascript:;" type="button" class="btn btn-default" id="remBtnNative">
                <span class="glyphicon glyphicon-minus-sign" aria-hidden="true"></span>
                </button>
                </div>
            </div>
            <div class="lala">

                <table style="float:left; margin-top:20px;" id="plang" class="practlanguages">
                    <tr>

                        <td>Practicing language</td>
                        <td style="padding-left: 5px;">Level</td>

                    </tr>
                    <tr class="initialp">
                        <td>
                            <select class="practlangdrop" id="practlang" name="practlang" required>
                                <option value="none" selected disabled>Select language</option>
                                    <?php
                                        if ($file = @fopen('txt/languages.txt', 'r')) {
                                            while(($line = fgets($file)) !== false) {
                                                echo "<option>{$line}</option>";
                                            }
                                            fclose($file);
                                        }
                                        ?>
                        </select>
                        </td>
                        <td><select class="langleveldrop" id="planglevel" name="planglevel" required>
                            <option value="none" selected disabled>Select level</option>
                                <?php
                                        if ($file = @fopen('txt/levels.txt', 'r')) {
                                            while(($line = fgets($file)) !== false) {
                                                echo "<option>{$line}</option>";
                                            }
                                            fclose($file);
                                        }
                                        ?>
                        </select>
                        </td>


                    </tr>
                </table>

                <div class="pmbutton">
                <button href="javascript:;" type="button" class="btn btn-default" id="addBtnPract">
                <span class="glyphicon glyphicon-plus-sign" aria-hidden="true"></span>
                </button>
                <button href="javascript:;" type="button" class="btn btn-default" id="remBtnPract">
                <span class="glyphicon glyphicon-minus-sign" aria-hidden="true"></span>
                </button>
                </div>

            </div>
        </li>
    </ul>

在获取元素值的位置,请尝试将它们更改为如下所示:

var u = _("username").value ? _("username").value : '';

这将使用三元运算符来设置 u 的值。

语法为:condition ? result-if-True : result-if-False;

基本上,这表示,如果_("username").value返回一个值,则将该值分配给u,如果没有,则将u的值设置为 ""(空字符串)

下面是一个使用常规 jQuery 方法的人为示例$("#username").val()我想它也可以与_("username").value一起使用,尽管我不确定这样做的好处是什么_("username").value我以前从未见过这个。


var u = $("#username").val() ? $("#username").val() : 'not found';
alert(u);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>

我建议使用chrome开发人员工具,这样你可以看到jquery.ajax发送的内容

https://developer.chrome.com/devtools#improving-network-performance

在 PHP 中,您可以看到使用

print_r($_POST) 

print_r($_GET)