2012-01-31 81 views
2

我有一個搜索表單,希望用戶搜索多個術語。我目前正在使用PHP PDO,而且我仍然在學習......我想知道如果有人能告訴我我在這裏做錯了什麼。多個術語SQL與爆炸/內爆和PHP PDO

$varSearch = @$_GET['dms']; 
    $varTerm = explode(" ", $varSearch); 
    $termArray = array(); 
    foreach($varTerm as $term){ 
     $term = trim($term); 
     if(!empty($term)){ 
      $termArray[] = "name LIKE '%".$term."%' OR tags LIKE '%".$term."%'"; 
     } 
    } 
    $implode = implode(' OR ', $termArray); 
    $sql = $dbh->prepare("SELECT * FROM table WHERE ?"); 
    $sql->execute(array($implode)); 
+0

可能重複的HTTP :/ /stackoverflow.com/questions/583336/how-do-i-create-a-pdo-parameterized-query-with-a-like-statement-in-php) – Brad 2012-01-31 04:36:47

+0

謝謝,我回答了我自己的問題,並張貼它可以防止其他人需要它 – hellomello 2012-01-31 04:58:48

回答

1

如果任何人需要這個答案太...

$varSearch = @$_GET['dms']; 
$varTerm = explode(" ", $varSearch); 
$termArray = array(); 
foreach($varTerm as $term){ 
    $term = trim($term); 
    if(!empty($term)){ 
     $termArray[] = "name LIKE :term OR tags LIKE :term"; 
    } 
} 
$implode = implode(' OR ', $termArray); 
$sql = $dbh->prepare("SELECT * FROM table WHERE ".$implode.""); 
$sql->execute(array(":term"=>"%".$term."%")); 
+0

您只能搜索一個字詞的數據庫。 – Brad 2012-01-31 05:02:00

+0

我不是在數組中執行它?我不明白。爲什麼我得到一個否定的... – hellomello 2012-01-31 05:12:12

+1

不,你正在準備一個非常長的聲明,你重新使用完全相同的參數名稱,然後綁定一個參數。你會因爲你的回答錯誤而退縮。 – Brad 2012-01-31 05:19:43

2

你有沒有考慮做這樣的事情,而不是:

$varSearch = @$_GET['dms']; 
$varTerm = explode(" ", $varSearch); 
$termsStringArray = array(); 
$termsArray = array(); 
foreach($varTerm as $term){ 
    $term = trim($term); 
    if(!empty($term)) { 
     array_push($termsStringArray, "name LIKE ? OR tags LIKE ? "); 
     array_push($termsArray, $term); 
     array_push($termsArray, $term); // note, you can do this part differently, if you'd like 
    } 
} 
$implodedTermsString = implode('OR ', $termsStringArray); 
$sql = $dbh->prepare("SELECT * FROM biz WHERE " . $implodedTermsString); 
$sql->execute(array($termsArray)); 

輸出:

// prepare statement 
SELECT * FROM biz WHERE name LIKE ? OR tags LIKE ? OR name LIKE ? OR tags LIKE ? OR name LIKE ? OR tags LIKE ? OR name LIKE ? OR tags LIKE ? 

// $termsArray (for execute) 
Array 
(
    [0] => this 
    [1] => this 
    [2] => is 
    [3] => is 
    [4] => the 
    [5] => the 
    [6] => string 
    [7] => string 
) 

基本上,試圖分開來自初始SQL查詢prepare字符串的數組數據。讓我知道這是否適合你!

儘管如此,您仍然希望對從$_GET變量獲得的數據進行某種檢查(或清理)。 $_GET變量可能包含任何內容......並且可能對SQL injections或其他有害問題不好。

並且,LIKE不一定會成爲執行此類數據庫搜索的最有效方式。但是,如果您使用它(並且我已經將它用於過去的搜索),請嘗試檢出:http://use-the-index-luke.com/sql/where-clause/searching-for-ranges/like-performance-tuning

+0

我認爲'prepare'對SQL注入不敏感嗎? – hellomello 2012-01-31 05:14:17

+0

我在編寫評論時必須更新這些內容...... :)在數據進入與數據庫配合使用之前,通常需要對數據進行清理。 (http://diovo.com/2008/09/sanitizing-user-data-how-and-where-to-do-it/) – summea 2012-01-31 05:15:37

+0

謝謝,也..不是我的答案低於相同?把它放入數組中? – hellomello 2012-01-31 05:22:21

1

翻拍

$my_explode = explode(" ",$search); 
$query = array(); 
foreach($my_explode as $string) 
{ 
$query[] ="name LIKE '%".$string."%' OR email LIKE '%".$string."%'"; 
} 
$implode = implode(' OR ', $query); 
foreach ($db->query("SELECT * FROM _table WHERE ".$implode."") as $info) 
{ 
    echo $info['name']."<br />"; 
} 

安全注射,用PHP只檢索字母數字字符

$search = preg_replace("/[^a-zA-Z0-9]+/", "-", $_GET["text"]); 
的[我如何創建一個PHP LIKE語句PDO參數化查詢?](