2016-02-19 26 views
0

我有一個用戶表,我希望能夠通過電子郵件列過濾表,因此我可以看到所有用戶使用'gmail.com'帳戶,因爲例。如何停止FluentPDO錯誤地推斷表名稱

我現在fpdo查詢看起來是這樣的:

$filter_email = trim($_GET['email']); 
$fpdo->from('users') 
    ->where('users.email LIKE "%' . $filter_email . '%"') 
    ->fetchAll(); 

當我設置$filter_email一個@ b,一切工作正常,並FluentPDO生成此SQL語句:

SELECT users.* FROM users 
WHERE users.email LIKE "%[email protected]%" 

但如果我搜索a @ bc FluentPDO試圖找到表b和錯誤

SELECT users.* FROM users 
LEFT JOIN b ON b.id = users.b_id 
WHERE users.email LIKE "%[email protected]%" 

我不知道FluentPDO如何看待b.c作爲表加入或如何阻止它。

SOLUTION

由於大多是deceze並且還aynb​​er,這裏的工作解決方案:

$filter_email = '%'.trim($_GET['email']).'%'; 
$fpdo->from('users') 
    ->where('users.email LIKE ?',$filter_email) 
    ->fetchAll(); 

我的實際查詢檢查三個不同的電子郵件字段,但使用三個?和附加$filter_email三次工作得很好:

->where(
    '(users.email1 LIKE ? OR users.email2 LIKE ? OR users.email1 LIKE ?)', 
    $filter_email, 
    $filter_email, 
    $filter_email 
) 
+1

它可能會停止這樣做,如果你使用參數綁定傳遞的值,**這也會阻止你有SQL注入漏洞。**不熟悉FluentPDO我不能告訴你怎麼做,但是這個代碼應該永遠不會達到生產。 – deceze

+0

@HankyPanky只要你一致,MySQL並不關心單引號和雙引號。其他數據庫顯然。但是,參數綁定會正確引用它。 – aynber

+0

@aynber如果您使用的是數據庫原生參數綁定,則根本不會引用它,因爲它永遠不會插入查詢字符串中,而會作爲單獨的值發送。 – deceze

回答

1

它的(顯然是n所以)「智能聯接生成器」可能會看到.,並認爲它與另一個表相關。您可能想要向作者提交錯誤。

但是,您很容易受到SQL注入的影響將輸入直接連接到查詢中。解決這個問題也可能解決你的連接問題。很快找過documentation,參數綁定語法看起來應該是這樣的:

$fpdo->from('users') 
    ->where('users.email LIKE ?', '%' . trim($_GET['email']) . '%') 
    ->fetchAll(); 
+0

正確的方法是' - > where(「users.email LIKE CONCAT('%',?,'%')」)',同樣的方法也可以用於普通的'PDO'。永遠不會出現任何問題。 – Mjh

+0

謝謝。我一直在研究其他一些過濾器查詢,並且意識到我可以使用'?'標記。然後SQL注入令我擔憂。 –

+0

@Mjh爲什麼SQL中的concat優於PHP中的concat? – deceze