2010-07-09 80 views
1

Possible Duplicate:
Warning: mysql_fetch_* expects parameter 1 to be resource, boolean given errorphp查詢未運行?

$query="select * from fsb_profile where fsb_profile.profile_id=('select fsb_friendlist.friendlist_friendid from fsb_friendlist where friendlist_memberid='".$id."'')"; 
$sql=mysql_query($query); 

while ($t = mysql_fetch_assoc($sql)) 
{ 
    echo "hai"; 
    echo $t["profile_name"]; 
} 

這個代碼不運行,爲什麼?
錯誤: -

Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in D:\Project\fsbaroda\profile.php on line 186

+0

改變查詢呼叫線'$ SQL =的mysql_query($查詢)或死亡( 「MySQL錯誤:」 mysql_error());'。永遠不要假設你的SQL是正確的。這個構造會給你確切的細節,爲什麼查詢失敗。 – 2010-07-09 16:38:11

回答

0

我會想你有一個查詢語法錯誤。

2

你缺少IN條款在那裏,我想,也沒有必要在子查詢單引號:

$query="select * from fsb_profile where fsb_profile.profile_id IN 
(select fsb_friendlist.friendlist_friendid from fsb_friendlist 
where friendlist_memberid='".$id."')"; 

或者試試這個連:

$query="select * from fsb_profile where fsb_profile.profile_id = 
(select fsb_friendlist.friendlist_friendid from fsb_friendlist 
where friendlist_memberid='".$id."')"; 

還要確保查詢運行成功追加mysql_error()

$sql=mysql_query($query) or die(mysql_error()); 
+1

'='是有效的,問題是額外的單引號。 – 2010-07-09 07:22:40

+0

@馬克:是的,我已經刪除了我的答案。 – Sarfraz 2010-07-09 07:23:36

+0

沒有解決同樣的問題 $查詢= 「SELECT * FROM fsb_profile其中fsb_profile.profile_id IN ( '從fsb_friendlist 選擇fsb_friendlist.friendlist_friendid其中friendlist_memberid ='」 的$ id 「 ''。)」; \t \t \t $ sql = mysql_query($ query); \t \t \t \t \t \t而($行= mysql_fetch_assoc($ SQL)){ 回聲$行[ 「profile_mailid」]; – mriganka3 2010-07-09 07:27:14

0

您的查詢是thro翼錯誤並返回false而不是返回有效的結果資源。

你的查詢失敗的原因是因爲你有一個額外的單引號'環繞你的子查詢,這些都是不需要的。

$query="select * from fsb_profile 
     where fsb_profile.profile_id= (
      select fsb_friendlist.friendlist_friendid from fsb_friendlist 
      where friendlist_memberid='".$id."')"; 
+0

$查詢=「SELECT * FROM fsb_profile 其中fsb_profile.profile_id =( 選擇fsb_friendlist .friendlist_friendid from fsb_friendlist where friendlist_memberid ='「。$ id。」')「; \t echo $ query; \t $ SQL =的mysql_query($查詢); \t如果($ SQL) { \t \t而($ T = mysql_fetch_assoc($ SQL)) \t \t { \t \t回聲 「海」; \t \t回波$噸[ 「PROFILE_NAME」]; \t \t} } else { echo mysql_error(); } error:-select * from fsb_profile where fsb_profile.profile_id =(從fsb_friendlist中選擇fsb_friendlist.friendlist_friendid where friendlist_memberid = '16')子查詢返回多於一行 – mriganka3 2010-07-09 07:34:20

+0

@ mriganka3:好吧,現在您的查詢運行了,看起來像您有一個新的問題,改變'fsb_profile.profile_id =('行'至IN fsb_profile.profile_id(' – 2010-07-09 07:44:04

0

您要麼有MySQL語法錯誤,要麼該查詢返回0個結果。 $sql在這種情況下是NULL(或false)。嘗試在phpMyAdmin之類的東西中調試你的查詢。

0

首先總是從mysql_query測試結果。運行這個,讓我知道

$query="select * from fsb_profile where fsb_profile.profile_id=('select fsb_friendlist.friendlist_friendid from fsb_friendlist where friendlist_memberid='".$id."'')"; 
echo $query; 

$sql=mysql_query($query); 
if ($sql) 
    { 
while ($t = mysql_fetch_assoc($sql)) 
{ 
    echo "hai"; 
    echo $t["profile_name"]; 
} 
    } else 
    { 
    echo mysql_error(); 
    } 
+0

SELECT * FROM fsb_profile其中fsb_profile.profile_id =( '選擇fsb_friendlist其中friendlist_memberid = '16 fsb_friendlist.friendlist_friendid'')你有在您的SQL語法錯誤;檢查對應於您的MySQL服務器版本的手冊,以在第1行使用接近'16'')'的正確語法 – mriganka3 2010-07-09 07:31:01

1

mysql_query只有當查詢成功返回一個可用的資源。如果查詢失敗,則返回FALSE。在傳遞給mysql_fetch_assoc之前,您需要檢查mysql_query返回的值。

在這種特殊情況下,您的SQL查詢包含不需要的引號。它應該是:

$query = "select * from fsb_profile " . 
    "where fsb_profile.profile_id=(" . 
    "select fsb_friendlist.friendlist_friendid " . 
    "from fsb_friendlist " . 
    "where friendlist_memberid=" . $id . 
    " LIMIT 1)"; 

沒有必要周邊的第二個SELECT聲明的報價,如果friendlist_memberid是數字,你不需要圍繞$id報價無論是。

更新你內心SELECT查詢返回多行,所以你需要在你的WHERE子句中使用IN,而不是=,或者,如下所示,使用LIMIT,以確保返回只有一行。因此

您的代碼應該看起來更像是這樣的:

$query = "select * from fsb_profile " . 
    "where fsb_profile.profile_id=(" . 
    "select fsb_friendlist.friendlist_friendid " . 
    "from fsb_friendlist " . 
    "where friendlist_memberid=" . $id . 
    " LIMIT 1)"; 

if($sql = mysql_query($query)) { 
    while ($t = mysql_fetch_assoc($sql)) { 
     echo "hai"; 
     echo $t["profile_name"]; 
    } 
} else { 
    echo "Something went horribly wrong:\n" . 
     mysql_error(); 
} 

別的東西值得一提的:你應該考慮使用prepared statements,而不是動態SQL命令。這通常是一個更安全的選擇,比所有你不得不做的討厭的逃跑都要簡單。有很多教程。這裏有一對夫婦爲你開始:Prepared Statements in PHP and MySQLiDeveloping MySQL Database Applications With PHP

+0

我使用了ur代碼錯誤: - 有一些可怕的錯誤 – mriganka3 2010-07-09 07:37:41

+0

@ mriganka3 :這意味着我的代碼是錯的(這是完全可能的),或者一些你的查詢有問題。我已經更新了我的答案,以包含來自'mysql_error()'的輸出。更新您的代碼以包含該內容,併發布結果。您是否嘗試過直接使用命令行界面或phpMyAdmin(用有效的ID替換'$ id')來運行SQL查詢? – Mike 2010-07-09 07:45:18

+0

@ mriganka3:我剛剛注意到您在Mark的回答中發佈的錯誤消息。你的內部'SELECT'返回多於一行,所以你不能在'WHERE'子句中使用'='運算符。正如Mark所建議的,你需要將'='改成'IN'。或者,在內部的'SELECT'上使用'LIMIT'。看到我更新的答案。 – Mike 2010-07-09 07:49:40