У меня есть система уведомлений, похожая на Facebook, где пользователи получают уведомления в зависимости от того, кто опубликовал / понравился / оценил на каком конкретном сайте.
На данный момент вы получите уведомление, когда вы создаете какой-либо контент или вы разместили на определенном контенте следующее заявление mysql:
SELECT
n.`id`,n.`site`,n.`site_id`,n.`creator_uid`,n.`type`,
nu.`id` AS nuid, nu.`uid` AS nu_uid, nu.`date`,
nr.`id` AS nrid, nr.`uid` AS nr_uid, nr.`is_read`,
u.`gender`
FROM `notification` AS n
LEFT JOIN `notification_user` AS nu ON nu.`nid` = n.`id`
LEFT JOIN `notification_read` AS nr ON nr.`nid` = n.`id`
LEFT JOIN `users` AS u ON u.`id` = nu.`uid`
WHERE
nu.`uid` != '".$_SESSION['uid']."' AND nr.`uid` = '".$_SESSION['uid']."'
OR
(
nu.`uid` = '".$_SESSION['uid']."' AND n.`type` = 'credits'
)
ORDER BY date DESC, nu.`id` DESC
LIMIT 7
Теперь я создал систему друзей и хочу показать действия своих друзей также в виде уведомлений. Я думал встроить это в утверждение, но это утверждение загружается на каждой странице всего сайта, и я думаю, что это уже довольно сложно для исполнения. Итак, пройдя через users_friends
Я полагаю, что таблицы каждый раз, когда «собирать» идентификаторы моего друга будут еще сложнее для производительности. Поэтому я подумал о том, чтобы сохранить эти данные идентификаторов друзей в моей СЕССИИ, например, так:
// get friends user ids
$result = mysql_query("SELECT
CASE
WHEN `sent_uid`='".$_SESSION['uid']."' THEN `get_uid`
WHEN `get_uid`='".$_SESSION['uid']."' THEN `sent_uid`
END AS uid
FROM `users_friends` WHERE `status`='1' AND
(`get_uid`='".$_SESSION['uid']."' OR `sent_uid`='".$_SESSION['uid']."')
") or die(mysql_error());
$i=1;
$num_rows = mysql_num_rows($result);
if (!empty($num_rows) && empty($_SESSION['friends']))
{
while ($data = mysql_fetch_assoc($result))
{
$_SESSION['friends'][] = $data['uid'];
}
}
Теперь у меня есть массив с именем $_SESSION['friends']
со значениями, например, «39,2,49». Я не думал о реализации этого сейчас в запросе уведомлений, потому что сначала я хотел спросить, является ли эта попытка хотя бы разумной, или я должен выбрать другой способ сделать это? Я ценю любые предложения.
Вы можете реализовать что-то подобное, но ИМХО вам нужен подход кеша.
Это зависит от нескольких факторов, но, как правило, я не использую сессии для хранения данных, которые должны быть сохранены. В этом случае я бы сделал что-то вроде:
Таким образом, вы сохраните данные и избежите ударов БД и обходных путей к сессиям.
Просто идея, надеюсь, это поможет или вдохновит. Хорошо выглядишь!
Зачем делать больше, когда вы можете делать меньше и иметь лучшее решение? 🙂
Зачем делать строку через запятую? Просто сохраните это как массив. Таким образом, вы можете делать разные вещи, как поисковый массив и т. д. и всякий раз, когда вам нужна строка, разделенная запятыми, вы можете использовать implode()
функция.
Также, если Вам не нужно запрашивать базу данных, если заполнено $ _SESSION [‘friends’], перенести запрос в условный блок.
if (empty($_SESSION['friends'])) {
$result = mysql_query(...);
while ($data = mysql_fetch_assoc($result)) {
$_SESSION['friends'][] = $data['uid'];
}
}