[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Насколько рационален код?
ancient mariner
Здрасьте. SQL я пока знаю неважно, в ближайшее время планирую подтянуть.
Тренирую все изученные навыки и хочу объединить их вместе, сделав собственный скрипт гостевой книги. Так вот, есть 2 таблицы, user и posts.

user - здесь имена зарегистрированных пользователей
Цитата
id date login password


posts - здесь посты
Цитата
  id date user (id юзера, добавившего запись) text


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

Знаю, что циклы - вообще довольно ресурсоёбкая вещь, поэтому вопрос: можно ли как-то улучшить данный код?

Так-то всё работает, но кривость данного кода как-то мучает smile.gif


//выбрали все данные из таблицы с записями
$sql = "SELECT * FROM `posts` order by `date`";
$result = mysql_query($sql) or die(mysql_error());

//рисуем табличку
$table = "<table border='0' cellcpacing='1' bgcolor='#000000' cellpadding='0' align='center' width='50%'";

//вот здесь главный момент. На каждом шаге цикла производится запрос в
//таблицу user на выборку логина.


while ($row = mysql_fetch_assoc($result))
{
$login_select = mysql_query ("
select `login` from `user` where id = '"
.$row['user']."'
"
) or die (mysql_error());

$res1 = mysql_result($login_select, 0);

$table .= "<tr bgcolor=\"#B7D0DF\" height='100px'>\n";
$table .= "<td bgcolor=\"#BFDDF2\" width='100px'>
Добавил:<br /> "
.$res1." </td>\n";
$table .= "<td width='70px'> Дата: ".$row['date']."</td>\n";
$table .= "<td width='400px'>".$row['text']."</td>\n";

$table .= "</tr>\n";
}

$table .= "</table>\n";

echo $table;




Спустя 1 час, 57 минут, 57 секунд (9.03.2010 - 19:09) FatCat написал(а):
Лучше в один запрос по связанным таблицам.
Как-то так примерно:
$query = "SELECT u.*, p.* FROM user u 
LEFT JOIN posts p ON(u.id=p.user)
WHERE u.id = "
.intval($_GET['user_id']);

По запросу получим и всю информацию о юзере, и все его сообщения.

Спустя 5 часов, 51 минута, 19 секунд (10.03.2010 - 01:00) netruxa написал(а):
ну да тут либо связанную табличку делать, либо можно перед самым запросом в массив user загнать все имена зарегиных пользователей ($user[1]='admin' и тд) и после при выводе гостевой, не обращаться лишний раз к БД, а просто вызывать массив $user

Спустя 36 минут, 40 секунд (10.03.2010 - 01:37) FatCat написал(а):
Цитата (netruxa @ 10.03.2010 - 02:00)
в массив user загнать все имена зарегиных пользователей

Для чата именно так и сделал у себя. Но тогда обязательно должна быть очистка базы от давно не заходивших пользователей.
Для форума такой подход не годится. При числе юзеров в базе больше 600-700 запрос по проиндексированному полю будет работать быстрее, чем обращение к элементу массива php - цифры получил эмпирическим путем под денвером на домашнем ноутбуке; на других конфигурациях серверов цифры могут быть другими.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.