2013-08-16 30 views
0

有沒有給出任何錯誤,但由於某些原因的代碼似乎沒有工作..與PDO PHP登錄,似乎沒有工作

下面是代碼:

<?php 

session_start(); 

require_once('inc/db.php'); 

if(isset($_SESSION['username'])) { 
    header("location: index.php"); 
} else { 
    try { 
     $username = mysql_real_escape_string($_POST['username']); 
     $password = mysql_real_escape_string($_POST['password']); 

     $SQL = $dbh->prepare('SELECT * FROM users WHERE username =:username AND password =:password'); 
     $SQL->bindParam(':username', $username); 
     $SQL->bindParam(':password', $password); 
     $SQL->execute(); 
     $total = $SQL->rowCount(); 
     $row = $SQL->fetch(); 

     if($total > 0) { 
      if($row['verified'] > 0) { 
       $_SESSION['username'] = $username; 
      } else { 
       echo "Unverified"; 
      } 
     } else { 
      echo "Incorrect"; 
     } 
    } catch(PDOException $e) { 

    } 
} 

?> 

任何人都可以幫我看看有什麼不對?謝謝很多提前:)

編輯::::

這是我db.php中

<?php 
try { 
    $DB_NAME = 'users'; 
    $DB_USER = 'root'; 
    $DB_PASS = ''; 
    $dbh = new PDO('mysql:host=localhost;dbname='.$DB_NAME, $DB_USER, $DB_PASS, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")); 
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
} catch(PDOException $e) { 
    echo "Error?"; 
} 
?> 
+1

擺脫'嘗試.. catch'東西,然後你可能會看到一些錯誤。你也不需要'mysql_real_escape_string()'當使用參數綁定 – Phil

+0

我會把調試放到catch子句中而不是刪除try-catch塊('echo $ e-> getMessage();') –

+0

@ChrisForrence否, 不,不!如果出現錯誤,則應該發生異常。爲什麼用'echo'替換掉有價值的信息?如果你不打算用異常處理異常繼續正常的程序操作,你應該讓異常繼續。 – Phil

回答

1

首先你可以安全地刪除下面的語句。參數已經被PDO轉義。你不必使用過時的方法來做到這一點。該方法也不會,如果你沒有有效的MySQL連接

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

其次腳本建議你沒有加密的密碼,並使用純文本已經存儲了他們做的工作。這可能是一個很大的安全問題,因爲任何有權訪問數據庫的人都可以看到用戶密碼。

第三,我建議你在你的catch塊中回顯$e->getMessage()看看是否有任何異常拋出。

+0

我剛剛發佈了我的db.php,我想我有一個活動的連接 – rshah

+0

你有一個活動的PDO連接,而不是一個活動的mysql連接。 – Barmar

+0

當你使用參數化語句時,不僅是不必要的,它是錯誤的 - 如果它工作,你的值將被轉義兩次。 – Barmar

2

這應該更好地爲您服務,識別錯誤,如果當他們發生

<?php 
// inc/db.php 

$dbh = new PDO('mysql:host=localhost;dbname=users;charset=utf8', 'root', ''); 
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 

和你的主文件

<?php 
// Remove these two lines when you've finished development 
ini_set('display_errors', 'On'); 
error_reporting(E_ALL); 

session_start(); 

if (isset($_SESSION['username'])) { 
    header("Location: index.php"); 
    exit; 
} 

if (!isset($_POST['username'], $_POST['password'])) { 
    throw new RuntimeException('Required POST parameters not present'); 
} 

require_once __DIR__ . '/inc/db.php'; 

$SQL = $dbh->prepare('SELECT * FROM users WHERE username = :username AND password = :password'); 
$SQL->bindParam(':username', $_POST['username']); 
$SQL->bindParam(':password', $_POST['password']); 
$SQL->execute(); 
$row = $SQL->fetch(PDO::FETCH_ASSOC); 

if ($row !== false) { 
    if ($row['verified'] > 0) { 
     $_SESSION['username'] = $username; 
     // you probably want to redirect here or something 
    } else { 
     echo 'Unverified'; 
    } 
} else { 
    echo "Incorrect"; 
} 
+1

理想情況下'error_reporting'和'display_errors'應該使用php.ini或.htaccess-like文件進行配置。這很容易讓代碼保留在原地:) –

+0

另外,爲什麼你刪除了綁定參數名稱的':'前綴? PDO將添加它們,但我不會建議依靠此行爲:) –

+0

@Jack完全同意有關錯誤報告。理想情況下,這是在環境級別配置的。我只是喜歡使用實際的參數名稱而不是':parameter_name'語法作爲語法來說更合理(對我來說)。正如你所說,無論是有效的和支持的。代碼在這裏 - https://github.com/php/php-src/blob/master/ext/pdo/pdo_stmt.c#L363 – Phil