2016-02-10 52 views
0

嗨我試圖確保當用戶登錄到網站,他們是一個用戶。使用MYSQL很容易,但我必須使用PDO,並且我正在努力研究如何讓它拋出錯誤消息並且不讓用戶登錄。PDO SELECT錯誤處理

我已經在下面包含了PHP select語句。

$sql = "SELECT C.cid,C.first_name,C.sirname, S.sid 
     FROM CUSTOMER as C, 
       STAFF as S 
     WHERE C.email_address='".$email_address."' 
      AND C.password='".$password."' 
      AND S.CUSTOMER_CID=C.cid"; 

$runsql = static::db(); 
$runsql->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); 
//self::get()->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
try { 
    foreach ($runsql->query($sql) as $row) { 
     /*if ($result = $runsql->prepare("SELECT C.cid,C.first_name,C.sirname, S.sid FROM CUSTOMER as C, STAFF as S WHERE C.email_address='".$email_address."' AND C.password='".$password."' AND S.CUSTOMER_CID =C.cid")) { 
     */ 
     //print_r($runsql); 
     //Check to make sure the user is on the staff list. 
     $_SESSION['customer_id'] = $row->cid; 
     $_SESSION['first_name'] = $row->first_name; 
     $_SESSION['last_name'] = $row->sirname; 
     $_SESSION['sid'] = $row->sid; 
     $_SESSION['logged_in'] = true; 
    } 
} catch(PDOException $e) { 
    /* If PDO fails we handle it here */ 
    echo "Your query failed: " . $e->getMessage(); 
} 
+1

移動到PDO並保留使用'mysql_'時所遇到的所有SQL注入問題並沒有多大意義。查看準備好的語句和參數化變量 – RiggsFolly

+2

SELECT'查詢不匹配任何行**不是錯誤**因此不會有任何異常。您只需獲得零個結果行。這應該與你使用'mysql'的方式沒有什麼不同...... – deceze

+0

在循環中設置標量變量也沒有意義,你只能看到來自你的最後一行的'$ _SESSION'變量中的值查詢結果集。 **這實際上是這裏的問題????? ** _如果您使用**所謂的更簡單的mysql **,那麼也會應用** _ – RiggsFolly

回答

1

首先,你必須明白,如果沒有找到用戶,這不是一個錯誤。它從來沒有如此舊的MySQL分機,也沒有與PDO。你必須檢查的不是一個錯誤,而是你的查詢是否返回任何東西。

爲此,您只需要撥打一個電話fetch()

$sql = "SELECT C.cid,C.first_name,C.sirname, S.sid 
     FROM CUSTOMER as C, STAFF as S 
     WHERE C.email_address=? AND C.password=? 
     AND S.CUSTOMER_CID=C.cid"; 
$stmt = static::db()->prepare($sql); 
$stmt->execute([$email_address,$password]); 
$row = $stmt->fetch(PDO::FETCH_OBJ); 

if ($row) 
{ 
     $_SESSION['customer_id'] = $row->cid; 
     $_SESSION['first_name'] = $row->first_name; 
     $_SESSION['last_name'] = $row->sirname; 
     $_SESSION['sid'] = $row->sid; 
     $_SESSION['logged_in'] = true; 
} else { 
    echo "wrong credentials"; 
} 

請注意,您必須設置ATTR_ERRMODE右後連接並不會改變它。

雖然真正的錯誤處理是一個不同的問題,它通常與PDO無關,並且必須對整個站點都是相同的。