如何从PHP 5.5中的数据库中的记录中检索信息?

时间:2014-11-18 21:44:17

标签: php mysql

我对新的PHP 5.5感到困惑,对于给您带来的任何不便,我深表歉意。

我正在尝试从任何登录信息中获取信息,例如,如果我使用电子邮件登录,我希望该网站获取我的名字并执行“欢迎,真嗣!”。

    $conn = mysqli_connect('localhost','root','');
    $db = mysqli_select_db($conn , 'session_start');

    $user = $_POST['user'];
    $pass = $_POST['pass'];

    $query = mysqli_query($conn , "SELECT * FROM `info_table` WHERE '$user' = `user` AND '$pass'=`password`") or die(mysqli_error($conn));
    $rows = mysqli_num_rows($query);

    if($rows == 1){

        #$query2 = mysqli_query($conn , "INSERT INTO `who_logged` (`name`) VALUES ('$user')") or die(mysqli_error($conn));
        #$rows = mysqli_num_rows($query);

        session_start();

         $_SESSION['username'] = $_POST['user']; // store username
         $_SESSION['password'] = $_POST['pass']; // store password

        $query2 = mysqli_query($conn ,"SELECT `name` FROM `info_table` WHERE '$user' = `user`") or die(mysqli_error($conn));
        $result = mysqli_num_rows($query2);

        while ($row = mysql_fetch_assoc($result)) {
        $_SESSION['name'] = $row['name'];//I thought to try setting the name to the Session variable, but does not work
    }

        header('Location: next_page.php');
        exit();

    }else{
        echo "Wrong username or password.";
    }

我尝试将名称设置为会话变量,但如果有更有效的方法请说出来! (此当前代码有效,但会话名称设置除外。

1 个答案:

答案 0 :(得分:4)

您的列和值按顺序混合。

首先是列,然后是值,而不是相反。

更改两者:

WHERE '$user' = `user` AND '$pass'=`password`

为:

WHERE `user` = '$user' AND `password`='$pass'

另外,你正在混合使用MySQL API。那些不同的API不会相互混合。

mysql_fetch_assoc更改为mysqli_fetch_assoc

我注意到你正在使用会话;确保session_start();确实已加载。

将错误报告添加到文件的顶部,这有助于查找错误。

<?php 
error_reporting(E_ALL);
ini_set('display_errors', 1);

// rest of your code

旁注:错误报告应仅在暂存时完成,而不是生产。

另外,将or die(mysqli_error($conn))添加到mysqli_query()


您现有的代码向SQL injection开放 使用prepared statementsPDO with prepared statements它们更安全


修改

请尝试以下方法,它将帮助您入门。请阅读关于纯文本密码的使用/存储的脚注

旁注:我删除了$_SESSION['password'] = $pass; // store password
不要这样做,这是不安全的。

另外,请不要在下面的PHP上面放置任何内容,例如HTML等,否则,您将收到有关已发送标头的警告。

<?php 
$conn = mysqli_connect('localhost','root','');
$db = mysqli_select_db($conn, 'session_start');

$user = stripslashes($_POST['user']);
$user = mysqli_real_escape_string($conn,$_POST['user']);

$pass = stripslashes($_POST['pass']);
$pass = mysqli_real_escape_string($conn,$_POST['pass']);

$query = mysqli_query($conn , "SELECT * FROM `info_table` 

    WHERE `user` = '$user' AND `password`='$pass'") 

        or die(mysqli_error($conn));

$num_rows = mysqli_num_rows($query);

    if($num_rows > 0){

    session_start();

    // it's not really needed
    // we are pulling it from $row['user'] in the while loop
    // and setting it to $_SESSION['username']
    // $_SESSION['username'] = $user; // store username

    while ($row = mysqli_fetch_assoc($result)) {
    $_SESSION['username'] = $row['user'];
    }

    // for testing only. Do not use with header
    //  echo $_SESSION['username'];

    header('Location: next_page.php');
    exit();
}

// do not place any echos here, only the else statement

else{
    echo "Wrong username or password.";
}

<强> next_page.php

<?php 
session_start();

if(isset($_SESSION['username'])){

    echo $_SESSION['username'];
}

else{

    echo "Not logged in.";

}

<强>脚注

强烈建议您不要以纯文本格式存储密码。

访问以下网站:

它包含完整的注册/登录/验证系统,以及使用PDO with prepared statements和PHP password_hash()功能,强烈建议使用。

  • 由于您使用的是PHP 5.5,因此您将受益于这些功能。