Показать полную графическую версию : phpmysql.
Vlad Drakula
26-04-2005, 22:28
slaine
$a = mysql_query(" SELECT e.login as LoginE, l.login as LiginL FROM ENTER e, LINKS l WHERE e.m_id = l.m_id");
while ($b = mysql_fetch_array($a))
{
echo $b['LoginE'];
echo $b['LoginL'];
}
Салют всем.
Помогите разобратся.
у меня две таблицы(к примеру):
t1
======
m_id int not null unique auto_increment primary key,
name char(30) not null
t2
======
id int not null unique auto_increment primary key,
m_id int not null,
mess text
Они связаны по m_id.
Чтобы подсчитать сколько сообщений у пользователя я делаю так:
SELECT t1.name AS nameN, count(*) FROM t1,t2 WHERE t1.m_id = t2.m_id GROUP BY t1.name;
А как мне сделать записьб тоесть добавлять новые сообщения в t2, как мне
быть со внешним ключём(m_id), только если вручную добавлять m_id пользователя?
INSERT INTO t1 values ('', '???', '$message')"
Объсните, а то в книгах любят писать всё не до конца.
vadimiron
10-06-2005, 12:19
Скажите, а у вас имена пользователей всегда разные?? То есть не разрешается добавлять пользователя с именем, которое уже есть в базе?? Если так, то поле m_id не нужно. Одна таблица должна содержать все данные о пользователе (имя пользователя в качестве ключа), а таблица с сообщениями будет вместо m_id содержать просто имя добавившего сообщение юзера.
Это было просто предложение.....
В вашем случае наверно нужно искать в таблице с юзерами соотетствующий номер по имени
SELECT m_id FROM t1 WHERE name='$name' (подобный запрос не нужен если использовать имя юзера в качестве ключа), и потом этот m_id использовать в запросе-вставке
Спасибо.
ещё хотел спросить, как сделать, чтобы COUNT(*) показывал
пользвателей(t1.name) = 0, у которых t2.mess пусто, ато он их просто
игнорирует.
vadimiron
10-06-2005, 19:34
как сделать, чтобы COUNT(*) показывал пользвателей(t1.name) = 0, у которых t2.mess пусто
Сори, я не очень понял: если mess пуст, то зачем добавлять подобную запись в таблицу сообщений??
Да я не про таблицу сообщений, ну её.
Я имел ввиду подсчитать сколько собщений сделал юзер, например:
юзер1 = 1(сообщений)
юзер2 = 2(сообщений)
юзер3 = 24(сообщений)
юзер4 = 0(сообщений) - так вот у кого ноль COUNT(*) его игнорирует, непоказывает, что у него '0'.
Что мне можно предпринять?
Prisoner
10-06-2005, 22:25
SELECT
u_name,
COUNT(u_message)
FROM
messages
GROUP BY
u_name
u_name - имя пользователя
u_message - текст сообщения.
Конечно, в таблице сущности "сообщения" могут быть иные поля.
Спасибою,
Ноя всё хочу добится того, чтоб если у 'u_user' поле 'u_message' пусто, то COUNT()
выводил бы '0',
а в итоге выводят '1'
messages
========
id int auto_increment,
u_user char(30) not null,
u_message text
В форумах, в списках пользователей ведб так и есть.
vadimiron
11-06-2005, 17:34
А почему должен быть юзер в таблице с сообщениями, если он ни одного сообщения не написал???
Это перемешивание концепций:
У вас есть две таблицы. В таблице users должна быть собрана вся информация о юзерах. В табице messages в свою очередь должна быть собрана вся информация о сообщениях. Последствием этого является то, что пока юзер не создал сообщение, он никаким образом не отбразиться в таблице с сообщениями, поэтому и нулевых полей (где message пустой) не должно быть.
В этом случае ситуация, описанная вами, не возникнет и можно спокойно использовать запрос, написанный Prisoner-ом.
Ещё одно предложение: если вам часто нужно выводить количество сообщений каждого юзера, то это будет накладно каждый раз делать запрос. чтобы подсчитать количество сообщений, а лучше будет сделать отдельное поле в таблице с юзерами, в котором будете держать число сообщений каждого юзера (как бы одна из характеристик юзера). Это число нужно будет просто каждый раз при добавлении нового сообщения инкрементировать, а при создании юзера ставить по умолчанию 0. Такая схема будет быстрей работать
vadimiron
11-06-2005, 17:38
а в итоге выводят '1'
Естественно, ведь используется оператор COUNT(),который подсчитывает КОЛИЧЕСТВО. Если вы записали юзера с пустым сообщением в таблицу с сообщенияеми, то он там ОДИН раз присутствует, отсюда и 1.
Это число нужно будет просто каждый раз при добавлении нового сообщения инкрементировать
А, как оно будет инкрементировать для каждого пользователя в отдельности ?
Не могли бы вы мне показать кусочек такой таблицы?
vadimiron
11-06-2005, 21:27
А, как оно будет инкрементировать для каждого пользователя в отдельности ?
Не могли бы вы мне показать кусочек такой таблицы?
При добавлении нового сообщения вытаскиваем значение "количество сообщений" добавляющего юзера (естественно из таблицы "Юзеры"), потом количество сообщений=количество сообщений+1, и далее записываем это значение вместо сторого (то есть UPDATE)
Спасибо за идею, а то я зациклился на COUNТ()-е.
Всё замечательно работает!
Скажите, почему здесь нет слэшей перед кавычками?
mysql_query("insert into r1 values ('".addslashes($user)."')");
$auth = mysql_query("select name from r1");
while ($print = mysql_fetch_array($auth)){
echo $print['name']."<BR>";
}
Prisoner
05-07-2005, 02:12
Внутри открывающей и закрывающей кавычек одного рода (двойные) можно использовать сколь угодно большое число кавычек второго рода (одинарные).
Я имел ввиду, когда я ввоже данные типа asd"asd"fasf" на выходе нет слэшей перед
кавычками. Ведь там стоит addslashes, а stipslashes я специально убрал.
vadimiron
05-07-2005, 13:02
а так идёт??
mysql_query("insert into r1 values ('addslashes($user)')");
Потому что слеш нужен для правильной передачи параметров, во время записи они убираются, вот если сделать echo addslashes($user); то слеши будут. Читайте мануалы внимательней.
Vadimironв таком виде мне выдают как строку.
ArchyПри использовании функции Addslashes() строка будет сохранена в базе данных
с символами косой черты. При получении строки нужно не забыть удалить символы
косой чертыю Это можно сделать функцией Stripslashes().
Я пробовал так с текстовыми БД слэши остаются, а с MySQL нету, почему? мне очень интересно.
magic_quotes_gps - off.
И ещё если я ставлю перед записью в MySQL символ '<', то после него вообще он ничего не
воспринимает, незаписывает. Теги у меня не фильтруются вообще.
Может у меня какието настройки стоят специальные?
И ещё хотел спросить функцию htmlspecialchars() надо использовать до или после записи в БД?
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.