执行但不插入数据的PHP代码


PHP Code executing but not inserting data?

我学习了一年前的Unity Client-PHP Server-数据库集成在线教程。代码似乎执行得很好,它完美地到达了"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);
$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($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_hashpassword_verify

调试模式中,永远不要使用@来抑制错误,即@mysqli_query。此外,or die("DB ERROR")的描述性不强。即使解决了这个问题,DBERROR为您提供了什么好处?相反,使用or die( mysqli_error($link) )来查看查询的实际情况。

您还有3个要插入的值,但查询语句中只有2列:

('Username', 'Password') // 2 columns
VALUES ('" .$Username . "', MD5('" . $Password . "'), 0)"; // 3 values

0插入到哪个列?此值需要用一列表示。

表/列名永远不应该用引号括起来;仅勾选`accounts`