Войти

Показать полную графическую версию : phpmysql.


Страниц : 1 [2]

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'];
}

slaine
10-06-2005, 11:41
Салют всем.

Помогите разобратся.

у меня две таблицы(к примеру):

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 использовать в запросе-вставке

slaine
10-06-2005, 15:07
Спасибо.
ещё хотел спросить, как сделать, чтобы COUNT(*) показывал
пользвателей(t1.name) = 0, у которых t2.mess пусто, ато он их просто
игнорирует.

vadimiron
10-06-2005, 19:34
как сделать, чтобы COUNT(*) показывал пользвателей(t1.name) = 0, у которых t2.mess пусто
Сори, я не очень понял: если mess пуст, то зачем добавлять подобную запись в таблицу сообщений??

slaine
10-06-2005, 20:50
Да я не про таблицу сообщений, ну её.

Я имел ввиду подсчитать сколько собщений сделал юзер, например:

юзер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 - текст сообщения.
Конечно, в таблице сущности "сообщения" могут быть иные поля.

slaine
11-06-2005, 17:09
Спасибою,
Ноя всё хочу добится того, чтоб если у '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.

slaine
11-06-2005, 19:08
Это число нужно будет просто каждый раз при добавлении нового сообщения инкрементировать

А, как оно будет инкрементировать для каждого пользователя в отдельности ?
Не могли бы вы мне показать кусочек такой таблицы?

vadimiron
11-06-2005, 21:27
А, как оно будет инкрементировать для каждого пользователя в отдельности ?
Не могли бы вы мне показать кусочек такой таблицы?
При добавлении нового сообщения вытаскиваем значение "количество сообщений" добавляющего юзера (естественно из таблицы "Юзеры"), потом количество сообщений=количество сообщений+1, и далее записываем это значение вместо сторого (то есть UPDATE)

slaine
12-06-2005, 15:07
Спасибо за идею, а то я зациклился на COUNТ()-е.
Всё замечательно работает!

slaine
05-07-2005, 00:22
Скажите, почему здесь нет слэшей перед кавычками?

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
Внутри открывающей и закрывающей кавычек одного рода (двойные) можно использовать сколь угодно большое число кавычек второго рода (одинарные).

slaine
05-07-2005, 11:52
Я имел ввиду, когда я ввоже данные типа asd"asd"fasf" на выходе нет слэшей перед
кавычками. Ведь там стоит addslashes, а stipslashes я специально убрал.

vadimiron
05-07-2005, 13:02
а так идёт??
mysql_query("insert into r1 values ('addslashes($user)')");

archy
05-07-2005, 13:08
Потому что слеш нужен для правильной передачи параметров, во время записи они убираются, вот если сделать echo addslashes($user); то слеши будут. Читайте мануалы внимательней.

slaine
05-07-2005, 16:22
Vadimironв таком виде мне выдают как строку.

ArchyПри использовании функции Addslashes() строка будет сохранена в базе данных
с символами косой черты. При получении строки нужно не забыть удалить символы
косой чертыю Это можно сделать функцией Stripslashes().

Я пробовал так с текстовыми БД слэши остаются, а с MySQL нету, почему? мне очень интересно.
magic_quotes_gps - off.

И ещё если я ставлю перед записью в MySQL символ '<', то после него вообще он ничего не
воспринимает, незаписывает. Теги у меня не фильтруются вообще.

Может у меня какието настройки стоят специальные?

И ещё хотел спросить функцию htmlspecialchars() надо использовать до или после записи в БД?

slaine
06-07-2005, 16:50
Всё спасибо разобрался!




© OSzone.net 2001-2012