2014-12-05 131 views
1

我开始学习PDO,同时这样做决定重写我的旧mysql_*代码。所以我有一个登录表单,根据用户级别重定向到不同的位置。这已完成(I think since I can login correctly)。接下来,当重定向我时,我有查询哪些取决于userlevel显示来自数据库的一些结果。问题是它不会返回任何内容,并且日志文件中没有错误。这是我的登录信息。我做得对吗?PDO查询与会话不会返回任何东西

session_start(); 
if(isSet($_POST['submit'])) { 
include 'misc/database.inc.php'; 
$pdo = Database::connect(); 

$username=$_POST['username']; 
$password=sha1($_POST['password']); 

    $stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username AND password = :password"); 

    $stmt->bindParam(':username', $username); 
    $stmt->bindParam(':password', $password); 

    $stmt->execute(); 

    $res = $stmt -> fetch(); 

if ($res['userlevel'] == 1) 
{ 
    // Save type and other information in Session for future use. 
     $_SESSION['username'] = $username; 
     $_SESSION['password'] = $password; 
     $_SESSION['userlevel'] = $userlevel; 

    header("location: admins/main.php"); 
} 
elseif ($res['userlevel'] >= 4) 
{ 
     $_SESSION['user_id'] = $id; 
     $_SESSION['username'] = $username; 
     $_SESSION['password'] = $password; 
     $_SESSION['userlevel'] = $userlevel; 
     $_SESSION['firstname'] = $firstname; 
     $_SESSION['lastname'] = $lastname; 
     $_SESSION['user_image'] = $user_image; 
     $_SESSION['email'] = $email;  
     header('Location: users/main.php'); 
} 
else 
{ 
    header("location: index.php"); 
} 
// Closing MySQL database connection 
$pdo = null; 
} else { 

这是我想在main.php执行时,根据用户级

<?php 
include '../misc/database.inc.php'; 
$pdo = Database::connect(); 
$q = "SELECT * FROM ras AS r 
    LEFT JOIN user_ras AS r2u ON r.userlevel = r2u.ras_userlevel 
    LEFT JOIN users AS u ON r2u.user_userlevel = u.userlevel where menu = '".$_SESSION['userlevel']."'"; 

foreach($pdo->query($q) as $res) 
{ 
    echo '<a href="users/ras.php?rest_id='. $res['ras_id'] .'">'.$res['name'].'</a>'; 

} 
Database::disconnect(); 
?> 

登录正如我所说的,我完全新的PDO所以请容忍我的查询,如果你能帮我。谢谢。

更新 - database.inc.php

<?php 
class Database 
{ 
private static $dbName = 'dbname' ; 
private static $dbHost = 'localhost' ; 
private static $dbUsername = 'user'; 
private static $dbUserPassword = 'pass'; 

private static $cont = null; 

public function __construct() { 
    die('Init function is not allowed'); 
} 

public static function connect() 
{ 
    // One connection through whole application 
    if (null == self::$cont) 
    {  
    try 
    { 
     self::$cont = new PDO("mysql:host=".self::$dbHost.";"."dbname=".self::$dbName, self::$dbUsername, self::$dbUserPassword); 
    } 
    catch(PDOException $e) 
    { 
     die($e->getMessage()); 
    } 
    } 
    return self::$cont; 
} 

public static function disconnect() 
{ 
    self::$cont = null; 
} 
} 
?> 
+0

'在session_start();'必须使用会话的所有文件里面。 – 2014-12-05 19:11:01

+0

是的,我已经把它放在main.php里面了。实际上,当我登录某些用户时,我可以看到他的用户名'<?php echo $ _SESSION ['username']; ?>所以会议是工作。但查询不。 – 2014-12-05 19:13:12

+0

'r2u.user_userlevel'你确定你不是指'r2u.userlevel'?很难说,连接不是我擅长的。在连接打开后立即添加'$ pdo-> setAttribute(PDO :: ATTR_ERRMODE,PDO :: ERRMODE_EXCEPTION);'。 – 2014-12-05 19:16:47

回答

3

其中是您定义的变量定义为会话$id, $userlevel, $firstname, $lastname, $user_image, $email? 他们是不确定的,在这一点上:

$_SESSION['user_id'] = $id; 
    $_SESSION['userlevel'] = $userlevel; 
    $_SESSION['firstname'] = $firstname; 
    $_SESSION['lastname'] = $lastname; 
    $_SESSION['user_image']= $user_image; 
    $_SESSION['email']  = $email; 

我想你需要的是这个

session_start(); 
if(isSet($_POST['submit'])) { 
include 'misc/database.inc.php'; 
$pdo = Database::connect(); 

$username=$_POST['username']; 
$password=sha1($_POST['password']); 

    $stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username AND password = :password"); 

    $stmt->bindParam(':username', $username); 
    $stmt->bindParam(':password', $password); 

    $stmt->execute(); 

    $res = $stmt -> fetch(); 

if ($res['userlevel'] == 1) 
{ 
    // Save type and other information in Session for future use. 
     $_SESSION['username'] = $username; 
     $_SESSION['password'] = $password; 
     $_SESSION['userlevel'] = $res['userlevel']; 

    header("location: admins/main.php"); 
} 
elseif ($res['userlevel'] >= 4) 
{ 
     $_SESSION['user_id'] = $res['id']; 
     $_SESSION['username'] = $username; 
     $_SESSION['password'] = $password; 
     $_SESSION['userlevel'] = $res['userlevel']; 
     $_SESSION['firstname'] = $res['firstname']; 
     $_SESSION['lastname'] = $res['lastname']; 
     $_SESSION['user_image']= $res['user_image']; 
     $_SESSION['email']  = $res['email']; 
     header('Location: users/main.php'); 
} 
else 
{ 
    header("location: index.php"); 
} 
} 
+0

我得到这样的错误 - >'PHP致命错误:调用一个非对象的成员函数bindParam()' – 2014-12-05 19:40:04

+0

我更新了完整的块..它.. ..应该完美地工作 – sking 2014-12-05 19:49:22

+0

是的,这工作完美。谢谢! – 2014-12-05 19:51:45

1

你能呼应$res内容? 如:

echo "<pre>"; 
print_r($res); 
echo "<pre>"; 

,看看结果是什么,也许你的阵列不知道的$res['userlevel']的价值,你的阵列也可能被$res[0]['userlevel']或类似的东西访问。

让我知道它是否工作

+0

print_r($ res)什么都不返回。只需在页面上留空即可。 – 2014-12-05 19:23:06

+0

然后你的$ res数组是空的,这就是为什么它不起作用。密码是否以sha1的形式存储在数据库中? – 2014-12-05 19:25:51

+0

是的,它是'sha1' – 2014-12-05 19:28:49

1

你应该检查一下,看看你是否有结果集。

if ($res) { 

    foreach($pdo->query($q) as $res) 
    { 
     echo '<a href="users/ras.php?rest_id='. $res['ras_id'] .'">'.$res['name'].'</a>'; 

    } 
    } else { 
    echo '<p>no result</p>'; 
    } 
+0

是的,没有结果... – 2014-12-05 19:30:29