【问题标题】:PDO query with session doesn't return anything带有会话的 PDO 查询不返回任何内容
【发布时间】: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 中有它。事实上,当我登录某个用户时,我可以看到他的用户名&lt;?php echo $_SESSION['username']; ?&gt;,所以会话正常。但查询没有。
  • r2u.user_userlevel 你确定不是r2u.userlevel?很难说,加入不是我擅长的事情。在打开连接后立即添加$pdo-&gt;setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);。
  • 您的查询失败了。在 fetch() php.net/manual/en/pdostatement.fetch.php 上查看您可以从手册中提取的内容 - 另外,建议在每个标题后添加 exit;。
  • 不客气,Jason,很高兴看到您找到了解决方案,干杯

标签: php mysql pdo


【解决方案1】:

您要分配给会话 $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");
}
}

【讨论】:

  • 我收到这样的错误 -> PHP Fatal error: Call to a member function bindParam() on a non-object
  • 我更新了整个区块..试试吧..应该可以完美运行
【解决方案2】:

你能回显$res的内容吗? 如:

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

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

让我知道它是否有效

【讨论】:

  • print_r($res) 什么也不返回。只是页面上的空白。
  • 那么你的 $res 数组是空的,这就是它不起作用的原因。密码是否以sha1形式存储在数据库中?
  • 您的 select 语句没有返回任何内容,您可以进行测试以将 sha1($_POST['password']) 与存储在数据库中的进行比较,我猜这就是select 语句没有返回匹配的用户名和密码
  • 但是我已经登录成功了。如果密码错误我无法登录?
【解决方案3】:

您应该检查是否有结果集。

    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>';
   }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-24
    • 2012-10-16
    • 2013-12-29
    • 1970-01-01
    • 2012-04-14
    相关资源
    最近更新 更多