2011-06-16 91 views
1

所有,PHP PDO參數化查詢MySQL的

我想寫會查一下我的users表中的用戶名或用戶的電子郵件是否已經存在的功能。這是在用戶註冊過程中用作支票。

我想能夠使用相同的功能來檢查電子郵件或名稱是否存在。我將通過發送2個字符串變量,一個$ tableColName來代替db表中的列(使用「userName」或「userEmail」,以及$ userIdentifier,它代表用戶名或用戶電子郵件。要查詢有關

我寫了下面(修改成自由站立):

<?php 
    $dbHost="localhost"; 
    $dbName="project"; 
    $dbUser="admin"; 
    $dbPassword="abcd"; 
    $dbh=new PDO("mysql:host=$dbHost;dbname=$dbName", $dbUser, $dbPassword); 
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    $userIdentifier="apple"; // Or "[email protected]", which is an email 
    $tableColName="userName"; // Or "userEmail" 
    $sth=$dbh->prepare("SELECT * FROM users WHERE :tableColName = :userIdentifier"); 
      $sth->bindParam(":tableColName", $tableColName); 
      $sth->bindParam(":userIdentifier", $userIdentifier); 
      $sth->execute(); 
    print("PDO::FETCH_ASSOC: "); 
    print("Return next row as an array indexed by column name"); 
    echo "</br>"; 
    $result = $sth->fetch(PDO::FETCH_ASSOC); 
    print_r($result); 
    echo "</br>"; 
    if ($result==null){ 
     print("FALSE - result is null"); 
    }else{ 
     print("TRUE - result isn't null"); 
    } 
?> 

這不起作用,什麼工作是我直接在查詢中指定的列名,而不是查詢使用參數,但我失去了我尋找的靈活性:

<?php 
    $dbHost="localhost"; 
    $dbName="project"; 
    $dbUser="admin"; 
    $dbPassword="abcd"; 
    $dbh=new PDO("mysql:host=$dbHost;dbname=$dbName", $dbUser, $dbPassword); 
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    $userName="apple"; 
    $sth=$dbh->prepare("SELECT * FROM users WHERE userName = :userIdentifier"); // Cannot be used for userEmail search. 
      $sth->bindParam(":userIdentifier", $userName); 
      $sth->execute(); 
    print("PDO::FETCH_ASSOC: "); 
    print("Return next row as an array indexed by column name"); 
    echo "</br>"; 
    $result = $sth->fetch(PDO::FETCH_ASSOC); 
    print_r($result); 
    echo "</br>"; 
    if ($result==null){ 
     print("FALSE - result is null"); 
    }else{ 
     print("TRUE - result isn't null"); 
    } 
?> 

我做錯了什麼?

感謝,

JDelage

回答

3

+ 1'ed我PDO的愛!

至於你的問題朋友,表名和列名不能作爲參數傳遞給PDO。 Refer to this post for more info

我相信使用良好的舊變量(過濾當然!)會爲你工作很好。

$tableName = "email"; 
$sth=$dbh->prepare("SELECT * FROM users WHERE $tableName = :userIdentifier"); 

     $sth->bindParam(":userIdentifier", $userIdentifier); 
     $sth->execute(); 

未經測試,但它應該給你一個開始。此外,千萬記得要過濾$ TABLENAME,一個(很多),簡單的方法這可以用一個簡單的數組保存允許的表名的白名單來完成,這裏是一個簡單的例子:

$validTables = array('email', 'username'); 

if(!in_array($tableName, $validTables)){ 
    throw new Exception("Invalid Table Name"); 
} 
+0

迷人,我我會立即嘗試。 – JDelage 2011-06-16 03:24:28

+0

對不起,我的格式不好我現在有重大的鍵盤問題。 ;) – stefgosselin 2011-06-16 03:27:03

+0

是的,這似乎工作,我想知道他們爲什麼允許使用一個變量,但不是參數。無論如何,我可以處理它。謝謝。 – JDelage 2011-06-16 03:27:32