我已经按照Unity客户端一年的在线教程 - PHP服务器 - 数据库集成。代码似乎执行得很好,它完美地达到了'echo'Success“'行等。
然而,当我查看我的数据库时,那里什么都没有。它空白,我不明白为什么。
注意:在线教程使用的是mysql ...而我正在使用(非删除的)mysqli ...但似乎没有那么大的差别,但我是一个完全的新手PHP编码,只有最少的经验,所以很可能我错了?
<?php
/**
* Created by PhpStorm.
* User: Josh
* Date: 09/04/2016
* Time: 14:11
*/
$Username = $_REQUEST["Username"];
$Password = $_REQUEST["Password"];
$Hostname = "localhost";
$DBName = "statemilitaryrpdb";
$User = "root";
$PasswordP = "";
$link = mysqli_connect($Hostname, $User, $PasswordP, $DBName) or die ("Can't Connect to DB");
if (!$Username || !$Password) {
echo "Empty";
} else
{
$SQL = "SELECT * FROM accounts WHERE Username = '" . $Username ."'";
$Result = @mysqli_query($link, $SQL) or die ("DB ERROR");
$Total = mysqli_num_rows($Result);
if($Total == 0)
{
$insert = "INSERT INTO 'accounts' ('Username', 'Password') VALUES ('" .$Username . "', MD5('" . $Password . "'), 0)";
$SQL1 = mysqli_query($link, $insert);
$Result2 = @mysqli_query($link, $SQL) or die ("DB ERROR");
echo(mysqli_num_rows($Result2));
}
else
{
echo"Username Already Used";
}
}
mysqli_close($link);
答案 0 :(得分:1)
首先,您的查询只有2列,但您要插入3个值:
$insert = "INSERT INTO 'accounts' ('Username', 'Password') VALUES ('" .$Username . "', MD5('" . $Password . "'), 0)";
列
要插入的值
因此,并非所有值都会被插入。
其次,对于MySQL相关名称,您需要使用返回刻度而不是单引号。
因此,这个:
INSERT INTO 'accounts'
应该是:
INSERT INTO `accounts`
第三,您的代码容易受到MySQL注入攻击,您应该使用mysqli_real_escape_string()
:
$Username = mysqli_real_escape_string($link, $_REQUEST["Username"]);
$Password = mysqli_real_escape_string($link, $_REQUEST["Password"]);
提示:您不应该禁止显示错误消息:
@mysqli_query($link, $SQL)
删除@
以启用错误报告。它在诊断语法错误方面非常有用。
此外,您不应使用md5()
哈希密码,因为它不是很安全。请改用password_hash
和password_verify
。
答案 1 :(得分:0)
在 debug 模式下,永远不要使用@来抑制错误,即。 @mysqli_query
。 or die("DB ERROR")
也不具有描述性。即使这解决了, DB ERROR 为您提供了哪些好处?相反,请使用or die( mysqli_error($link) )
查看查询的实际情况。
您还要插入3个值,但查询语句中只显示2列:
('Username', 'Password') // 2 columns
VALUES ('" .$Username . "', MD5('" . $Password . "'), 0)"; // 3 values
什么列 0 被插入?该值需要用列表示。
表名/列名永远不应该用引号括起来;只勾选`accounts`