2014-10-31 106 views
2

我想進行一個以LIKE value%結尾的查詢,但由於某種原因,它有一個錯誤。我該如何編寫PHP中包含LIKE的SQL查詢?

$_GET['letter']包含我想在我的查詢中使用的首字母。

例如,如果它的'a',我的查詢將是...WHERE name LIKE 'a%'

我的代碼:

$sql = sprintf("SELECT id, name, username, email FROM users WHERE name LIKE '" . ($_GET['letter']) . "%'"); 

我得到的錯誤是:PHP Warning: sprintf(): Too few arguments

然後當然是:PHP Warning: mysqli::query(): Empty query

在此先感謝。

+0

你看了說明書http://php.net/manual/en/function.sprintf.php – 2014-10-31 00:19:07

+3

直接注入$ _GET變種成一個SQL查詢 2014-10-31 00:20:00

+0

而且,因爲這似乎是用戶輸入您需要保護數據(SQL注入)。 – Paul 2014-10-31 00:20:20

回答

3

甚至不考慮採取這條路線。改用PDO或mysqli的準備好的語句。

if(isset($_GET['letter']) && strlen($_GET['letter']) > 0) { 
    $letter = $_GET['letter'] . '%'; 
    $sql = "SELECT id, name, username, email FROM users WHERE name LIKE ?"; 
    $query = $con->prepare($sql); 
    $query->bind_param('s', $letter); 
    $query->execute(); 

    $query->bind_result($id, $name, $username, $email); 
    while($query->fetch()) { 
     echo $id . '<br/>'; 
     // and others 
    } 

    // alternate version with mysqlnd installed 
    // $results = $query->get_result(); 
    // while($row = $results->fetch_assoc()) { 
    // echo $row['id']; 
    // } 
} else { 
    echo 'please provide for search value'; 
} 
+1

至少要加上'if(strlen($ _ GET ['letter'])== 1){...}'!並添加一些警告詞。 – Paul 2014-10-31 00:22:54

+0

謝謝!現在我需要更快的解決方案,但我正在計劃使用準備好的查詢。 – aarminofficial 2014-10-31 00:31:07

+0

@aarminofficial我剛剛說明它是怎麼出錯的,但是不,沒有藉口不這樣用,總是確保你有安全的查詢來執行 – Ghost 2014-10-31 00:33:23