where子句中的未知列

时间:2017-11-17 23:14:06

标签: php html sql mysqli

mySQLi和php新手,所以我一直试图将登录/注册系统作为练习。

完成了创建帐户页面,但在登录文件中,我想对其进行验证,以便在输入不存在的用户名时,它将回显出来"用户名不存在"

这里是php:

include("Database.php");
if(isset($_POST["login"])) {
    $username = $_POST["username"];
    $password = $_POST["password"];

    $checkUsername = "SELECT username FROM Users WHERE username=$username";
    $connected->query($checkUsername);

    if(mysqli_num_rows($checkUsername) !=0 ){
        $alreadyExists = "User Already Exists";
        echo $alreadyExists;
    } else {
        echo "User does not exist";
    }
}

它继续说用户名不存在,即使我选择了数据库中的用户名,所以我随后运行了这段代码:

echo "User does not exist" .mysqli_error($connected);

然后给了我这个错误信息:

Unknown column 'testuser' in 'where clause'

(测试用户是我输入的用户名,在数据库中)

我阅读了其他一些Stack Overflow的答案并尝试了这个:

"SELECT username FROM users WHERE $username=username"

和此:

"SELECT username FROM users WHERE username= ". '$username'"
似乎没什么用。

理想情况下,如果用户名已存在,则应该回显#34;用户名已经存在"

2 个答案:

答案 0 :(得分:1)

我看到两个问题,都在上面的评论中提到过。

  1. 在MySQL查询中,字符串值需要引用它们 您看到的“未知列”错误表明存在此问题。

    $checkUsername = "SELECT username FROM Users WHERE username='$username'";
    

    另外,我养成quoting column names with backticks的习惯。

    $checkUsername = "SELECT `username` FROM `Users` WHERE `username`='$username'";
    

    (实际上,我习惯使用PDO ......但稍后会更多地使用参数化语句。)

  2. num_rows是查询result的一个属性,但您在字符串上尝试它。

    $result = $connected->query($checkUsername);
    if (mysqli_num_rows($result)>0) { ....
    
  3. 确定了您的代码的直接问题后,我同意@GordonLinnof和其他人使用parameterized queriesparticularly object-oriented style所表达的观点,这是一种有用的开发方法

      

    基本工作流程

         

    准备好的语句执行包括两个阶段:准备和执行。在准备阶段,将语句模板发送到数据库服务器。服务器执行语法检查并初始化服务器内部资源以供以后使用。

    这是一个基本的例子:

    // build the query string. notice the question mark placeholder.
    $sql = "SELECT `username` FROM `Users` WHERE `username`=?";
    
    // prepare the statement. returns a statement object.
    $stmt = $mysqli->prepare($sql);
    
    // bind a parameter to the statement. note the "s" for "string" type.
    $stmt->bind_param("s",$username);
    
    // execute the statement.
    $stmt->execute();
    
    // get the number of rows from the statement result.
    $row_count = $stmt->num_rows();
    

    有关详细参考,请参阅:
    Give me parameterized SQL, or give me death
    When should I use prepared statements?

答案 1 :(得分:0)

您需要在您提供的示例中引用$ username。 "SELECT username FROM users WHERE username='$username'"如前所述,您应该使用?或将:username命名为 <div class="col-md-6 to-animate-2"> <h3>Reservation Form</h3> <div class="form-group "> <form enctype="multipart/form-data" action="sendreservation.php" method="POST" name="reservations"> <label for="name" class="sr-only">Name</label> <input id="name" class="form-control" placeholder="Name" type="text"> <label for="email" class="sr-only">Email</label> <input id="email" class="form-control" placeholder="Email" type="email"> <label for="partysize" class="sr-only">Party Size</label> <select class="form-control" id="partysize"> <option>Select a Party Size</option> <option>1</option> <option>2</option> <option>3</option> <option>4</option> <option>5</option> <option>6</option> <option>7</option> <option>8</option> <option>9</option> <option>10</option> <option>10+</option> </select> <label for="occation" class="sr-only">Occassion</label> <select class="form-control" id="occassion"> <option>Select an Occasion</option> <option>Wedding Ceremony</option> <option>Birthday</option> <option>Others</option> </select> <label for="date" class="sr-only">Date</label> <input id="datetime" class="form-control" placeholder="Date &amp; Time" type="text"> <label for="message" class="sr-only">Message</label> <textarea name="message" id="message" cols="30" rows="5" class="form-control" placeholder="Message"></textarea> <div class="form-group "> <input class="btn btn-primary" value="Send Message" type="submit" name="send"> </form> </div> </div> </div> ,而不是来自用户输入的$ username。