Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/236.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mb_strlen()&;斯特伦()唐';t从对PHP的Ajax调用返回正确的值_Php_Javascript_Ajax_Encoding_Utf 8 - Fatal编程技术网

mb_strlen()&;斯特伦()唐';t从对PHP的Ajax调用返回正确的值

mb_strlen()&;斯特伦()唐';t从对PHP的Ajax调用返回正确的值,php,javascript,ajax,encoding,utf-8,Php,Javascript,Ajax,Encoding,Utf 8,如何在PHP中添加对传递的$username长度的检查。该站点是UTF-8,但我相信Javascript使用的是不同的编码。你可以在评论中看到,我在PHP中尝试了不同的东西,但都不起作用 我尝试过但没有成功的地方: 更改Ajax(javascript)以通过UTF-8而不是javascript编码传递变量 PHP中的strlen,mbstrlen-都返回不正确的值 更多信息 我的Ajax向我的PHP发送一个用户名,PHP检查SQL数据库并返回是否可用。我决定在检查数据库之前尝试在PHP中做一

如何在PHP中添加对传递的$username长度的检查。该站点是UTF-8,但我相信Javascript使用的是不同的编码。你可以在评论中看到,我在PHP中尝试了不同的东西,但都不起作用

我尝试过但没有成功的地方:

  • 更改Ajax(javascript)以通过UTF-8而不是javascript编码传递变量
  • PHP中的strlen,mbstrlen-都返回不正确的值
更多信息

