#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 .