PHP 代码执行但不插入数据?
PHP Code executing but not inserting data?
我遵循了一年前的 Unity 客户端在线教程 - PHP 服务器 - 数据库集成。代码似乎执行得很好,它完美地到达了 'echo"Success"' 行等。
但是当我查看我的数据库时,那里什么也没有。它是空白的,我不知道为什么。
注意:在线教程使用 mysql... 而我使用的是(非 depracted)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);
$insert = "INSERT INTO 'accounts' ('Username', 'Password') VALUES ('" .$Username . "', MD5('" . $Password . "'), 0)";
答案:用户名和密码是字段,但您试图插入用户名、密码和 0
建议:不要只做 MD5 加密,解密超级容易。
编辑:
也就像@andrewsi 在评论中所说的那样,如果您只检查它是否为空,那么任何人都可以 SQL 注入您的数据库并删除您的表或进行更改。确保您正确地过滤了您的输入。
首先,您的查询只有 2 列,但您要插入 3 个值:
$insert = "INSERT INTO 'accounts' ('Username', 'Password') VALUES ('" .$Username . "', MD5('" . $Password . "'), 0)";
列
- 用户名
- 密码
要插入的值
- $用户名
- md5($密码)
- 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
。
在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 被插入到哪一列?这个值需要用一列来表示。
并且 table/column 名称不应该用引号引起来;只勾选`accounts`
我遵循了一年前的 Unity 客户端在线教程 - PHP 服务器 - 数据库集成。代码似乎执行得很好,它完美地到达了 'echo"Success"' 行等。
但是当我查看我的数据库时,那里什么也没有。它是空白的,我不知道为什么。
注意:在线教程使用 mysql... 而我使用的是(非 depracted)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);
$insert = "INSERT INTO 'accounts' ('Username', 'Password') VALUES ('" .$Username . "', MD5('" . $Password . "'), 0)";
答案:用户名和密码是字段,但您试图插入用户名、密码和 0
建议:不要只做 MD5 加密,解密超级容易。
编辑: 也就像@andrewsi 在评论中所说的那样,如果您只检查它是否为空,那么任何人都可以 SQL 注入您的数据库并删除您的表或进行更改。确保您正确地过滤了您的输入。
首先,您的查询只有 2 列,但您要插入 3 个值:
$insert = "INSERT INTO 'accounts' ('Username', 'Password') VALUES ('" .$Username . "', MD5('" . $Password . "'), 0)";
列
- 用户名
- 密码
要插入的值
- $用户名
- md5($密码)
- 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
。
在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 被插入到哪一列?这个值需要用一列来表示。
并且 table/column 名称不应该用引号引起来;只勾选`accounts`