我现在正在Unity上编写一个登录系统,但我有这个奇怪的错误。出于某种原因,当我得到php文件的输出时,C#文件中的if语句看不到'loginreturn'(= AccountDoesntExist)和字符串“AccountDoesntExist”是相同的。我不知道为什么,但也许你聪明的人看到了这个错误,可以帮助我。
C#代码:
IEnumerator TryLogin(string username, string password)
{
WWWForm form = new WWWForm();
form.AddField("username", username);
form.AddField("password", password);
WWW loginWWW = new WWW(LoginURL, form);
yield return loginWWW;
if (!string.IsNullOrEmpty(loginWWW.error))
{
Debug.LogError("Cannot connect to LOGIN servers! Error: " + loginWWW.error);
}else
{
string loginreturn = loginWWW.text;
Debug.Log(loginWWW.text);
Debug.Log(loginreturn);
if (loginreturn == "AccountDoesntExist")
Debug.Log("WORKS!");
}
}
PHP代码(因为我登录的方式,它总是返回“AccountDoesntExist”):
<?php
$inputusername = $_REQUEST["username"];
$password = $_REQUEST["password"];
$servername = "localhost";
$username = "chatsystem_accs";
$password = "CENCORED";
$dbname = "chatsystem_accs";
//Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
//Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
//Connected successfully
$sql = "SELECT `username`, `password` FROM `accounts`";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
if ($inputusername == $row["username"]) {
if (password_verify($password, $row["password"])) {
echo "Success";
}else {
echo "UsernameOrPasswordIncorrect";
}
}else {
echo "AccountDoesntExist";
}
}
}else {
echo "AccountDoesntExist";
}
//Close connection
$conn->close();
?>
答案 0 :(得分:0)
很可能是UTF-8 problem。接收的字节中有一个额外的数据。在比较之前将接收的数据转换为UTF-8。
替换
string loginreturn = loginWWW.text;
与
string loginreturn = System.Text.Encoding.UTF8.GetString(loginWWW.bytes, 3, loginWWW.bytes.Length - 3);
修改强>:
像这样调试:
Debug.Log("Received Length: "+ loginreturn.Length);
Debug.Log("Compare Length: " + "AccountDoesntExist".Length);
结果是:
收到的长度:19
比较长度:18
这是错误的。某处有一个额外的角色。
使用下面的函数再次调试,然后使用displayAsChar(loginreturn);
void displayAsChar(string badValue)
{
char[] values = badValue.ToCharArray();
for (int i = 0; i < values.Length; i++)
{
string tempResult = "Value at index " + i + " is: " + values[i];
Debug.Log(tempResult);
}
}
它显示角色末尾有一个空字符。我认为那只是“”但事实并非如此。
我做了另一个函数来查看这个空字符是什么:
void showStringAsHex(string badValue)
{
foreach (char c in badValue)
Debug.Log("To Unicode: " + ((int)c).ToString("X2"));
}
宾果。最后一个字符是0A
(十六进制),也表示为\n
。这用作换行。
<强> FIX 强>:
在执行比较操作之前,修剪字符串。这将删除角色开头和结尾的任何转义字符和空字符串。
要修剪角色,只需在比较字符串之前添加以下代码。
loginreturn = loginreturn.Trim();
为什么要发布调试过程?
不同服务器的字符可能不同。发布此信息将有助于其他人在将来为自己排除故障并解决此问题。