- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我如何在 PHP 中添加对传递的 $username 长度的检查。该站点是 UTF-8,但我相信 Javascript 使用的是不同的编码。您可以在评论中看到我在 PHP 中尝试了不同的东西但它们不起作用。
我尝试过但没有成功的方法:
更多信息
我的 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 中 DIE 时得到的返回结果,如下所示(在下面进行 Ajax 更改之前和之后 [在请求中添加 UTF-8]...
PHP 代码片段
die ('!1!' . $username . '!2!' . mb_strlen($username) . '!3!' . strlen($username) . '!4!');
测试数据
用户名:大卫佩里
!1!大卫佩里!2!11!3!11!4!
用户名: ܦ"~÷Û♦
!1!V\"~��%u2666!2!9!3!13!4!
第一个有效。第二个应该可以,但看起来编码很奇怪(可以理解)。
第二个有 7 个可见字符。 mb_strlen显示9,strlen显示13。
在阅读了 Joeri Sebrechts 的解决方案和他们给我的链接后,我查找了 Ajax 请求参数,有人得到了以下...
AJAX SNIPPIT(从原始代码更改)
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);
我真的很讨厌 magic_quotes...它让我总共有 50 多个小时对表单数据感到沮丧,因为我忘记了它。只要它有效。我很高兴!
所以,现在 mb_strlen 可以工作了,我可以很容易地把它加回去......
if (mb_strlen($username) < MIN_USERNAME_SIZE) { echo 'invalid_too_short'; exit; }
效果很好!
最佳答案
PHP 是一个字节处理器,它不识别字符集。这会产生许多棘手的后果。
Strlen() 返回以字节为单位的长度,而不是以字符为单位的长度。这是因为php的“string”类型实际上是一个字节数组。 Utf8 为“特殊字符”使用每个字符多于一个字节。因此 strlen() 只会为您提供一小部分文本(= 纯英文文本)的正确答案。
Mb_strlen() 将字符串视为实际字符,但假定它采用通过 mbstring.internal_encoding 指定的编码,因为字符串本身只是一个字节数组,没有指定其字符集的元数据。如果您使用的是 utf8 数据并将 internal_encoding 设置为 utf8,它将为您提供正确的答案。如果您的数据不是 utf8,它会给您错误的答案。
Mysql 将从 php 接收字节流,并根据您通过 SET NAMES 指令设置的数据库 session 字符集对其进行解析。每次连接到数据库时,您都必须通知它您的 php 字符串的编码。
浏览器从 php 接收字节流,并根据内容类型字符集 http header 解析它,您可以通过 php.ini default_charset 控制它。 ajax 调用将以与其运行的页面相同的编码提交。
总而言之,您可以在下一页找到有关如何确保所有数据都被视为 utf8 的建议。遵循它,您的问题应该会自行解决。 http://malevolent.com/weblog/archive/2007/03/12/unicode-utf8-php-mysql/
关于php - mb_strlen() 和 strlen() 不会从对 PHP 的 Ajax 调用返回正确的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8250709/
有人有 Comet 应用程序 .net 的任何样本吗? 我需要一个示例如何在服务器中保持客户端的连接? 最佳答案 这里也有一些不错的: http://www.frozenmountain.com/we
我想知道是否有 Yii2 专家可以帮助我了解如何最好地使用 ajax 表单与 Yii ajax 验证相结合。我想我可以在不带您阅读我所有代码的情况下解释这个问题。 我正在处理一个促销代码输入表单,用户
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求提供代码的问题必须表现出对所解决问题的最低限度的了解。包括尝试的解决方案、为什么它们不起作用以及预期结果
f:ajax 和 a4j:ajax 标记之间有什么显着差异吗? 我知道 Richfaces 4 中的 a4j:ajax 基于 native f:ajax JSF2 标记,添加了一些 f:ajax 中未
我已经尝试过这样但无法获取数组列表。它返回“null” var data=[]; data[0] = '1'; data[1] = '2'; $.ajax({
在教程中可以看到 jQuery.ajax 和 $.ajax 喜欢这里 http://www.thekludge.com/form-auto-save-with-jquery-serialize/ jQ
过度使用 AJAX 会影响性能吗?在大型 Web 应用程序的上下文中,您如何处理 AJAX 请求以控制异步请求? 最佳答案 过度使用任何东西都会降低性能;在必要时使用 AJAX 将提高性能,特别是如果
似乎我无法使用 Ext.Ajax.request 进行跨域 ajax 调用。看起来 ScriptTag: True 没有任何效果。 这是我的代码: {
我正在使用 Bottle 微框架(但我怀疑我的问题来自它) 首先,如果我定义了一个从/test_redirect 到/x 的简单重定向,它会起作用。所以 Bottle redirect() 在简单的情
任何人都可以指出各种 AJAX 库的统一比较吗?我已经阅读了大约十几种不同的书,我即将开始一个项目,但我对自己是否已经探索了可能性的空间没有信心。 请注意,我不是在要求“我认为 XXX 很棒”——我正
似乎使用 AJAX 的站点和应用程序正在迅速增长。使用 AJAX 的主要原因之一可能是增强用户体验。我担心的是,仅仅因为项目可以使用 AJAX,并不意味着它应该。 可能是为了 UX,AJAX 向站点/
假设我有一个可以通过 Javascript 自定义的“报告”页面。假设我有可以更改的 start_date、end_date 和类型(“简单”或“完整”)。现在 我希望地址栏始终包含当前(自定义) V
我一直在阅读 Ajax 并且希望从 stackoverflow 社区看到我是否正确理解所有内容。 因此,正常的客户端服务器交互是用户在 url 中拉出 Web 浏览器类型,并将 HTTP 请求发送到服
这可能有点牵强,但让我们假设我们需要它以这种方式工作: 我在服务器的 web 根目录中有一个 index.html 文件。该文件中的 javascript 需要向/secure/ajax.php 发出
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它. 去年关闭。 Improve this
我希望ajax post成功进入主页。由于某种原因,我一直做错事。知道我应该做什么来解决这个问题吗? window.APP_ROOT_URL = ""; Ajax $.ajax({ url: '#{a
我在 2 个不同的函数中有 2 个 ajax 调用。我想用.click来调用这2个函数。 func1 将数据插入数据库,然后 func2 检索数据,所以我的问题是如何等到 func1 完全完成然后只执
我试图在单击按钮后禁用该按钮。我尝试过: $("#ajaxStart").click(function() { $("#ajaxStart").attr("disabled", true);
我试图在每个 Ajax 请求上显示加载动画/微调器 我的 application.js $(document).on("turbolinks:load", function() { window.
我正在显示使用jQplot监视数据的图形。 为了刷新保存该图的div,我每5秒调用一次ajax调用(请参见下面的JavaScript摘录)。 在服务器上,PHP脚本从数据库中检索数据。 成功后,将在5
我是一名优秀的程序员,十分优秀!