проблема с использованием функции извлечения PHP? - PullRequest
0 голосов
/ 25 октября 2010
 <?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 ]

3 голосов
/ 25 октября 2010

Функция extract ожидает массив.Вы передаете ему результаты вашей check функции, которая иногда представляет собой массив

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

, а иногда и строку.ошибка при выполнении первого оператора return.

1 голос
/ 25 октября 2010

Может быть, что-то вроде этого лучше:

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'];
}

Вы также можете использовать исключения .

0 голосов
/ 25 октября 2010

Итак, как следует: Предупреждение: extract () [function.extract]: Первый аргумент должен быть массивом

Попробуйте следующее:

$arr = check($_SESSION['user_id'], $topicId);
if(is_array($arr)) {
  extract($arr);
  echo $against;
  echo $support;
} else {
  echo $arr;
}
0 голосов
/ 25 октября 2010

Во-первых, определение функции не закрыто в вашем коде (без закрытия "}")

Во-вторых, ваша функция возвращает строку, если пользователь уже проголосовал - в этом случае PHP явно скажет «Первый аргумент должен быть массивом» при вызове функции extract ().

Как правило, я бы рекомендовал не использовать конструкцию компактного извлечения, а вместо этого использовать структуры или ассоциативные массивы в качестве возвращаемого значения. В этом случае поведение будет намного понятнее.

...