【问题标题】:unknown column in 'field list' when columns exist存在列时“字段列表”中的未知列
【发布时间】:2015-05-18 07:02:31
【问题描述】:

我创建了一个数据库,其中包含以下内容:

desc users;
+--------------+--------------+------+-----+---------+----------------+
| Field        | Type         | Null | Key | Default | Extra          |
+--------------+--------------+------+-----+---------+----------------+
| UserID       | int(25)      | NO   | PRI | NULL    | auto_increment |
| Username     | varchar(65)  | YES  |     | NULL    |                |
| Fname        | varchar(65)  | YES  |     | NULL    |                |
| Lname        | varchar(65)  | YES  |     | NULL    |                |
| Password     | varchar(32)  | YES  |     | NULL    |                |
| Password1    | varchar(32)  | YES  |     | NULL    |                |
| EmailAddress | varchar(255) | YES  |     | NULL    |                |
+--------------+--------------+------+-----+---------+----------------+
7 rows in set (0.00 sec)

但是,当我运行这段代码时

if($email_exists == false && $Password == $Password1)
            {
                $sql="INSERT INTO users(u_Username, u_Fname, u_Lname, u_EmailAddress, u_Password)
                VALUES('$_POST[$Username]', '$_POST[$Fname]', '$_POST[$Lname]', '$_POST[$EmailAddress]', '$_POST[$Password]')";
                echo "<pre>"; print_r($sql); exit;
                if(!mysqli_query($link, $sql))
                {
                    #$query = mysqli_query($myConnection, $sqlCommand);
                    #die (mysqli_error($myConnection));
                    die('Error: ' . mysqli_error($link));               
                }
                header("location: login.php");
            }

我得到这个错误:

INSERT INTO users(u_Username, u_Fname, u_Lname, u_EmailAddress, u_Password)
                VALUES('', '', '', '', '')

这里的错误是什么?我正在使用 php 和 mysqli。我是新手,但我正在尝试让我的 register.php 文件接受并添加到我的数据库中。

在此编辑完整代码

<?php 
session_start();
require_once('connect.php');
require_once "utils.php";

if(isset($_POST['submit']))
{
    //CHECK EMPTY FORM DATA and SANITIZE
    if(!empty($_POST['Username'])&&
       !empty($_POST['Fname'])&& 
       !empty($_POST['Lname'])&& 
       !empty($_POST['EmailAddress'])&& 
       !empty($_POST['Password'])&& 
       !empty($_POST['Password1']))
    {
        $Username = mysqli_real_escape_string($link,htmlentities($_POST['Username']));
        $Fname = mysqli_real_escape_string($link,htmlentities($_POST['Fname']));
        $Lname = mysqli_real_escape_string($link,htmlentities($_POST['Lname']));
        $Password = mysqli_real_escape_string($link,htmlentities($_POST['Password']));
        $Password1 = mysqli_real_escape_string($link,htmlentities($_POST['Password1']));
        $EmailAddress = mysqli_real_escape_string($link,htmlentities($_POST['EmailAddress']));
    }

    else { header("Location: register.php");exit(); }

        if(isset($EmailAddress) && !empty($EmailAddress) &&
           isset($Password) && !empty($Password))
        {
            $email_exists = false;

            $sql="SELECT * FROM users WHERE EmailAddress='$EmailAddress'";

            if($result = mysqli_query($link, $sql))
            {
                while($record = mysqli_fetch_row($result))
                {
                    if($record = $EmailAddress)
                    {
                        $email_exists = true;
                    }

                    if($email_exists = true)
                    {
                        echo "<div id='reg_error1'>* The Email Used Already Exists! <br></div>";
                    }
                }
            }

            if($Password != $Password1)
            {
                echo "<div id='reg_error2'>* Your Password Does Not Match!<br></div>";
            }

            if($email_exists == false && $Password == $Password1)
            {
                $sql="INSERT INTO users(Username, Fname, Lname, EmailAddress, Password)
                VALUES('{$_POST['$Username']}', '{$_POST['$Fname']}', '{$_POST['$Lname']}', '{$_POST['$EmailAddress']}', '{$_POST['$Password']}')";
                echo "<pre>"; print_r($sql); exit;
                if(!mysqli_query($link, $sql))
                {
                    #$query = mysqli_query($myConnection, $sqlCommand);
                    #die (mysqli_error($myConnection));
                    die('Error: ' . mysqli_error($link));               
                }
                header("location: login.php");
            }
            echo "<hr>";
        }
}

【问题讨论】:

  • 当字段名称为Username 时为什么要u_Username
  • 你有一个无意的 SQL 注入漏洞!您将所有 POST 变量提取到局部变量中并转义它们,但是您不会在查询中使用转义版本!另外,你真的存储明文密码吗?

标签: php mysql mysqli error-handling


【解决方案1】:
$sql="INSERT INTO users(Username, Fname, Lname, EmailAddress, Password)
                VALUES('{$_POST['$Username']}', '{$_POST['$Fname']}', '{$_POST['$Lname']}', '{$_POST['$EmailAddress']}', '{$_POST['$Password']}')";

???

您已经将 POST 变量提取到那些本地变量中,那么为什么要尝试将它们用作 post 数组的索引参数?

 $sql="INSERT INTO users(Username, Fname, Lname, EmailAddress, Password)
                VALUES('{$Username'}', '{$Fname}', '{'$Lname}', '{'$EmailAddress'}', '{$Password}')";

如果我对您的代码的编辑有误,例如在错误的位置引用引号,那是因为我从来没有写过这样的查询。 PDO 和准备好的语句或存储过程是我自 2003 年以来一直在使用的东西,我相信任何不这样做的人都是在自找麻烦。

【讨论】:

  • 我修复了代码,它运行良好。感谢您的帮助!
【解决方案2】:

您已经将 $_POST 值存储在变量中,例如

$Username = mysqli_real_escape_string($link,htmlentities($_POST['Username']));

所以在查询中使用这些变量。

INSERT INTO users(Username, Fname, Lname, EmailAddress, Password)
            VALUES('$Username'', '$Fname', '$Lname', '$EmailAddress', '$Password')

【讨论】:

    【解决方案3】:

    您可以在处理像这样的小表时插入它。这是一些短手,但效果很好。

    $sql="INSERT  INTO users VALUES('', '$_POST[Username]', '$_POST[Fname]', '$_POST[Lname]', '$_POST[EmailAddress]', '$_POST[Password]')"; 
    

    ''... 未指定,因为它是自动生成的。 在表中,因为这里的 ID 是主键,所以我希望你把它放在自动增量上,我只是把它留空,用一个值或 ''... 没有指定,因为它是自动生成的。

    另外,我不鼓励您在不进行任何服务器端验证的情况下直接插入来自用户的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-09
      相关资源
      最近更新 更多