0

我正在尝试做一个简单的登录脚本。也就是说,通过 POST 操作接受表单内容。检查数据库中的匹配记录。从该行中提取其他信息,例如Full Name.

我的代码是;

if ( !isset($_POST['loginsubmit']) ) {
    //Show login form
    ?>

    <form action="<?php echo htmlentities($_SERVER['PHP_SELF']); ?>" method="post">
        <p>
            Account ID:
            <input name="AccountID" type="text" />
        </p>
        <p>
            Username:
            <input name="userEmail" type="text" />
        </p>
        <p>Password:
            <input name="userPassword" type="password" />
        <p>
            <input name="loginsubmit" type="submit" value="Submit" />
        </p>
    </form>
    <?php
}
else {
    //Form has been submitted, check for logon details
    $sql = "SELECT * FROM users WHERE 'accountID'=". $_POST['AccountID']. " AND     'userEmail'=". $_POST['userEmail'] . " AND 'userPassword'=". $_POST['userPassword']. "     LIMIT 1";
    $result = mysql_query($sql);
    $count = mysql_num_rows($result);
    if ($count == 1){
        echo"Correct Username/Password";
    }
    else {
        echo "Wrong Username or Password";
    }
}

我有两个问题。首先使用上面的代码,我不断收到以下错误。

警告:mysql_num_rows() 期望参数 1 是资源,布尔值在 ...

其次,如何从数据库中获取其他详细信息字段。我相信

$result=mysql_query($sql);

包含 MySQL 行的数组,所以我可以做类似的事情;

echo $result['fullName'];
4

4 回答 4

2

首先清理字段以防止 SQL 注入。

$sanitize_fields = array('AccountID','userEmail','userPassword'); 
foreach( $sanitize_fields as $k => $v ) 
{
    if( isset( $_POST[ $v ] ) ) 
        $_POST[ $v ] = mysql_real_escape_string( $_POST[ $v ] ); 
}

然后引用查询中的字符串字段。最初,您的查询中有错误。这就是为什么你得到一个布尔值 false 的原因。

$sql = "SELECT * FROM users WHERE accountID='". $_POST['AccountID']. "' AND userEmail='". $_POST['userEmail'] . "' AND userPassword='". $_POST['userPassword']. "' LIMIT 1";

我建议您在运行查询后执行以下操作,以查看 MySQL 生成的错误,如果有的话。

$result = mysql_query($sql) or die('Query failed: ' . mysql_error());

MySQL 扩展正在逐步淘汰,并且有更新更好的扩展,例如 MySQLi 和 PDO,看看这些。

于 2012-05-14T16:13:55.137 回答
0

这里的问题是您的查询无法选择任何行,因此从调用FALSE中返回了一个布尔值。mysql_query

您应该修复您的查询并始终检查$result = mysql_query($query);返回是否为假,如下所示:

// ...
$result = mysql_query($query);
if($result !== false) {
    $count = mysql_num_rows($result);
    // ...
}

但我建议使用 PDO 或至少 mysqli http://php.net/mysqli

于 2012-05-14T16:16:42.827 回答
0

在您的 SQL 语句中:

$sql = "SELECT * FROM users WHERE 'accountID'=". $_POST['AccountID']. " AND 'userEmail'=". $_POST['userEmail'] . " AND 'userPassword'=". $_POST['userPassword']. " LIMIT 1";

如果在表格中,userEmail 和 userPassword 是字符串,请添加单个 qoutes:

$sql = "SELECT * FROM users WHERE accountID=". $_POST['AccountID']. " AND userEmail='". $_POST['userEmail'] . "' AND userPassword='". $_POST['userPassword']. "' LIMIT 1";

要获得结果:

$result = mysql_query($sql);

while ($row = mysql_fetch_array($result))
{
    if(mysql_num_rows($result) > 0)
        echo $row['COLUMN_NAME'];
    }
}

您的代码非常不安全:

  • 请使用MySQLiPDO与数据库交互
  • 在发送到数据库之前转义所有输入数据
于 2012-05-14T16:08:48.273 回答
0

尝试这个:

    else {
        //Form has been submitted, check for logon details
        $conn = mysql_connect("db-host-here","db-user-here","db-pass-here");

        $sql = "SELECT * FROM users WHERE accountID=". mysql_real_escape_string($_POST['AccountID']). " AND userEmail='". $_POST['userEmail']=mysql_real_escape_string($_POST['userEmail']); . "' AND userPassword='".  $_POST['userPassword']=mysql_real_escape_string($_POST['userPassword']);. "' LIMIT 1";
        $result = mysql_query($sql,$conn);
        $count = mysql_num_rows($result);
        if($count == 1){
            echo"Correct Username/Password";
        }
        else {
            echo "Wrong Username or Password";
        }
    }
    // Get other information:

    $dbInfo = mysql_fetch_assoc(); //If more than one row can be selected, use a while loop.

    //Now play with $dbInfo:

    echo $dbInfo['some_other_column'];

您的查询中有单引号,而您不需要它们,而您在需要的地方却错过了它们。试试上面的代码。

db-host-here,db-user-here和替换db-password-here为正确的数据库信息。

我在你的代码中做了一些转义,以防止注入攻击。但是你真的应该考虑使用准备好的语句。

于 2012-05-14T16:10:19.893 回答