2013-02-01 251 views
4

我有一個MySQL表看起來像這樣:PHP MySQL查詢返回NULL

index | tag | posts 
------------------------- 
    1 | cats | 9,10 
    2 | a cat | 9,10 
    3 | kitty | 9,10 
    4 | meow | 9,10 

我想剛剛返回與搜索查詢匹配的行。 我用一個簡單的?search=cats通過搜索參數。 這是我使用的PHP:

$search = $_GET['search']; 
$query = mysql_query("SELECT * FROM tags WHERE tag = '$search'"); 
echo(mysql_num_rows($query)); 
$result = mysql_fetch_array($query); 
$print = $result['posts']; 
echo($print); 

然而mysql_num_rows($query)打印0和$print返回null。我可以($print == "")檢查,其結果爲真,並mysql_num_rows($query)返回4 我試着設置了搜索查詢的東西,是不是在該表和按預期的重新調整FALSE。我也嘗試刪除WHERE tag = '$search',它返回表應該像。

有什麼我可以忽略?

編輯

帶着大家的意見,我現在使用的代碼是:

$search = mysql_real_escape_string($_GET['search']); 
var_dump($search); //prints string(4) "cats" just like it should 
$queryText = "SELECT * FROM tags WHERE tag = '%".$search."%'"; 
echo($queryText); //SELECT * FROM tags WHERE tag = '%cats%' 
$query = mysql_query($queryText) or die(mysql_error()); //no error 
$rows = mysql_num_rows($query); //this returns 0 and I know it should match 1 row 
echo('rows: '.$rows); 
$result = mysql_fetch_array($query); 
$print = $result['posts']; 
echo($print); //empty 

仍然有同樣的問題。該mysql_query被重新調整,而不是空的行或FALSE如果它不匹配。

(今後我將使用mysqli API,但我想芬蘭這個項目mysql。感謝您的建議和意見)

+1

兩兩件事:$搜索後 1.回聲= $ _GET ['search'];確實搜索詞被填充。 2.將查詢更改爲$ query = mysql_query(「SELECT * FROM tags WHERE tag ='$ search'」)或die(mysql_error()); 並告訴我們輸出是什麼。 –

+2

歡迎來到Stack Overflow! [**請不要在新代碼中使用'mysql_ *'函數**](http://bit.ly/phpmsql)。他們不再被維護[並被正式棄用](https://wiki.php.net/rfc/mysql_deprecation)。看到[**紅框**](http://j.mp/Te9zIL)?學習[*準備的語句*](http://j.mp/T9hLWi),並使用[PDO](http://php.net/pdo)或[MySQLi](http://php.net/ mysqli) - [這篇文章](http://j.mp/QEx8IB)將幫助你決定哪個。如果你選擇PDO,[這裏是一個很好的教程](http://j.mp/PoWehJ)。 – Touki

+0

確保你確切知道發送到MySQL服務器的內容。 '$ queryText =「SELECT * FROM tags WHERE tag ='$ search'」; print($ queryText);'也試着把'或者死(mysql_error);'放在'mysql_query()'的同一行。 –

回答

0

確定,所以指你做出上述修改後,這裏是解決方案

使用「喜歡」,而不是「=」使用通配符時,「%」

所以您的查詢現在應該

$queryText = "SELECT * FROM tags WHERE tag LIKE '%" . $search . "%'"; 

[我創建了完全一樣的分貝我的本地系統上跑你給相同的代碼,使得上面的修改後,它運行如預期]

+0

根據php手冊([link](http://php.net/manual/en/function.urldecode.php))$ _GET已經解碼,我不應該使用它的'urldecode()'函數。我應該使用它嗎? – thunder618

+0

請參閱上面的更新。謝謝! –

+0

那我一定在做錯事。我將切換到'mysqli'。謝謝你的幫助! – thunder618

1

現在試試這個代碼。

Remeber時要調試的東西在PHP中更快的方法是的var_dump沒有呼應。你也應該避免mysql_api,因爲他們已被棄用,使用PDO來代替PDO on PHP.net

var_dump($_GET); // Just for debuggin if as something 

$search = $_GET['search']; 
$query = mysql_query("SELECT * FROM tags WHERE tag = '".mysql_real_escape_string($search)."'"); 
// echo(mysql_num_rows($query)); 
$result = mysql_fetch_array($query); 
var_dump($result); 
//$print = $result['posts']; 
//echo($print); 
+0

我看不出如何解決問題。它增加了更多的安全性,但是..它當然不是答案。 –

+0

他應該知道$ _GET是否有第一個東西......這就是目的。 –

+0

這不是答案,你應該添加它作爲評論。沒有答案。 –

0
$search = $_GET['search']; 
echo $select_query="SELECT * FROM tags WHERE tag = '".mysql_real_escape_string($search)."'"; 
$query = mysql_query($select_query); 
echo(mysql_num_rows($query)); 
while($result = mysql_fetch_array($query)) 
{ 
    print_r($result); 
} 
0

注:

$search = $_GET['search']; 
$query = mysql_query("SELECT * FROM tags WHERE tag = '$search'"); 

這是非常dangerouse:它允許SQL incersion代碼到你的數據庫。你必須永遠逃避你從客戶那裏得到的一切。

$search = mysql_real_escape_string($_GET['search']); //It require open database connection. 

注2: 的mysql_query已經過時了,用mysqli的,而不是;-)

答:

如果你還沒有回答,您可能有一個其他部分的錯誤。 嘗試

//1) Look if your search has a correct value 
var_dump($search); 
//2) Replace the query with (just for debugging): 
$query = mysql_query("SELECT * FROM tags WHERE tag = 'cats';"); 

你也可以使用「的標籤,如‘貓%%’」如果你想要一個更靈活的搜索。

+0

謝謝。我添加了''%cats%''和'mysql_real_escape_string()'。 – thunder618

0

如果您刪除WH ERE踏歌=「$搜索」,它不能返回表像它應該,因爲你的mysql_fetch_array不是一個while循環......但是,除了...

// make sure before you execute the code to check that $_GET['search'] is not empty 

// start with escaping the search-value (for mysql-injection) 
$search = msyql_real_escape_string($_GET['search']); 

// changed the query so it searches for tags containing the search value. 
// if you would have records with tags "blue cat" and "red cat" it shows them both 
// when searching for "cat" 
$query = mysql_query("SELECT * FROM tags WHERE tag LIKE '%".$search."%'"); 

// put the number of rows in a var 
$num = mysql_num_rows($query); 

// check this var if it's not 0 
if ($num != '0'){ 
    while ($row = mysql_fetch_array($query){ 
     echo $row['posts']; 
     // etc... 
    } 
} else { 
    // 0 rows found 
    echo "nothing found"; 
} 
+0

是的,當我刪除'WHERE tage ='$ search''時,我使用'while($ result [] = mysql_fetch_array($ query))'來驗證它。感謝「%」。$ var。「%」'提示! – thunder618