Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как добавить в друзья?
 
 автор: Sarat   (10.11.2009 в 21:30)   письмо автору
 
 

Как добавить зарегистрированному юзеру другого юзера в друзья?
План такой: в БД есть таблица users, там поле id (хозяина) и id_friend (номер друга из этой же таблицы). Допустим при нажатии на кнопку "добавить в друзья" в поле id_friend заносится id друга. А если друзей несколько? Как в поле id_friend "запихать" несколько id номеров?
Может быть есть другой, более гениальный способ? :-)

  Ответить  
 
 автор: Valick   (10.11.2009 в 21:53)   письмо автору
 
   для: Sarat   (10.11.2009 в 21:30)
 

Как в поле id_friend "запихать" несколько id номеров?
ни в коем разе...
в поле хозяина пишете (первого) хозяина в поле френда пишите (первого) френда (точка)
следующая строка... (первого) хозяина - (второго) френда и тд

  Ответить  
 
 автор: Sarat   (13.11.2009 в 14:04)   письмо автору
 
   для: Valick   (10.11.2009 в 21:53)
 

Ну вот я создал таблицу friends с двумя полями id_m и id_f (соответственно id хозяина и id друга). Записал туда в первую строчку id_m=80, id_f=74 во вторую строчку id_m=80, id_f=79. Это ключи к таблице users. В таблице users хранится вся информация о зарегестрированных пользователях. Хочу чтоб зарегестрированный пользователь (хозяин), открывая свою страничку, видел всех своих друзей.
Какой запрос нужен, чтобы вытащить все поля из таблицы users используя таблицу friends где поля id_m с идентификатором данной сессии соответствуют полям id_f ? Или другой, более простой и разумный запрос, главное чтоб хозяин видел всех своих друзей.

  Ответить  
 
 автор: Trianon   (13.11.2009 в 14:12)   письмо автору
 
   для: Sarat   (13.11.2009 в 14:04)
 

SELECT u.*
  FROM friends f 
    JOIN users u ON f.id_f = u.id 
  WHERE f.id_m = $owner_id

  Ответить  
 
 автор: Sarat   (14.11.2009 в 06:56)   письмо автору
 
   для: Trianon   (13.11.2009 в 14:12)
 

Будте добры, скажите как переводится запрос? Как я догадался $owner_id - это id хозяина. Правильно?
Но запрос не получается. Точнее не получается занести его в массив. Ошибки на строках где: $myrow_fr = mysql_fetch_array($result_fr); и while($myrow_fr = mysql_fetch_array($result_fr));
Код такой:
$result_fr = mysql_query("SELECT u.* 
  FROM friends f  
    JOIN users u ON f.id_f = u.id  
  WHERE f.id_m = $owner_id",$db); 
$myrow_fr = mysql_fetch_array($result_fr);

do
{
printf("<p><a href='page.php?id=%s'><img src='%s' align='middle'> %s, </a>зарегистровался - %s, %s<br><br></p>",$myrow_fr['id'],$myrow_fr['avatar'],$myrow_fr['login'],$myrow_fr['date'],$myrow_fr['online']);
}
while($myrow_fr = mysql_fetch_array($result_fr));

  Ответить  
 
 автор: Valick   (14.11.2009 в 09:01)   письмо автору
 
   для: Sarat   (14.11.2009 в 06:56)
 

ай ай.... а всё так хорошо начиналось, и вдруг Е.П. из-за (г)угла....
пообещайте больше никогда не применять конструкцию do while для обработки результата запроса.

  Ответить  
 
 автор: Sarat   (14.11.2009 в 12:53)   письмо автору
 
   для: Sarat   (14.11.2009 в 06:56)
 

Скажите пожалуйста при чем здесь do while ? Лучше напишите как переводится запрос, или как заносить в массив этот запрос, чтоб ошибки не было.

  Ответить  
 
 автор: Trianon   (14.11.2009 в 12:57)   письмо автору
 
   для: Sarat   (14.11.2009 в 06:56)
 

если Вы можете этим кодом вывести всю таблицу пользователей (SELECT * FROM users) , то и предложенный мной запрос тоже вывести получится.
Если конечно в $owner_id действительно лежит константа с ключом владельца эккаунта, оформленная по всем правилам SQL. (в простейшем случае - целочисленное значение суррогатного первичного ключа id)
Если не можете - это вопрос к автору кода.

  Ответить  
 
 автор: Sarat   (14.11.2009 в 13:04)   письмо автору
 
   для: Trianon   (14.11.2009 в 12:57)
 

Да, если подставить SELECT * FROM users вместо SELECT u.* FROM friends f JOIN users u ON f.id_f = u.id WHERE f.id_m = $owner_id, то вся таблица выводится, только что так сделал. А в чем тогда загвоздка?
Если написать после запроса echo $owner_id; то выводится 80, т.е. id хозяина сессии из таблицы users

  Ответить  
 
 автор: Sarat   (14.11.2009 в 13:14)   письмо автору
 
   для: Trianon   (14.11.2009 в 12:57)
 

"Если конечно в $owner_id действительно лежит константа с ключом владельца эккаунта, оформленная по всем правилам SQL. (в простейшем случае - целочисленное значение суррогатного первичного ключа id)"
Поясните ожалуйста, это предложение вообще не понял :-) И еще напишите пожалуйста как запрос переводится, а то я не понимаю чё делаю!

  Ответить  
 
 автор: Trianon   (14.11.2009 в 13:34)   письмо автору
 
   для: Sarat   (14.11.2009 в 13:14)
 

