|
|
|
| Как добавить зарегистрированному юзеру другого юзера в друзья?
План такой: в БД есть таблица users, там поле id (хозяина) и id_friend (номер друга из этой же таблицы). Допустим при нажатии на кнопку "добавить в друзья" в поле id_friend заносится id друга. А если друзей несколько? Как в поле id_friend "запихать" несколько id номеров?
Может быть есть другой, более гениальный способ? :-) | |
|
|
|
|
|
|
|
для: Sarat
(10.11.2009 в 21:30)
| | Как в поле id_friend "запихать" несколько id номеров?
ни в коем разе...
в поле хозяина пишете (первого) хозяина в поле френда пишите (первого) френда (точка)
следующая строка... (первого) хозяина - (второго) френда и тд | |
|
|
|
|
|
|
|
для: 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 ? Или другой, более простой и разумный запрос, главное чтоб хозяин видел всех своих друзей. | |
|
|
|
|
|
|
|
для: 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
|
| |
|
|
|
|
|
|
|
для: 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));
|
| |
|
|
|
|
|
|
|
для: Sarat
(14.11.2009 в 06:56)
| | ай ай.... а всё так хорошо начиналось, и вдруг Е.П. из-за (г)угла....
пообещайте больше никогда не применять конструкцию do while для обработки результата запроса. | |
|
|
|
|
|
|
|
для: Sarat
(14.11.2009 в 06:56)
| | Скажите пожалуйста при чем здесь do while ? Лучше напишите как переводится запрос, или как заносить в массив этот запрос, чтоб ошибки не было. | |
|
|
|
|
|
|
|
для: Sarat
(14.11.2009 в 06:56)
| | если Вы можете этим кодом вывести всю таблицу пользователей (SELECT * FROM users) , то и предложенный мной запрос тоже вывести получится.
Если конечно в $owner_id действительно лежит константа с ключом владельца эккаунта, оформленная по всем правилам SQL. (в простейшем случае - целочисленное значение суррогатного первичного ключа id)
Если не можете - это вопрос к автору кода. | |
|
|
|
|
|
|
|
для: 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 | |
|
|
|
|
|
|
|
для: Trianon
(14.11.2009 в 12:57)
| | "Если конечно в $owner_id действительно лежит константа с ключом владельца эккаунта, оформленная по всем правилам SQL. (в простейшем случае - целочисленное значение суррогатного первичного ключа id)"
Поясните ожалуйста, это предложение вообще не понял :-) И еще напишите пожалуйста как запрос переводится, а то я не понимаю чё делаю! | |
|
|
|
|
|
|
|
для: Sarat
(14.11.2009 в 13:14)
| | у Вас что в колонке id лежит?
table1 JOIN table2 ON table1.a = table2.b
| - это таблица, получаемая присоединением к таблице1 строк таблицы2 по правилу поле a из таблицы1 равно полю b из таблицы 2, и заполнением столбцами обеих таблиц.
- это назначение алиаса (псевдонима, второго имени) x1 для таблицы table1
иногда пишется как table1 AS x1 , но ключевое слово AS больше для человека - из кода его можно опускать. | |
|
|
|
|
|
|
|
для: 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; | |
|
|
|
|
|
|
|
для: Sarat
(14.11.2009 в 14:00)
| | в phpMyAdmin запрос проходит? | |
|
|
|
|
|
|
|
для: Trianon
(14.11.2009 в 14:10)
| | Ну я не знаю. А как узнать проходит ли? Ну я же делаю другие запросы то проходят, а этот что особенный. У меня старая версия phpMyAdmin 2.5.6. | |
|
|
|
|
|
|
|
для: Sarat
(14.11.2009 в 14:28)
| | >Ну я не знаю. А как узнать проходит ли?
Попробовать выполнить. | |
|
|
|
|
|
|
|
для: Trianon
(14.11.2009 в 23:21)
| | не проходит тот | |
|
|
|
|
|
|
|
для: Sarat
(15.11.2009 в 15:13)
| | не проходит - это не разговор.
Раз не проходит - значит показывает диагностику с ошибкой.
Её надо прочесть (диагностику) , понять и исправить (ошибку). | |
|
|
|
|
|
|
|
для: 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 | |
|
|
|
|
|
|
|
для: 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 - идентификатор владельца эккаунта. | |
|
|
|
|
|
|
|
для: Trianon
(15.11.2009 в 18:14)
| | а где это посмотреть? | |
|
|
|
|
|
|
|
для: Sarat
(15.11.2009 в 18:18)
| | в PhpMyAdmin | |
|
|
|
|
|
|
|
для: Trianon
(15.11.2009 в 18:21)
| | Где именно? | |
|
|
|
|
|
|
|
для: Sarat
(15.11.2009 в 18:28)
| | Вообще-то запросы проверяют на закладке SQL , предварительно выбрав нужную БД. | |
|
|
|
|
|
|
|
для: 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
(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:00)
| | Жалко только что у меня в списке друзей не получится сигнализировать пользователя если он онлайн. Тут итак две таблицы задейчтвовано, а там еще третья будет "session" и запрос очень запутанный будет и в цикле не выведешь всё (это тройная конструкция do while), только через функцию наверно можно и то хз.
Сделал вывод что надо срочно MySQL изучать! | |
|
|
|
|
|
|
|
для: Sarat
(14.11.2009 в 17:48)
| | SELECT * FROM friends WHERE $id = id_m
Мне нужно изменить этот запрос так чтобы поля с одинаковым совпадением цифр не вытаскивались. Напомню что в таблице friends всего два поля id_m и id_f | |
|
|
|