javascript - HTML 提交表单仅在提交时执行一个 JavaScript 函数
问题描述
下午好,
我目前正在使用 HTML、PHP 和 JavaScript 创建网站,但在尝试检查数据库中的重复用户名时遇到了问题。目前,我有一个表单,它使用以下代码在提交时调用两个 javascript 函数。
<form onsubmit="return (checkValid() && usernameCheck())" action="create.php" method="post" id="registerForm">
然后,javascript 代码出现在 body 标记的底部、脚本标记内,如下所示。
<script>
var pass = document.getElementById('passVal').value;
var confPass = document.getElementById('confPassVal').value;
var error = document.getElementById('errorMsg');
var result = true;
function checkValid(){
if(pass !== confPass)
{
error.type = "text";
error.value = "Passwords do not match!";
error.style.backgroundColor = "#E34234";
document.getElementById('passVal').style.borderColor = "#E34234";
document.getElementById('confPassVal').style.borderColor = "#E34234";
result = false;
}
return result;
}
function usernameCheck()
{
var username = document.getElementById('userName').value;
var j = checkName(username);
console.log(j);
if ( j == "taken" ) {
error.type = "text";
error.value = "Username Already Exists, Please choose an alternative.";
error.style.backgroundColor = "#E34234";
document.getElementById('userName').style.borderColor = "#E34234";
console.log(j);
result = false;
}
if ( j == "available" ) {
console.log(j);
result = true;
}
return result;
}
function checkName(uname) {
if (window.XMLHttpRequest) {
xhttp = new XMLHttpRequest();
} else {
xhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
var httpURL = "checkUserName.php?n=" + uname;
xhttp.open("GET",httpURL,false);
xhttp.send();
return xhttp.responseText;
}
</script>
我遇到的问题是第二个 JavaScript 函数没有执行,即使它在 onsubmit 函数中被调用。因此,第三个函数也没有执行,因为该函数在第二个函数中被调用。第二个函数将带有用户名输入的 GET 值在 HTML 表单中提交到 PHP 脚本。然后 PHP 脚本检查数据库以查看该用户是否存在,并根据该用户是否为真返回一个值。下面的代码显示了 PHP 脚本。
<?php
session_start();
require 'sql.php';
header('Content-type: text/plain');
$userName = $_GET['n'];
$query = "SELECT username FROM users where username='$username'";
$checkun = $conn->query($query);
while ($row = $checkun->fetch_assoc()) {
if ($row > 0)
{
exit('taken');
} else
{
exit('available');
}
}
?>
第一个 JavaScript 函数成功执行,用于检查密码字段是否匹配。如果密码字段不匹配(因此第二个函数将不会执行),此函数要么返回 false 值,要么返回 true 值。即使第一个函数返回 true,下一个函数也不会执行,并且表单在不运行第二个函数的情况下提交。
如果比我更有经验的人(我只练习 Web 开发几个月)能指出我的方法中是否有任何错误,我将不胜感激,并可能帮助我解决问题。
感谢您抽出时间来阅读!
解决方案
当你说“第二个函数没有运行”时 - 你的意思是你在 JS 中没有得到响应吗?我想这是真的,因为你的 MySQL 查询中永远不会有匹配项——而且,你的“catchall”没有放在正确的位置。
这看起来像是您从数据库获取数据的第一次学习体验,所以我不会强调您对 SQL 注入攻击很开放这一事实,尽管我会说您不得在任何开放系统上使用此代码有真实用户的地方(您需要学习如何防范这些攻击 - SO上有大量数据)!
所以,你至少要让“第二个功能”“工作”的第一步......
<?php
session_start();
require 'sql.php';
header('Content-type: text/plain');
// $userName = $_GET['n']; // <<<==== here you use with a capital
$username = $_GET['n']; // let's change it to be the same
$query = "SELECT username FROM users where username='$username'"; // now, we have a chance...
$checkun = $conn->query($query);
while ($row = $checkun->fetch_assoc()) {
if ($row > 0)
{
exit('taken');
}
}
// Here is where to put your 'catchall' in case you don't get anything from the query (what you have won't ever give 'available')
exit('available');
?>
推荐阅读
- javascript - 如何从一个组件单击按钮运行一个功能,并在反应原生的另一个组件上运行功能
- java - 使用 PDF Stamper 对具有数字签名的 PDF 进行密码保护
- amazon-web-services - 如何将 s3 存储桶文件复制到 Kubernetes 运行的 Pod 中?
- html - 如何在另一个 div 的中心对齐一个 div
- python - 慢速和快速 pandas 函数(在两列中添加字符串)
- javascript - 我如何通过 contenteditable 制作一个简单的编辑器,但没有执行命令
- frontend - 如何为 Strapi CMS 更改 Netlify CMS?
- rabbitmq - Rabbitmq 设置用户唯一子
- mysql - MYSQL:无法添加或更新子行:外键约束失败努力将用户添加到用户组
- java - 如何实现天蓝色服务总线队列触发/存储连接错误