2010-10-25 108 views
0
<?php 
function check($user_id, $topic_id){ 

     $query = mysql_query("SELECT user_id, topic_id FROM sa where topic_id='$topic_id' and user_id='$user_id'"); 
     if (mysql_num_rows($query)==1){ 



      return 'you have already voted'; 
     } 
     else { 

      $against = ' <li> 
    <button type="submit" value="Actions" class="against" title="against"> 
     <i></i><span>Against</span></button> 
      </li>'; 

      $support ='<li> 
      <button type="submit" value="Actions" class="support" title="support"> 
       <i></i> 
       <span>Support</span> 
      </button> 
     </li>'; 
      return compact('support', 'against'); 
     } 

extract(check($_SESSION['user_id'], $topicId)); 

    echo $against; 
    echo $support; 
?> 

我不斷收到此錯誤:使用提取php功能的問題?

Warning: extract() [function.extract]: First argument should be an array 
+0

你缺少一個支架和你確定你的函數執行第二個'return'語句? – 2010-10-25 06:31:19

+0

我在哪裏丟失括號 – getaway 2010-10-25 06:32:15

+0

'extract' ...之前,但只有當你不想寫一個遞歸函數(我假設你不這樣做))'extract'前面的括號只關閉了'else '塊。你需要另外一個來完成'check'功能。無論如何,代碼都是糟糕的設計。如果第一個'return'語句被執行,你會怎麼做?你的代碼將失敗。 – 2010-10-25 06:33:18

回答

1

也許這樣的事情是更好:

function check($user_id, $topic_id){ 
    $query = mysql_query("SELECT user_id, topic_id FROM sa where topic_id='$topic_id' and user_id='$user_id'"); 
    if (mysql_num_rows($query)==1){ 
     return array('error'=>'you have already voted'); 
    } 
    else { 
     $against = ' <li> 
<button type="submit" value="Actions" class="against" title="against"> 
    <i></i><span>Against</span></button> 
     </li>'; 

     $support ='<li> 
     <button type="submit" value="Actions" class="support" title="support"> 
      <i></i> 
      <span>Support</span> 
     </button> 
    </li>'; 
     return compact('support', 'against'); 
    } 
} 

$result = check($_SESSION['user_id'], $topicId); 

if(isset($result['error'])) { 
    echo $result['error']; 
} 
else { 
    echo $result['against']; 
    echo $result['support']; 
} 

你也可以考慮使用exceptions

+0

作品高明地謝謝你 – getaway 2010-10-25 06:46:42

0

首先,函數的定義是不是在你的代碼(沒有結束「}」)

其次,你的函數返回字符串關閉,如果用戶已經投票 - 在這種情況下,PHP顯然會在extract()函數調用中聲明「第一個參數應該是一個數組」。

一般來說,我建議不要使用緊湊型抽取結構,而是使用結構或關聯數組作爲返回值。在這種情況下,行爲會更清晰。

+0

哦,那是真的,但我怎麼解決這個問題? – getaway 2010-10-25 06:38:36

+0

我剛編輯答案。我建議使用結構或關聯數組作爲返回值。結構可能具有領域「地位」,這可能表示投票是否成功。 – Kel 2010-10-25 06:41:42

3

extract函數需要一個數組。你傳遞你的check功能,這有時是一個數組

return compact('support', 'against'); 

但有時一個字符串的結果。

return 'you have already voted'; 

所以,我想你會看到第一個返回語句執行時的錯誤。

0

所以因爲它表明:警告:提取物()[function.extract]:第一個參數應該是一個數組

嘗試以下操作:

$arr = check($_SESSION['user_id'], $topicId); 
if(is_array($arr)) { 
    extract($arr); 
    echo $against; 
    echo $support; 
} else { 
    echo $arr; 
}