2012-05-31 53 views
0

以下是我的「登錄檢查」 它工作正常,如果我使用舊的傳統MySQL連接..但與PDO它似乎沒有工作..介意如果有人給我一些提示或修改這個代碼,以便它會工作?登錄驗證檢查器PHP的MYSQL

它給我這個錯誤:

Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in C:\xampp\htdocs\clubresults\checklogin.php on line 23 

,其中第23行是$數= mysql_num_rows($結果); 謝謝!

<?php 
ob_start(); 
$tbl_name="admin_passwords"; // Table name 

     $pdo = new PDO('mysql:host=localhost;dbname=clubresults', 'root', '12345678'); 
    #Set Error Mode to ERRMODE_EXCEPTION. 
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

// username and password sent from form 
$myusername=$_POST['myusername']; 
$mypassword=$_POST['mypassword']; 

// To protect MySQL injection (more detail about MySQL injection) 
$myusername = stripslashes($myusername); 
$mypassword = stripslashes($mypassword); 
$myusername = mysql_real_escape_string($myusername); 
$mypassword = mysql_real_escape_string($mypassword); 

$sql="SELECT * FROM $tbl_name WHERE username='$myusername' and password='$mypassword'"; 
$result=mysql_query($sql); 

// Mysql_num_row is counting table row 
$count=mysql_num_rows($result); 
// If result matched $myusername and $mypassword, table row must be 1 row 

if($count==1){ 
// Register $myusername, $mypassword and redirect to file "login_success.php" 
$_SESSION["myusername"] = "$myusername"; 
$_SESSION["mypassword"] = "$mypassword"; 
header("location:login_success.php"); 
} 
else { 

echo "ACCESS DENIED.<br> Incorrect username and/or Password 
<br>Please check your username and password. <br> wait five seconds for redirection. "; 
} 
ob_flush(); 
?> 

回答

2

它看起來並不像你充分利用了PDO和使用參數statments。

如果是我,我會寫你的代碼如下:

$tbl_name="admin_passwords"; // Table name 

$pdo = new PDO('mysql:host=localhost;dbname=clubresults', 'root', '12345678'); 
#Set Error Mode to ERRMODE_EXCEPTION. 
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

$stmt = $pdo->prepare("SELECT * FROM $tbl_name WHERE username = :username AND password = :password"); 
$stmt->execute(array('username' => $_POST['myusername'], 'password' => $_POST['mypassword'])); 
if ($stmt->fetch() === false) { 
    //access deined 
    //.... 
} 
else { 
    //access granted 
    //... 
} 

此外,爲了安全起見,你應該與SHA1在至少散列你的密碼(我做SHA512)在你的數據庫中,以便即使您的數據被盜,密碼也無法在沒有多少努力的情況下進行反向設計。

編輯:再次看,它可能也很好使用非超級用戶訪問數據庫,但這是更個人的喜好。

+0

非常感謝你是一個傳奇! – Tuzki

0

嘗試從該行打印結果:

$result=mysql_query($sql); 

它看起來像的mysql_query可能會失敗,因爲它沒有被通過的link_identifier。