尝试过的方法并没有起作用: 更改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请求,但没找到合适的方法。
MySQL是否正确使用了UPPER?针对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!');
测试数据
用户名:David Perry
!1!David Perry!2!11!3!11!4!
用户名:ܦ"~÷Û♦
!1!ܦ\"~��%u2666!2!9!3!13!4!
第一个有效。第二个应该有效,但看起来编码有问题(可以理解)。
第二个有7个可见字符。mb_strlen显示为9,strlen显示为13。
在阅读了Joeri Sebrechts的解决方案和他们给我的链接之后,我查找了Ajax请求参数,有人提供了以下内容...
AJAX片段(已更改原始代码)
registerRequest.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");
我已将
charset=UTF-8
添加进来,这是我在一篇文章中看到的例子。更新:11月27日,东部标准时间晚上9:11
好的,经过大量阅读,我相信我编码JS的方式是错误的。我以前一直在使用escape函数...如下所示...
var requestData = "username=" + escape(sNameToCheck);
浏览了这个网站后...
http://www.the-art-of-web.com/javascript/escape/
我更加理解其每个函数的作用及其编码和解码方式。我应该能够完成这个任务。
var requestData = "username=" + encodeURIComponent(sNameToCheck);
在 JavaScript 和 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);
我真的很讨厌魔术引号(magic_quotes)……在处理表单数据时,它已经给我带来了50多个小时的烦恼,因为我忘记了它的存在。只要它工作正常,我就很开心!
现在,mb_strlen函数可以正常使用了,我可以轻松地把它加回去……
if (mb_strlen($username) < MIN_USERNAME_SIZE) { echo 'invalid_too_short'; exit; }
非常好用!
mb_strlen()
这一部分注释掉了,不管出于什么原因。具体是哪里出了问题? - Sean Walsh