2014-09-28 3 views
0

Я в настоящее время разрабатываю сайт социальной сети, в котором отображает сообщения пользователя входа, в том числе сообщения его друзей Я успешно создал сценарий, чтобы показать все сообщения, получив первый всех друзей пользователя входа. Затем поставьте их на сеанс. Затем получите все сообщения , используя in_array();Get all friends post with mysql

MY DB SCHEMA 
person_tbl 
    pr_id 
    pr_name 

post_tbl 
    po_id 
    po_message 
    po_prid (reference pr_id) 

friend_tbl 
fr_id 
fr_from_prid 
fr_to_prid 

SAMPLE DATA 
pr_id pr_name 
1  Jeniffer 
2  Dale 
3  Melissa 

po_id po_prid po_message 
1   2  Post by Dale 
2   2  Post by Dale 2 
3   1  Post by Jen 
4   3  Post by Melissa 

fr_id fr_from_prid fr_to_prid 
1   1    2   // Jennifer and Dale were friends 

Вот мой код.

$LOGIN_USER_ID = 1 // e.g id of login user (person_tbl pr_id in database) 

unset($_SESSION['friends']); 
$_SESSION['friends'] = array(); 

$frdt = (get all friends by LOGIN USER); // from database 
foreach($frdt as $fkey => $fval) { // get all friends 
    $fr_from = $fval['fr_from_prid']; 
    $fr_to = $fval['fr_to_prid']; 

    if($LOGIN_USER_ID != $fr_from) { 
     $_SESSION['friends'][] = $fr_from; 
    } 
    if($LOGIN_USER_ID != $fr_to) { 
     $_SESSION['friends'][] = $fr_to; 
    } 
} 

$_SESSION['friends'][] = $LOGIN_USER_ID; // include login user id in friends session 

// e.g display of id of friend (2, 3 and 1) 1 for login user. 
$friends_of_user = $_SESSION['friends']; 

$post_tbl = get_all_post(); 
foreach($post_tbl as $key => $val) { 
    $id = $val['po_id']; 

    if(in_array($po_prid, $friends_of_user)) { 
     // DISPLAY ALL POST 
    }  
} 

Как и я сказал, я успешно получил все сообщения. Однако я хочу ограничить пост при загрузке страницы, а затем, как стиль facebook, если страница прокручивается вниз, она загрузит другие сообщения. Чтобы сделать его коротким, все, что я хочу, - это выбрать пост-предел 0, 20, если пользователь прокрутит нижний предел 20, 40, затем 20, 60 и так далее. Можно ли получать сообщения только с использованием SQL-запроса без выполнения таких действий, как сеанс? Заранее спасибо.

ответ

0

Я не понимаю, почему вы используете сеансы вместо обычной переменной? Но, на самом деле можно укомплектовать избежать использования переменных и сделать это в одном запросе SQL:

SELECT * FROM post_tbl WHERE po_prid IN (SELECT fr_to_prid FROM friend_tbl WHERE fr_from_prid = :current_user_id) 

Вам придется адаптировать его, так как ваши таблицы полей не понятны, и я не уверен, что fr_from_prid и fr_to_prid относится к ...

Если вы хотите ограничить Y сообщений, начиная с X, то просто добавьте:

SELECT * FROM post_tbl WHERE po_prid IN (SELECT fr_to_prid FROM friend_tbl WHERE fr_from_prid = :current_user_id) LIMIT X, Y 

затем вам нужно будет позвонить сценарий с помощью Ajax, чтобы получить следующие сообщения Y.

+0

Что делать, если fr_from_prid = 2 и fr_to_prid = 1? Вы пробовали свой код брах? Собираюсь проверить это также. Спасибо хоть. –

+0

возможно отсутствие навыков sql? Lols. Мои коды могут отображать все записи входа, включая сообщение друзей. Предельные данные - моя проблема, хотя –

+0

Я оскорбил тебя, брах? Или ты просто переигрываешь. Так же, как я сказал, я успешно получил отображение всех сообщений. Во всяком случае, я уже пробовал ваш код. Кстати, я говорю сам с собой, когда говорил, что мне не хватает моих навыков работы с SQL. Вот почему я использую сеанс. запомнить? Я ценю ваши усилия. Легкий douchebag! –

0

Вы вдохновили меня на брахмана @Galithiel! Получил ответ на мой вопрос!

select po_message 
from post_tbl 
LEFT JOIN friend_tbl 
    ON po_prid=fr_from_prid OR po_prid=fr_to_prid 
WHERE po_prid={$LOGIN_USER_ID} 
    OR fr_from_prid={$LOGIN_USER_ID} 
    OR fr_to_prid={$LOGIN_USER_ID} 
LIMIT 0 , 10