【问题标题】:PHP Code executing but not inserting data?PHP代码执行但不插入数据?
【发布时间】:2016-04-09 15:06:04
【问题描述】:

我遵循了一年前的 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);

【问题讨论】:

  • 您的插入有两列,但有三个值。此外,在您插入的行上没有错误检查。

标签: php mysql database mysqli insert-into


【解决方案1】:
$insert = "INSERT INTO 'accounts' ('Username', 'Password') VALUES ('" .$Username . "', MD5('" . $Password . "'), 0)";

答案:用户名和密码是字段,但您尝试插入用户名、密码和 0

建议:不要只做 MD5 加密,那是超级容易解密的。

编辑: 就像@andrewsi 在 cmets 中所说,如果您只检查它是否为空,那么任何人都可以 SQL 注入您的数据库并删除您的表或进行更改。确保您正确过滤输入。

【讨论】:

  • 您可能还想添加一个关于使用准备好的语句的注释 - 这目前对 SQL 注入开放
【解决方案2】:

首先,您的查询只有 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

【讨论】:

  • 非常感谢(大家)的帮助,但这个答案是我觉得最详细的。我以前也从来没有处理过安全问题,因为这样的 SQL 注入漏洞等对我来说都是新的......你有什么其他需要注意的提示(因为这是数据库的非常基本的版本/服务器,我很可能很快就会大大扩展它)
【解决方案3】:

debug 模式下,永远不要使用@ 来抑制错误,即。 @mysqli_queryor 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`

【讨论】:

    猜你喜欢
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    • 2017-07-25
    • 1970-01-01
    • 1970-01-01
    • 2017-01-29
    • 2014-05-25
    • 1970-01-01
    相关资源
    最近更新 更多