у Вас что в колонке id лежит?

table1 JOIN table2 ON table1.a = table2.b
- это таблица, получаемая присоединением к таблице1 строк таблицы2 по правилу поле a из таблицы1 равно полю b из таблицы 2, и заполнением столбцами обеих таблиц.

table1 x1 
- это назначение алиаса (псевдонима, второго имени) x1 для таблицы table1
иногда пишется как table1 AS x1 , но ключевое слово AS больше для человека - из кода его можно опускать.

  Ответить  
 
 автор: Sarat   (14.11.2009 в 14:00)   письмо автору
 
   для: Trianon   (14.11.2009 в 13:34)
 

В таблице юзерс в колонке id лежат числа, тип - int

Вот запросы к таблицам users и friends

CREATE TABLE `users` (
`id` int(11) NOT NULL auto_increment,
`login` varchar(15) NOT NULL default '',
`password` varchar(255) NOT NULL default '',
`avatar` varchar(255) NOT NULL default '',
`email` varchar(255) NOT NULL default '',
`nm` varchar(255) NOT NULL default '',
`ln` varchar(255) NOT NULL default '',
`activation` int(1) NOT NULL default '0',
`date` datetime NOT NULL default '0000-00-00 00:00:00',
`online` int(1) NOT NULL default '0',
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=82 ;


CREATE TABLE `friends` (
`id_m` int(11) NOT NULL default '0',
`id_f` int(11) NOT NULL default '0'
) TYPE=MyISAM;

  Ответить  
 
 автор: Trianon   (14.11.2009 в 14:10)   письмо автору
 
   для: Sarat   (14.11.2009 в 14:00)
 

в phpMyAdmin запрос проходит?

  Ответить  
 
 автор: Sarat   (14.11.2009 в 14:28)   письмо автору
 
   для: Trianon   (14.11.2009 в 14:10)
 

Ну я не знаю. А как узнать проходит ли? Ну я же делаю другие запросы то проходят, а этот что особенный. У меня старая версия phpMyAdmin 2.5.6.

  Ответить  
 
 автор: Trianon   (14.11.2009 в 23:21)   письмо автору
 
   для: Sarat   (14.11.2009 в 14:28)
 

>Ну я не знаю. А как узнать проходит ли?

Попробовать выполнить.

  Ответить  
 
 автор: Sarat   (15.11.2009 в 15:13)   письмо автору
 
   для: Trianon   (14.11.2009 в 23:21)
 

не проходит тот

  Ответить  
 
 автор: Trianon   (15.11.2009 в 16:02)   письмо автору
 
   для: Sarat   (15.11.2009 в 15:13)
 

не проходит - это не разговор.
Раз не проходит - значит показывает диагностику с ошибкой.
Её надо прочесть (диагностику) , понять и исправить (ошибку).

  Ответить  
 
 автор: Sarat   (15.11.2009 в 18:12)   письмо автору
 
   для: Trianon   (15.11.2009 в 16:02)
 

Вот что пишет денвер:
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in z:\home\localhost\www\autostrada42\all_users.php on line 53

  Ответить  
 
 автор: Trianon   (15.11.2009 в 18:14)   письмо автору
 
   для: Sarat   (15.11.2009 в 18:12)
 

Я спросил, что пишет PhpMyAdmin , а не денвер (в ответ на неотлаженный скрипт.)
SELECT u.* 
  FROM friends f  
    JOIN users u ON f.id_f = u.id  
  WHERE f.id_m = 20

где 20 - идентификатор владельца эккаунта.

  Ответить  
 
 автор: Sarat   (15.11.2009 в 18:18)   письмо автору
 
   для: Trianon   (15.11.2009 в 18:14)
 

а где это посмотреть?

  Ответить  
 
 автор: Trianon   (15.11.2009 в 18:21)   письмо автору
 
   для: Sarat   (15.11.2009 в 18:18)
 

в PhpMyAdmin

  Ответить  
 
 автор: Sarat   (15.11.2009 в 18:28)   письмо автору
 
   для: Trianon   (15.11.2009 в 18:21)
 

Где именно?

  Ответить  
 
 автор: Trianon   (15.11.2009 в 18:44)   письмо автору
 
   для: Sarat   (15.11.2009 в 18:28)
 

Вообще-то запросы проверяют на закладке SQL , предварительно выбрав нужную БД.

  Ответить  
 
 автор: Sarat   (15.11.2009 в 18:46)   письмо автору
 
   для: Trianon   (15.11.2009 в 18:44)
 

воть:
Ошибка

SQL-запрос :

SELECT u. *
FROM friends f
JOIN users u ON f.id_f = u.id
WHERE f.id_m = $id
LIMIT 0 , 30

Ответ MySQL:
#1064 - You have an error in your SQL syntax near 'ON f.id_f = u.id
WHERE f.id_m = $id LIMIT 0, 30' at line 3

  Ответить  
 
 автор: Sarat   (14.11.2009 в 17:00)   письмо автору
 
   для: Sarat   (10.11.2009 в 21:30)
 

Решил проблему используя два запроса к разным таблицам и две конструкции do while:
$result_fr = mysql_query("SELECT * FROM friends WHERE $id = id_m",$db); 
$myrow_fr = mysql_fetch_array($result_fr);
do
{
$r_fr = mysql_query("SELECT * FROM users WHERE $myrow_fr[id_f] = id",$db); 
$fr = mysql_fetch_array($r_fr);
do

printf("<p><a href='page.php?id=%s'><img src='%s' align='middle'> %s, </a>зарегистровался - %s, %s<br><br></p>",$fr['id'],$fr['avatar'],$fr['login'],$fr['date'],$fr['online']);
}
while($fr = mysql_fetch_array($r_fr));
}
while($myrow_fr = mysql_fetch_array($result_fr));

Код конечно не самый гениальный, но всё работает :-)

  Ответить  
 
 автор: Sarat   (14.11.2009 в 17:48)   письмо автору
 
   для: Sarat   (14.11.2009 в 17:00)
 

Жалко только что у меня в списке друзей не получится сигнализировать пользователя если он онлайн. Тут итак две таблицы задейчтвовано, а там еще третья будет "session" и запрос очень запутанный будет и в цикле не выведешь всё (это тройная конструкция do while), только через функцию наверно можно и то хз.
Сделал вывод что надо срочно MySQL изучать!

  Ответить  
 
 автор: Sarat   (15.11.2009 в 15:16)   письмо автору
 
   для: Sarat   (14.11.2009 в 17:48)
 

SELECT * FROM friends WHERE $id = id_m
Мне нужно изменить этот запрос так чтобы поля с одинаковым совпадением цифр не вытаскивались. Напомню что в таблице friends всего два поля id_m и id_f

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования