У меня есть две таблицы, и я хочу получить результат, который соответствует только массиву, вот база данных:
таблица pinned, в ней хранится место применения статей
| id | article_id | pinned_sort | apply |
| 1 | 121 | 1 | a:1:{i:0;i:1;} |
| 2 | 148 | 1 | a:3:{i:0;i:2;i:1;i:2;i:2;i:3;} |
| 3 | 210 | 1 | a:3:{i:0;i:3;i:1;i:2;i:2;i:3;} |
таблица article, в ней хранятся статьи
| aid | title |
| 121 | Test 1 |
| 148 | Test 2 |
| 210 | Test 3 |
И вот моя функция
<?php
function getArticlePinned($connectdb, $board_id = '')
{
$board_id = (int) $board_id;
if (!empty($board_id)) {
$read['query'] = 'SELECT
article.aid,
article.title,
pinned.apply
FROM pinned
INNER JOIN article ON article.aid = pinned.article_id
ORDER BY pinned_sort ASC';
//Get result
$read['stmt'] = $connectdb->stmt_init();
$read['stmt']->prepare($read['query']);
$read['stmt']->execute();
$read['result'] = $read['stmt']->get_result();
if ($read['result']->num_rows != 0) {
while ($read['row'] = $read['result']->fetch_assoc()) {
//Get array from unserialize
$pinnedArray = unserialize($read['row']['apply']);
if (is_array($pinnedArray)) {
//Check if the board id is in array
if (in_array($board_id, $pinnedArray) === true) {
$result[] = $read['row'];
} else {
$result = false;
}
} else {
$result = false;
}
}
} else {
$result = false;
}
} else {
$result = false;
}
return $result;
}
Но очень странно, что только когда $board_id есть 1, он может получить результат...
@04FS тест для этого $array = array(1,2,3); echo serialize($array);
И он возвращает это a:3:{i:0;i:1;i:1;i:2;i:2;i:3;}






Я думаю, что ваш код должен инициализировать $result = false по умолчанию и позволить приведенному ниже коду работать в соответствии с ним.
function getArticlePinned($connectdb, $board_id = '')
{
$board_id = (int) $board_id;
$result = false;
if (!empty($board_id)) {
$read['query'] = 'SELECT
article.aid,
article.title,
pinned.apply
FROM pinned
INNER JOIN article ON article.aid = pinned.article_id
ORDER BY pinned_sort ASC';
//Get result
$read['stmt'] = $connectdb->stmt_init();
$read['stmt']->prepare($read['query']);
$read['stmt']->execute();
$read['result'] = $read['stmt']->get_result();
if ($read['result']->num_rows != 0) {
while ($read['row'] = $read['result']->fetch_assoc()) {
//Get array from unserialize
$pinnedArray = unserialize($read['row']['apply']);
//Check if the board id is in array
if (is_array($pinnedArray) && in_array($board_id, $pinnedArray)) {
$result[] = $read['row'];
}
}
}
}
return $result;
}
Демо.
Потому что в цикле while вы проверяли, существует ли board_id или нет, если он не существует, вы сбрасывали/удаляли массив результатов, если совпадение, то добавляло данные в результат, поэтому впоследствии вы добавляли и удаляли данные из массива $result . Я надеюсь, что я ясно.
О, я понял, вы имеете в виду, что я просто установил $result в true и сбросил его в false, когда $board_id не находится в массиве, большое спасибо !!!!!
Точно ты меня понял :)
Боже мой ! Я починил это !! Я просто удаляю $result = false;, когда in_array возвращает false, вот код:
if (in_array($board_id, $pinnedArray) === true) {
$result[] = $read['row'];
}
Вместо
if (in_array($board_id, $pinnedArray)) {
$result[] = $read['row'];
} else {
$result = false;
}
До сих пор не знаю почему, но это работает...
И можете ли вы сравнить это с моим решением, я дал что-то другое, что вы только что опубликовали?
@DrakulaPredator о, извините, я не смотрел ваш код полностью, я думал, что вы добавляете $result = false; только в начало скрипта ...
Какой ?! но массив генерируется функцией
serialize...