【问题标题】:isset() does not work properlyisset() 无法正常工作
【发布时间】:2013-06-22 04:39:21
【问题描述】:

尽管在这个站点上检查了这个主题,但我无法弄清楚出了什么问题:我开发了一个 html 表单和一个 php 文件来处理这个表单 - 请参见下面的代码(事实上,大部分代码是我直接从例如http://www.phpro.org/tutorials/Basic-Login-Authentication-with-PHP-and-MySQL.html)。

问题:当我没有填写必填字段(用户名或密码)时,PHP 代码应显示“请输入有效的用户名和密码”,但似乎代码开头的 isset() 函数也即使未填写必填字段也返回 TRUE?? (例如,代码指示以下错误消息“用户名长度不正确”)

请您帮忙。提前谢谢你。

html 表单: "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> PHPRO 登录

<body>

<h2>Login Here</h2> 
<form action="login_submit1.php" method="post"> 
<fieldset> <p> <label for="username">Username</label> <input type="text" id="username"
 name="username" value="" maxlength="20" /> </p>
 <p> <label for="password">Password</label> <input type="text" id="password"    
 name="password" value="" maxlength="20" /> </p> <p> <input type="submit" value="→ Login"
 /> </p> </fieldset> </form>

</body>
</html>

...以及php文件的相关部分:

/*** begin our session ***/
session_start();

//! include lib after session_start()
include 'test_ecis_lib_pdo.php';

/*** check if the users is already logged in ***/
if(isset( $_SESSION['user_id'] ))
{
    $message = 'Users is already logged in';
}
/*** check that both the username, password have been submitted ***/    
****if(!isset( $_POST['username'], $_POST['password']))
{
    $message = 'Please enter a valid username and password';
}
/*** check the username is the correct length ***/
elseif (strlen( $_POST['username']) > 20 || strlen($_POST['username']) < 4)
{
    $message = 'Incorrect Length for Username';
}
/*** check the password is the correct length ***/
elseif (strlen( $_POST['password']) > 20 || strlen($_POST['password']) < 4)
{
    $message = 'Incorrect Length for Password';
}

【问题讨论】:

  • 在表示 isset() 无法正常工作之前,您是否尝试过手动输入?
  • 使用 var_dump($_POST); 检查您的 $_POST 变量。正如 php 文档所说的 isset(),“如果 var 存在并且值不是 NULL,则返回 TRUE,否则返回 FALSE。”

标签: php pdo


【解决方案1】:

这些字段的值可能为空字符串。使用empty 构造:if( empty( $_POST['username'] ) )。我不是空的忠实粉丝,因为它将以下条件视为“空”:未定义的数组索引(好)、空字符串(好)、空值(好)、假值(好)和数字零(don '不喜欢)。

【讨论】:

    【解决方案2】:

    如果您在测试前添加var_dump($_POST); 语句,您会注意到您的表单为$_POST['username'] 和$_POST['password'] 发送空字符串。

    您可能应该对此进行测试:

    if (empty($_POST['username']) || empty($_POST['password']))
    

    【讨论】:

    • 感谢大家的 cmets(!) - 丹尼斯的建议奏效了。经验教训:作为初学者,复制别人的代码是有好处的,除非它包含错误;-)
    • 我使用了和你一样的示例代码,遇到了同样的问题,作者遗漏了一行,示例按预期工作,只需在 login.php 页面顶部添加session_start();。
    【解决方案3】:

    所有这些验证都毫无意义。只需摆脱它们并继续进行 SQL 查询。

    与所有教程一样,您链接到的教程完全是垃圾。它必须是什么:

    <?php
    /*** begin our session ***/
    session_start();
    
    $message = '';
    
    if ($_SERVER['REQUEST_METHOD'] == 'POST')
    {
        include 'db.php';
    
        $username = $_POST['phpro_username'];
        $password = sha1( $_POST['phpro_password'] );
    
        /*** prepare the select statement ***/
        $sql = "SELECT phpro_user_id FROM phpro_users 
                    WHERE phpro_username = ? AND phpro_password = ?";
        $stmt = $dbh->prepare($sql);
    
        /*** execute the prepared statement ***/
        $stmt->execute(array($username, $password));
    
        $user_id = $stmt->fetchColumn();
        if($user_id)
        {
            /*** set the session user_id variable ***/
            $_SESSION['user_id'] = $user_id;
            header("Location: profile.php"); 
            exit;
        }
        $message = 'Incorrect login or password';
    }
    ?>
    <html>
    <head>
    <title>PHPRO Login</title>
    </head>
    <body>
    <h2>Login Here</h2>
    <p><?php echo $message; ?>
     <form action="login_submit.php" method="post">
     <fieldset>
     <p><label for="phpro_username">Username</label> 
     <input type="text" name="phpro_username" value="" maxlength="20" /> </p> 
     <p> <label for="phpro_password">Password</label> 
     <input type="text" name="phpro_password" value="" maxlength="20" /> </p> 
     <p> <input type="submit" value="→ Login" /> </p>
     </fieldset>
     </form> 
    </body>
    

    和db.php

    <?
    $mysql_hostname = 'localhost';
    $mysql_username = 'mysql_username';
    $mysql_password = 'mysql_password';
    $mysql_dbname   = 'phpro_auth';
    
    $dsn = "mysql:host=$mysql_hostname;dbname=$mysql_dbname";
    $opt = array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION); 
    $dbh = new PDO($dsn, $mysql_username, $mysql_password, $opt);
    

    【讨论】:

      【解决方案4】:

      您正在检查一个用户,看看他们是否在允许他们使用用户名和密码登录之前首先检查他们是否登录 wow。因此,如果第二个用户尝试使用相同的浏览器登录,则您忽略那里的尝试登录。还有isset( $_SESSION['user_id'] ) 表示它已设置但我可能是空的。

      一旦用户设置了一个帐户,您就不必重新检查用户/密码长度,如果您希望停止数据库查询,也许只需用户。如果您在第三次和第四次检查中检查长度,则在第二次检查中检查 issset(user/pass) 是没有意义的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-12-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-01
        • 2012-07-11
        • 2018-04-08
        • 2017-04-20
        相关资源
        最近更新 更多