我有一個用戶表,我希望能夠通過電子郵件列過濾表,因此我可以看到所有用戶使用'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並且還aynber,這裏的工作解決方案:
$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
)
它可能會停止這樣做,如果你使用參數綁定傳遞的值,**這也會阻止你有SQL注入漏洞。**不熟悉FluentPDO我不能告訴你怎麼做,但是這個代碼應該永遠不會達到生產。 – deceze
@HankyPanky只要你一致,MySQL並不關心單引號和雙引號。其他數據庫顯然。但是,參數綁定會正確引用它。 – aynber
@aynber如果您使用的是數據庫原生參數綁定,則根本不會引用它,因爲它永遠不會插入查詢字符串中,而會作爲單獨的值發送。 – deceze