【发布时间】:2014-12-05 19:10:07
【问题描述】:
我开始学习 PDO 并决定重写我的旧 mysql_* 代码。所以我有一个登录表单,它根据用户级别重定向到不同的位置。完成(I think since I can login correctly)。接下来当重定向我时,我有查询,这取决于用户级别显示来自数据库的一些结果。问题是它不返回任何内容,并且日志文件中没有错误。这是我的登录。我做得对吗?
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;
}
}
?>
【问题讨论】:
-
session_start();需要在所有使用会话的文件中。 -
是的,我在 main.php 中有它。事实上,当我登录某个用户时,我可以看到他的用户名
<?php echo $_SESSION['username']; ?>,所以会话正常。但查询没有。 -
r2u.user_userlevel你确定不是r2u.userlevel?很难说,加入不是我擅长的事情。在打开连接后立即添加$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);。 -
您的查询失败了。在 fetch() php.net/manual/en/pdostatement.fetch.php 上查看您可以从手册中提取的内容 - 另外,建议在每个标题后添加
exit;。 -
不客气,Jason,很高兴看到您找到了解决方案,干杯