使用提取php功能的问题?

时间:2010-10-25 06:27:01

标签: php function extract

 <?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;
?>

我一直收到这个错误:

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

4 个答案:

答案 0 :(得分:3)

extract函数需要一个数组。您正在传递check函数的结果,该函数有时是数组

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

但有时候是一个字符串。

return 'you have already voted';

所以,我想你在执行第一个return语句时会看到错误。

答案 1 :(得分: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

答案 2 :(得分:0)

首先,代码中没有关闭函数定义(没有关闭“}”)

其次,如果用户已经投票,你的函数会返回字符串 - 在这种情况下,PHP显然会在extract()函数调用中说“第一个参数应该是一个数组”。

通常,我建议不要使用紧凑提取构造,而是使用结构或关联数组作为返回值。在这种情况下,行为将更加清晰。

答案 3 :(得分:0)

因此它建议:警告:extract()[function.extract]:第一个参数应该是一个数组

请尝试以下操作:

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