Почему этот PHP «in_array» не работает с SQL-запросом?

#php #sql #wordpress

#php #sql #wordpress

Вопрос:

Привет, у меня есть несколько сообщений WordPress с пользовательским полем под названием «Идентификатор стимула». У меня есть запрос php / sql, который возвращает разделенный запятыми список «рекомендуемых» «идентификаторов стимулов»

 global $wpdb;
$user_ID = get_current_user_id();
$sql = <<<SQL
SELECT GROUP_CONCAT(T_L_INCENTIVES_ID) 
FROM incentive_recommendations_v 
WHERE accept_recommendation = 1 AND user_id = $user_ID
SQL;

if (!$sql) { // add this check.
    die('Invalid query: ' . mysql_error());
}

$resultset = array();
$rebates = $wpdb->get_results( $sql, ARRAY_A );
foreach($rebates as $data) {
     $resultset[] = $data['GROUP_CONCAT(T_L_INCENTIVES_ID)'];
}
  

Я хочу заполнить специальный значок «медаль» в каждом из сообщений, значение пользовательского поля которого «Идентификатор стимула» содержится в списке «Рекомендуемых» идентификаторов стимулов, разделенных запятыми. Для этого я пытаюсь использовать «in_array» следующим образом

 <?php while ( have_posts() ) : the_post(); ?>
<li style="margin-bottom:20px;">
<?php echo $resultset;?><br>
<?php echo get_post_meta(get_the_ID(), 'Incentive ID', true);?>
<div title="Recommended Incentive" <?php $incent = get_post_meta(get_the_ID(), 'Incentive ID', true); if ( in_array($incent,$resultset)) { 
echo'style="background-image:url(/images/gold_medal.jpg); background-repeat:no-repeat; background-size:10% auto; background-position:right top; border:2px solid #ccc; padding:20px 48px 20px 20px; height:auto; padding-bottom:20px; min-height:260px !important;"';
} else { 
echo 'style="border:2px solid #ccc; padding:20px 48px 20px 20px; height:auto; padding-bottom:20px; min-height:260px !important;"';}  ?> >
  

Однако я не могу заставить значки золотых медалей отображаться вообще, даже в сообщениях, которые, как я знаю, содержат правильный «идентификатор стимула». Ошибка, которую я получаю, гласит, что

 in_array expects parameter 2 to be array, string given.  
  

Любая помощь, которая может быть предоставлена по этой проблеме, была бы очень признательна!

Комментарии:

1. В вашем запросе нет предложения GROUP BY, что именно вы ожидаете от своего запроса? Кроме того, вы if (!sql) {...} вообще ничего не делаете, так как переменная $sql всегда будет определена там, но в этот момент запрос не был запущен.

Ответ №1:

Сначала удалите GROUP_CONCAT() из своего SELECT оператора, а затем добавьте add a GROUP BY в SELECT оператор. Вот код для SELECT инструкции и преобразования его в массив.

 global $wpdb;
$user_ID = get_current_user_id();
$sql = <<<SQL
SELECT T_L_INCENTIVES_ID
FROM incentive_recommendations_v 
WHERE accept_recommendation = 1 AND user_id = $user_ID
GROUP BY T_L_INCENTIVES_ID
SQL;

if (!$sql) { // add this check.
    die('Invalid query: ' . mysql_error());
}

$resultset = array();
$rebates = $wpdb->get_results( $sql, ARRAY_A );
foreach($rebates as $data) {
     $resultset[] = $data['T_L_INCENTIVES_ID'];
}
  

Затем измените свой код на этот для заполнения значка «золотая медаль»

 <?php $incent = get_post_meta(get_the_ID(), 'Incentive ID', true); if ( in_array($incent,$resultset)) { 
          echo'style="background-image:url(/images/gold_medal.jpg); background-repeat:no-repeat; background-size:10% auto; background-position:right top; border:2px solid #ccc; padding:20px 48px 20px 20px; height:auto; padding-bottom:20px; min-height:260px !important;"';
          } else { 
          echo 'style="border:2px solid #ccc; padding:20px 48px 20px 20px; height:auto; padding-bottom:20px; min-height:260px !important;"';}  ?>
  

Ответ №2:

GROUP_CONCAT() будет выдавать строку, поэтому результаты вашей базы данных будут выглядеть так

 $rows = array(
   '0' => array('foo' => '1,2,3,4'),
   '1' => array('bar' => '5,6,7,8')
);
  

Вы буквально пытаетесь сделать in_array(3, '1,2,3,4') . Поскольку 1,2,3,4 это строка, вы получаете предупреждение. Вам понадобится explode() эта строка, ЗАТЕМ выполните свой in_array в массиве, который вы получаете из explode() . или просто не делайте group_concat этого в БД и извлекайте отдельные записи в массив, который вы создаете в своем цикле while / fetch .