我的Ajax向我的PHP发送一个用户名,PHP检查SQL数据库并返回是否可用。我决定在检查数据库之前尝试在PHP中做一些额外的检查(比如
mb_strlen($username
)。
mb_内部编码(“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);
测试结果

这就是当我死在PHP中时我得到的回报,并如下面所示(在进行下面的Ajax更改之前和之后[将UTF-8添加到请求中]

PHP SNIPPIT

测试数据

用户名:David Perry

!1!大卫·佩里!2!11!3!11!4

用户名:ÜAlpha”~÷Û♦

!1!ܦ\“~��%u2666!2!9!3!13!4

第一个可以工作,第二个应该可以工作,但是看起来编码很奇怪(可以理解)

第二个显示7个可见字符。mb_strlen显示9个,strlen显示13个

在阅读了Joeri Sebrechts的解决方案和他们给我的链接后,我查找了Ajax请求参数,有人有以下发现

AJAX SNIPPIT(从原始代码更改)

(我在一篇文章中看到的一个例子中添加了
charset=UTF-8

更新:美国东部时间11月27日晚9:11

好的,经过大量阅读,我相信我的JS编码是错误的。我使用了escape…如下所示

var requestData = "username=" + escape(sNameToCheck);
看了这个网站之后

它帮助我了解了每个函数的更多情况,以及它们是如何编码和解码的。我应该能够做到这一点

var requestData = "username=" + encodeURIComponent(sNameToCheck);
$username = rawurldecode($_POST['username']);
在JS和PHP中,我应该能够做到这一点

var requestData = "username=" + encodeURIComponent(sNameToCheck);
$username = rawurldecode($_POST['username']);
这样做仍然会给我8个字符,而不是7个。这很接近,但我做错了什么吗?如果我在屏幕上的文本中移动光标,它是7个字符。有什么办法可以帮助我更好地理解这一点吗

已修复/已解决!!!

好的,谢谢你的建议,这些建议引导我朝着正确的方向努力。我的改变如下

在AJAX中——我曾经有过逃脱(snamotocheck)--

在PHP中*--我以前有$username=$\u POST['username']--*

我真的很讨厌magic_quotes…它总共让我对表单数据感到50多个小时的沮丧,因为我忘记了它。只要它有效。我很高兴

所以,现在mb_strlen可以工作了,我可以很容易地将它添加回

if (mb_strlen($username) < MIN_USERNAME_SIZE) { echo 'invalid_too_short'; exit; }
if(mb_strlen($username)

很好用!

快速浏览,您可以清理:

if (request.status == 200) {
    if (request.responseText == "available") {
        document.getElementById("txt_username").innerHTML = "NAME AVAILABLE!";
        document.images['img_username'].src=img_smile;
        document.getElementById("continue").disabled = false;
        document.getElementById("field_username").className = 'validated';
    } else if (request.responseText == "taken") {
        document.getElementById("txt_username").innerHTML = "NAME TAKEN!";
        document.images['img_username'].src=img_sad;
        document.getElementById("field_username").className = 'error';
    } else if (request.responseText == "invalid_too_short") {
        document.getElementById("txt_username").innerHTML = "TOO SHORT!";
        document.images['img_username'].src=img_sad;
        document.getElementById("field_username").className = 'error';
    } else {
        document.getElementById("txt_username").innerHTML = "AJAX ERROR!";
                document.images['img_username'].src=img_sad;
        document.getElementById("field_username").className = 'error';
    }
  }
致:


PHP是一个字节处理器,它不知道字符集。这有很多棘手的后果

Strlen()返回以字节为单位的长度,而不是以字符为单位的长度。这是因为php的“字符串”类型实际上是一个字节数组。Utf8对“特殊字符”每个字符使用一个以上的字节。因此Strlen()只会为一小部分文本(=纯英语文本)提供正确答案

Mb_strlen()将字符串视为实际字符,但假定它采用通过mbstring.internal_encoding指定的编码,因为字符串本身只是一个字节数组,没有指定其字符集的元数据。如果使用utf8数据并将internal_encoding设置为utf8,则会给出正确答案。如果数据不是u它会给你错误的答案

Mysql将从php接收字节流,并将根据数据库会话的字符集对其进行解析,该字符集是通过set NAME指令设置的。每次连接到数据库时,都必须通知它php字符串的编码方式

浏览器从php接收字节流,并将基于内容类型charset http头对其进行解析,您可以通过php.ini default_charset对其进行控制。ajax调用将以与其运行的页面相同的编码提交

总之,你可以在下一页找到关于如何确保所有数据都被视为utf8的建议。遵循它,你的问题就会自行解决。

那一段……很伤人。一成不变,迂腐,冗长。请编辑(至少添加一些段落分隔符)。嗯,你有
mb_strlen()
部分因任何原因被注释掉。到底是什么不起作用?您好。mb_strlen和strlen都给出了错误的值,因为我认为它在Ajax调用中的编码不同。谢谢!您的方法更干净。我会整理我的代码!您能帮我处理strlen部分吗?我读了您链接的文章。从未想过太好了!谢谢你的提示!我试着练习好的编程,但在学习的时候-哇…太多了!哈哈,我以前用过===但我不知道那篇文章里有什么。谢谢!!!没问题。很高兴我能帮上忙:)我忘记了一些可能是问题所在的代码行……在最初的Ajax调用registerRequest.setRequestHeader(“Content-Type”,“application/x-www-form-urlencoded”)中;当我打印PHP看到的东西时,它是一堆奇怪的/u2323东西。因此,我假设这是Ajax编码。有没有办法将我的Ajax作为UTF-8传递?我用更多代码重新编辑了我的文章,以便您可以看到exac
$username = rawurldecode($_POST['username']);
if (get_magic_quotes_gpc()) $username = stripslashes($username);
if (mb_strlen($username) < MIN_USERNAME_SIZE) { echo 'invalid_too_short'; exit; }
if (request.status == 200) {
    if (request.responseText == "available") {
        document.getElementById("txt_username").innerHTML = "NAME AVAILABLE!";
        document.images['img_username'].src=img_smile;
        document.getElementById("continue").disabled = false;
        document.getElementById("field_username").className = 'validated';
    } else if (request.responseText == "taken") {
        document.getElementById("txt_username").innerHTML = "NAME TAKEN!";
        document.images['img_username'].src=img_sad;
        document.getElementById("field_username").className = 'error';
    } else if (request.responseText == "invalid_too_short") {
        document.getElementById("txt_username").innerHTML = "TOO SHORT!";
        document.images['img_username'].src=img_sad;
        document.getElementById("field_username").className = 'error';
    } else {
        document.getElementById("txt_username").innerHTML = "AJAX ERROR!";
                document.images['img_username'].src=img_sad;
        document.getElementById("field_username").className = 'error';
    }
  }
// I prefer triple equals
// Read more at http://javascript.crockford.com/style2.html
if (request.status === 200) {
        // use variables!
        var txtUsername = document.getElementById('txt_username');
        var fieldUsername = document.getElementById('field_username');
        var imgUsername = document.getElementById('img_username');

        var response = request.responseText;

        var error = true;

        // you can do a switch statement here too, if you prefer
        if (response === "available") {
            txtUsername.innerHTML = "NAME AVAILABLE!";

            document.getElementById("continue").disabled = false;

            error = false;

        } else if (response === "taken") {
            txtUsername.innerHTML = "NAME TAKEN!";

        } else if (response === "invalid_too_short") {
            txtUsername.innerHTML = "TOO SHORT!";

        } else {
            txtUsername.innerHTML = "AJAX ERROR!";
        }

        // refactor error actions
        if (error) {
            imgUsername.src = img_sad;
            fieldUsername.className = 'error';
        } else {
            imgUsername.src = img_smile;
            fieldUsername.className = 'validated';
        }
}