我如何在PHP中添加检查传递的$username的长度。该网站是UTF-8,但我相信Javascript使用了不同的编码。你可以在评论中看到,我在PHP中尝试了不同的东西,但它们都不起作用。
我尝试了但没有成功:
-
更改Ajax(javascript)以通过UTF-8而不是javascript编码传递变量
-
PHP中的strlen、mb_strlen都返回了不正确的值
更多信息
我的Ajax向我的PHP发送一个用户名,PHP检查SQL数据库并返回可用与否。我决定在检查数据库之前尝试在PHP中做一些额外的检查(比如
mb_strlen($username
)。
mb_internal_encoding("UTF-8");
也已设置。
我本来打算尝试用UTF-8发送Ajax请求,但没有办法做到这一点。
UPPER在MySQL中使用正确吗?-UTF-8的东西?
PHP下方
*
**
*
**
*
**
*
*
// Only checks for the username being valid or not and returns 'taken' or 'available'
require_once('../defines/mainDefines.php'); // Connection variables
require_once('commonMethods.php');
require_once('sessionInit.php'); // start session, check for HTTP redid to HHHTPs
sleep(2); // Looks cool watching the spinner
$username = $_POST['username'];
//if (mb_strlen($username) < MIN_USERNAME_SIZE) echo 'invalid_too_short';
//if (mb_strlen($username, 'UTF-8') < 10) { echo ('invalid_too_short'); exit; }
//die ('!1!' . $username . '!2!' . mb_strlen($username) . '!3!' . strlen($username) . '!4!');
$dbc = mysqli_connect(DB_HOST, DB_READER, DB_READER_PASSWORD, DB_NAME) or die(DB_CONNECT_ERROR . DB_HOST . '--QueryDB--checkName.php');
$stmt = mysqli_stmt_init($dbc);
$query = "SELECT username FROM pcsuser WHERE UPPER(username) = UPPER(?)";
if (!mysqli_stmt_prepare($stmt, $query)) {
die('SEL:mysqli_prepare failed somehow:' . $query . '--QueryDB--checkName.php');
}
if (!mysqli_stmt_bind_param($stmt, 's', $username)) {
die('mysqli_stmt_bind_param failed somehow --checkName.php');
}
if (!mysqli_stmt_execute($stmt)) {
die('mysqli_stmt_execute failed somehow' . '--checkName.php');
}
mysqli_stmt_store_result($stmt);
$num_rows = mysqli_stmt_num_rows($stmt);
mysqli_stmt_bind_result($stmt, $row);
echo ($num_rows >= 1) ? 'taken' : 'available';
mysqli_stmt_close($stmt);
mysqli_close($dbc);
下面的AJAX代码
function CheckUsername(sNameToCheck) {
document.getElementById("field_username").className = "validated";
registerRequest = CreateRequest();
if (registerRequest === null)
alert("Unable to create AJAX request");
else {
var url= "https://www.perrycs.com/php/checkName.php";
var requestData = "username=" + escape(sNameToCheck); // data to send
registerRequest.onreadystatechange = ShowUsernameStatus;
registerRequest.open("POST", url, true);
registerRequest.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
registerRequest.send(requestData);
}
}
function ShowUsernameStatus() {
var img_sad = "graphics/signup/smiley-sad006.gif";
var img_smile = "graphics/signup/smiley-happy088.gif";
var img_checking = "graphics/signup/bluespinner.gif";
if (request.readyState === 4) {
if (request.status === 200) {
var txtUsername = document.getElementById('txt_username');
var fieldUsername = document.getElementById('field_username');
var imgUsername = document.getElementById('img_username');
var error = true;
var response = request.responseText;
switch (response) {
case "available":
txtUsername.innerHTML = "NAME AVAILABLE!";
error = false;
break;
case "taken":
txtUsername.innerHTML = "NAME TAKEN!";
break;
case "invalid_too_short":
txtUsername.innerHTML = "TOO SHORT!";
break;
default:
txtUsername.innerHTML = "AJAX ERROR!";
break;
} // matches switch
if (error) {
imgUsername.src = img_sad;
fieldUsername.className = 'error';
} else {
imgUsername.src = img_smile;
fieldUsername.className = 'validated';
}
} // matches ===200
} // matches ===4
}
测试结果
这是我在PHP中死亡时得到的结果,并如下面所示(在进行下面的Ajax更改之前和之后[在请求中添加UTF-8]。。。
PHP狙击坑
die ('!1!' . $username . '!2!' . mb_strlen($username) . '!3!' . strlen($username) . '!4!');
试验数据
用户名:
大卫佩里
!1.大卫·佩里!2.11!3.11!4.
用户名:
”~·
!1\“~%u2266!2!9!3!13!4!”!
第一个有效。第二个应该可以工作,但看起来编码很奇怪(可以理解)。
第二个有7个可见字符。mb_strlen显示9,strlen显示13。
在阅读了Joeri Sebrechts的解决方案和他们给我的链接后,我查找了Ajax请求参数,有人得到了以下信息。。。
阿贾克斯狙击坑
(由原始代码更改)
registerRequest.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");
(我在
charset=UTF-8
来自我在一篇文章中看到的一个例子)。
更新:美国东部时间11月27日晚上9:11
好的,经过大量的阅读,我相信我的JS编码错误。我在用逃生。。。如下。。。
var requestData = "username=" + escape(sNameToCheck);
看了这个网站之后。。。
http://www.the-art-of-web.com/javascript/escape/
它帮助我更多地了解了每个函数的情况以及它们是如何编码和解码的。我应该能够做到这一点。。。
var requestData = "username=" + encodeURIComponent(sNameToCheck);
在JS和PHP中,我应该能够做到这一点。。。
$username = rawurldecode($_POST['username']);
这样做仍然给了我8个字符,而不是7个字符。很近,但我做错了什么吗?如果我用光标浏览屏幕上的文本,它是7个字符。有什么想法可以帮助我更好地理解这一点吗?
已修复/已解决!!!
好的,谢谢你的建议,让我朝着正确的方向努力。我的改变如下。
在AJAX中
--我曾经有escape(sNameToCheck)--
var requestData=“username=”+encodeURIComponent(sNameToCheck);
在PHP中
*--我曾经有$username=$_POST['username']--*
$username = rawurldecode($_POST['username']);
if (get_magic_quotes_gpc()) $username = stripslashes($username);
我真的很讨厌魔术语录。。。它总共让我对表单数据感到了50多个小时的沮丧,因为我忘记了它。只要它有效。我很高兴!
所以,现在mb_strlen工作了,我可以很容易地将其添加回。。。
if (mb_strlen($username) < MIN_USERNAME_SIZE) { echo 'invalid_too_short'; exit; }
效果很好!