Делаем репосты и лайки на PHP

Итак, допустим, наша соцсеть набирает популярность, и в ней зарегистрировалась Маша, к которой Василий имеет симпатию, но пока не знает, как выразить сие чувство. При всем этом он не хочет к ее записи писать тупорылый комментарий вроде "Эта цитата Канта имеет смысл", а просто поставить какую-нибудь отметку, которая может означать что угодно. Да-да, вы правильно догадались, будем делать лайки.

Поскольку нам всего-то нужно отмечать, кто на что лайк поставил, то таблица будет примерно следующая:

CREATE TABLE `post_likes` (
`user_id` int(10) unsigned NOT NULL,
`post_id` int(10) unsigned NOT NULL,
PRIMARY KEY (`user_id`,`post_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Пояснений не последует, не дурные, разберетесь :)

Т.е. потом, чтобы узнать, ставили ли мы лайк на запись, достаточно сделать такой запрос
SELECT COUNT(*) AS `check` FROM `post_likes` WHERE `user_id` = {$my_id} AND `post_id` = {$post_id}

Собственно, если check > 0, то ставили.

Общее количество лайков еще проще
SELECT COUNT(*) AS `num` FROM `post_likes` WHERE `post_id` = {$post_id}

С репостами будет чуть сложнее. Нам нужно сохранять как минимум автора и текст записи, которую мы репостим (вдруг изначальный автор ее отредактирует, и наш комментарий больше не будет релевантным).

CREATE TABLE `reposts` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`reposter_id` int(10) unsigned NOT NULL,
`orig_poster` int(10) unsigned NOT NULL COMMENT 'чью запись репостим',
`orig_post_id` int(10) unsigned NOT NULL,
`orig_post_message` text NOT NULL,
`orig_post_images` text,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

В таблице `user_walls`, где мы храним записи на стенах, добавим поле `repost_id` (по умолчанию NULL). Т.е. если это репост, то информацию о нем мы может получить по этому id из таблицы `reposts`. А вот здесь немного поясню:
reposter_id - id пользователя, который делает репост,
orig_poster - пользователь, чью запись репостят,
orig_post_id - id записи, которую репостим,
orig_post_message - текст записи в том, виде, в каком она была, когда мы делали репост (чтоб не получилось, что Василий перепостит запись "Вася клевый", а ее потом отредактируют на "Вася лох", и у него будет висеть такая же, вот подстава-то),
orig_post_images - какие картинки прилеплены к оригинальной записи

Количество репостов для записи получаем по тому же принципу, что и лайки, только из таблицы reposts
SELECT COUNT(*) AS `num` FROM `reposts` WHERE `reposter_id` = {$my_id} AND `orig_post_id` = {$orig_post_id}

Ну а теперь можете открывать исходники и смотреть...

Исходник тут (кстати, в нем также реализована фича из этой статьи [мессаги])

0_0 Мой бог, что это?!?! - вероятная ваша реакция, если вы не сталкивались с PDO ранее.
Это суровая действительность! Все эти mysql_connect и mysql_query и прочие mysql_* можно считать прошлым веком, а в последующих версиях PHP они будут deprecated, так что переучиваться самое время, если от жизни отстать не желаете :)

Я сам учился по этим туториалам:
здесь доходчиво объясняется, почему его стоит использовать, а здесь как им правильно пользоваться. Более хардкорный вариант вот тут http://www.php.net/manual/en/book.pdo.php

Но я быстренько пробегусь по материалу и объясню на пальцах, как общаться с БД посредством этой штуковины.

Подключиться к БД можно допустим так
$con = new PDO('mysql:host=localhost;dbname=myDatabase', $username, $password);

Как видите, если мы переедем на PosgreSQL или еще какой драйвер, то не надо будет заменять все функции mysql_*, а только здесь заменить кусочек :)

$con дальше будет нашим идентификатором подключения.

Чтобы выполнить какой-то запрос мы можем написать просто
$con->query("UPDATE `girls` SET `hot` = 1 WHERE `user` = 'Masha'");

Но чаще нам надо получить список результатов. В таких случаях PDO нам вернет так называемый statement, с которым уже можно делать всякие fetch(), fetchAll(), fetchObject() и прочее. Вот 2 примера приблизительно одного и того же действия:

$data = $con->query("SELECT * FROM `girls` WHERE `hot` = 1");
foreach ( $data as $row ) {
 // погнали
}

Или же можно так

$user = 'Vika';
$data = $con->query("SELECT `phone` FROM `girls` WHERE `user` = '{$user}'");
while ( $row = $data->fetch() ) {
 // выводим телефоны всех Вик
}

НО! Как видите, я использую переменную прямо в запросе, а так стоит делать только, если вы уверены, что у вас переменные нормальные, в остальных случаях лучше использовать [барабанная дробь] PREPARED STATEMENTS!

В этом случае не строка запроса отправляется, а сам этот подготовленный стейтмент, и отдельно переменные, т.е. sql-инъекцию сделать весьма и весьма.. невозможно, пожалуй.

Как это делается? Пример:

$data = $con->prepare("DELETE FROM `girls` WHERE `user` = ?");
$data->execute( array('Fedya') );

Но использование знака вопроса может быть неудобным и нечитабельным, особенно в больших запросах, поэтому есть еще вариант:

$data = $con->prepare("DELETE FROM `girls` WHERE `user` = :name");
$data->execute( array('name' => 'Fedya') );

Ну и далее по накатанной fetch() и т.д.

В общем-то есть и другие способы и тонкости, но за ними обращайтесь к другим туториалам. А пока все.

Что же касается UI (user interface), то здесь нового только Fancybox - полезная штука, там есть и примеры, и документация, не все ж мне вам разжевывать :)

В итоге мы получили то, что получили, ни больше, ни меньше... Мда, звучит крайне логично и неинформативно. Что поделать... ну-с, до связи ;)


Возможно, вам будет интересно почитать и другие статьи из этой же серии:

1. Создание стены как Вконтакте
2. Создание стены для разных пользователей
3. Информация о сайте при вставке ссылки в запись на стене
4. Удаление записей со стены
5. Добавление фотографий на стену
6. Добавление в друзья
7. Система сообщений как Вконтакте

 Жду с нетерпением
ваших комментариев!
 

Подписаться на RSS

Вы можете нажать "подписаться", чтобы следить за моими новостями!
Так вы всегда будете в курсе появления новостей на сайте =)
О том, что такое RSS можно прочитать здесь.

Подписаться

Подписаться на Twitter

Я специально зарегистрировался в Твиттере, чтобы вы могли следить за обновлениями на сайте =)

Подписаться

Envato marketplace А эти люди занимаются прокатом карнавальных костюмов и масок в Минске. К слову, я им делал сайт.