2016-06-16 65 views
0

我有一個數據庫搜索字段,我希望用戶能夠輸入簡單的布爾邏輯並將其轉換爲mySQL搜索字符串。將用戶輸入的布爾搜索字符串轉換爲mySQL

因此,舉例來說,如果用戶輸入:(php AND mysql) OR ajax

我想將其轉換成:

((c.Skillset LIKE '%php%' AND c.Skillset LIKE %mysql%) OR c.Skillset LIKE '%ajax%')

是否有這樣做的一個相當簡單的方法是什麼?如果不是因爲它會非常簡單,我在爲括號提供解決方案時遇到了特別的麻煩。

+0

你期望這個工具的用戶有多惡意?我知道你不應該爲最壞的用戶設計任何東西,但如果它需要標記/解析字符串以驗證它是有效的,那麼這比一個preg_replaces更難。 – Steve

+0

嗯,我打算做htmlspecialchars它假設的搜索項目如'ajax','mysql'編碼,然後其他任何東西是由函數編寫的,它將邏輯解釋爲來自輸入,所以沒有可能注入...我認爲這樣可以,因爲根據我的理解,只要在搜索字符串中安排ands和ors以及方括號,就不會有惡意 – dlofrodloh

+0

但是'((((((PHP AND mysql)OR ajax'例如,將不是一個有效的查詢。因此,匹配偶數的括號可以增加一些複雜性。 – Steve

回答

1

以下假定您定義了一個名爲SQL_PREFIX_STRING的常量。

$string = '(php AND mysql) OR java'; 
preg_match_all('/[a-z]+/', $string, $skills); // puts the skills in an array 
$skills = $skills[0]; // shift array to get the matching values 
array_walk($skills, function (&$skill) {$skill = '%'.$skill.'%';}); // add wildcards to parameters 

$query_string = preg_replace('/[a-z]+/', 'c.Skillset LIKE ?', $string); // create the ? parameters for the SQL string 

$pdoStatement = $pdo->prepare(SQL_PREFIX_STRING.$sql); // prepare 
$pdoStatement->execute($skills); // execute 
+1

以上這些決不是「最優」的,但它提供了一定程度的安全性,它可以完成你想要的任務。另外,你可以添加一個替換語句來刪除任何單詞或字符你不允許的,比如「; DROP TABLE ...「在這段代碼之前(最好用白名單完成)。 – Steve

+0

很好,我將使用它並修改它以適應我的應用程序。非常感謝 – dlofrodloh

相關問題