У меня есть следующие результаты, возвращаемые через запрос MySQL:
tag_id article_id (asc) name tag_slug
56 69487 Exploration exploration
10 69488 Events events
32 69488 Military military
28 69489 Arts arts
3 69489 Religion churches
36 69490 Forestry forestry
8 69490 Industry industry
40 69490 Man-Made man-made
42 69490 Politics politics
Мне нужно перебрать результаты и создать строку, которая будет включать tag_slugs, связанные с каждым набором идентификаторов статей. Столбцы name и tag_id не обязательны для этой части кода.
Например …
69487 будет иметь строку:<исследование>’
69488 будет иметь строку, которая:<События><военные>’
69489 будет иметь строку:<искусства><церкви>’
69490 будет иметь строку, которая:<лесоводство><промышленность><искусственный><политика>’
…и столбец с именем теги будет обновлен в БД с этими строками и соответствующим article_id.
Моя попытка ниже работает, вроде как, но всегда откладывает последнее обновление БД. Я уверен, что должен быть лучший, более логичный способ, но сейчас я не могу.
$previous_article_id = 0;
while( $row = $result->fetch_assoc() )
{
if ( $row['article_id '] != $previous_article_id && $previous_article_id != 0 )
{
$sql = "UPDATE
".ARTICLE_TABLE."SET
tags = '".$tags."'
WHERE
id = ".$previous_article_id."";
$db->query($sql) OR sql_error($db->error.$sql);
$tags = '';
}
if ( $row['article_id '] == $previous_article_id || $previous_article_id == 0 )
{
$tags .= '<'.$row['tag_slug'].'>';
}
$previous_article_id = $row['article_id '];
}
Да, я знаю, что это должен быть PDO, а коды немного сумасшедшие, но я работаю над сайтом друзей-братьев, так что не так уж много полномочий для его изменения.
Прежде всего, мои комплименты за то, как вы объяснили свою проблему и что вы попробовали. Ваш код также хорошо отформатирован. Я часто вижу некоторые посты дерьма здесь. Так что мои комплименты.
Я должен изменить весь материал на следующее:
$article_tags = array();
while( $row = $result->fetch_assoc() )
{
$article_tags[$row['article_id']][] = $row['tag_slug'];
}
foreach( $article_tags as $article_id => $tag_array )
{
$tags = '';
foreach( $tag_array as $tag )
{
$tags .= '<' . $tag . '>';
}
$sql = "UPDATE
".ARTICLE_TABLE."SET
tags = '".$tags."'
WHERE
id = ".$article_id."";
$db->query($sql) OR sql_error($db->error.$sql);
}
Возможно, более чистый способ сделать это с помощью PHP — создать ассоциативный массив, в котором ваши article_ids будут использоваться в качестве ключей, а строка, содержащая связанные теги в качестве значений.
Например.
$myArray[$row['article_id ']].='<'.$row['tag_slug'].'>';
Затем в конце вы просто повторяете с foreach
зациклите его и вставьте данные в вашу базу данных.
На мой взгляд, вы можете легче получить эти результаты из базы данных с помощью функции GROUP_CONCAT.
SELECT article_id, CONCAT('<',GROUP_CONCAT(tag_slug separator '><'),'>')
from table GROUP BY article_id
ORDER BY article_id DESC
Если у вас есть дубликаты в вашем tag_slug, вы можете использовать оператор DISTINCT внутри функции GROUP_CONCAT