【问题标题】:MySQL query not executing properlyMySQL 查询未正确执行
【发布时间】:2014-06-12 13:06:22
【问题描述】:

我想制作一个 PHP 登录脚本,当用户登录时,它会删除登录表单,其中另一个 div 显示“欢迎 [user_name]”。我在与我的 html 相同的页面上运行脚本,但查询总是失败。谁能解决这个问题,为什么会这样?

PHP 代码:

<?php include("connect.php")?>
<?php
    session_start();

    //Function to sanitize values received from the form. Prevents SQL injection
    function clean($str) {
        $str = @trim($str);
        if(get_magic_quotes_gpc()) {
            $str = stripslashes($str);
        }
        return mysql_real_escape_string($str);
    }

    if(isset($_POST['username']) && isset($_POST['username'])){

        //Sanitize the POST values
        $UserName = clean($_POST['username']);
        $Password =(md5($_POST['password']));

        //Create query
        $qry = "SELECT 'UserName' , 'Password' FROM users WHERE UserName='$UserName' AND Password='$Password'";
        $result = mysql_query($qry);

        //Check whether the query was successful or not
        if($result) {
            if(mysql_num_rows($result) > 0) {
                //Login Successful
                session_regenerate_id();
                $member = mysql_fetch_assoc($result);
                $_SESSION['SESS_MEMBER_ID'] = $member['mem_id'];
                $_SESSION['SESS_FIRST_NAME'] = $member['FName'];
                $_SESSION['SESS_LAST_NAME'] = $member['LName'];
                //session_write_close();
                echo 'SUCCESS';
                //loggedin();
                //exit();
            }
            else {
                //Login failed
                echo 'FAILED.';
                //loginfail();
                //exit();
                }
            }
        else {
            die("Query failed");
        }   
    }
?>

HTML 代码:

<form name="user-form" id="user-form" action="members.php" method="POST">
                    <input type="text" name="username" id="username" placeholder="Username"></input>
                    <input type="password" name="password" id="password" placeholder="Password"></input>
                    <br/>
                    <input type="submit" id="sign" name="Sign In"></input>
                </form>

您的帮助将不胜感激,因为我是新手。

【问题讨论】:

  • 删除列名中的所有单引号。 SELECT 'UserName' , 'Password' 应该是 SELECT UserName , Password
  • 你应该绑定变量,而不是清理,见这里:stackoverflow.com/questions/4364686/…
  • @AbhikChakraborty 是正确的,如果您愿意,可以将它们切换为 ``` 反引号。
  • 这个问题似乎离题了,因为 SO 不是我们为您“解决这个问题”的帮助台。
  • 另外说明:请不要使用 md5 对密码进行哈希处理。 md5坏了。此外,这些哈希算法旨在快速运行,这意味着如果您的数据库受到破坏,蛮力攻击更有可能成功。您应该使用 bcrypt (或类似的)。另见:stackoverflow.com/questions/4795385/…

标签: php mysql sql


【解决方案1】:

这是错误的-

SELECT 'UserName' , 'Password'....

删除 ' 并替换为


还要妥善处理字符串,只需将WHERE UserName='$UserName' AND Password='$Password'" 替换为-

WHERE UserName=\"".$UserName."\" AND Password=\"".$Password."\""


所以完整的查询将是-

 "SELECT `UserName` , `Password` FROM users WHERE UserName=\"".$UserName."\" AND Password=\"".$Password."\""

(还请记住,列名区分大小写)

【讨论】:

    【解决方案2】:

    这个:

    $qry = "SELECT 'UserName' , 'Password' FROM users WHERE UserName='$UserName' AND Password='$Password'";
    

    应该是:

    $qry = "SELECT username , password FROM users WHERE UserName='$UserName' AND Password='$Password'";
    

    【讨论】:

    • 嗯,不,您应该对列名进行分隔。但是你应该正确地做,这意味着反引号而不是单引号。
    • 在 12 年的编程生涯中,我从未在一家标准涉及列名分隔的公司工作过。仅当列名是您使用的 SQL 数据库中的保留字时才需要这样做,在这种情况下,您可能应该重命名列。
    • 没关系。但是您应该指出问卷中提出的错误。这个..... 应该是......。它没有明确地指导用户。你需要回答明智。 Read out here
    • @Mark:那么你曾为一些编码标准非常糟糕的公司工作过,IMO。在 20 年的编程生涯中,我从未在一家会宣扬这种草率和缺乏严谨性的公司工作过。
    • 我完全不同意。编码标准充其量是指导方针,最坏的情况是意见。但是,在这种特殊情况下,对列标识符的反引号支持因环境和环境设置而异。在没有它们的情况下进行开发可以使代码足够灵活,无需大量修改即可支持多种环境,并且开发这样的代码应该成为让开发人员更流畅地在环境之间移动的习惯。但是,这也只是我的看法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-10
    • 2015-04-17
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    相关资源
    最近更新 更多