вот то, что я начирикал, но это не работает, может кто-нить объяснит почему. PHP: <? if (!isset($_GET["id"])){ $DB = conn(); $sql = "select * from `news` where `id`='$id'" ; $result = mysql_query($sql); if (!$result) { echo "ошибка вывода!" . mysql_error(); exit; } while ($row = mysql_fetch_assoc($result)) { extract($row); include(TPL_PATH.'news.tpl'); } mysql_free_result($result); $sql = "select * from `news_comment` where `id_news`='$id'" ; $result = mysql_query($sql); if (!$result) { echo "ошибка вывода!" . mysql_error(); exit; } while ($row = mysql_fetch_assoc($result)) { extract($row); include(TPL_PATH.'news.tpl'); } mysql_free_result($result); $DB = close(); } ?>
Kreker, в большинстве своем простейшие блоги/форумы хранят посты в 1 таблице со структурой: id parent_id ( равно 0 если это первый пост в ветке) date, comment_value,autor и тд и выборка идет простая: - на странице форума выбираются все где "родитель" 0 - на странице темы выбирается строка темы + все строки где "родитель" равен id строки темы и работает это быстро не забывайте про существование индексов Про выше описаную идею... ))) Такая схема практически (а то и полностью) убивает приемущества СУБД и делает негибким монипулирование данными. Oizo, в чем у вас сейчас ступор?
окей, давайте я вам приблизительную логику напишу, а вы реализуете само приложение Код (Text): подключаемся к БД if(isset($_GET['id'] && inval($_GET['id'])>0) // выбрана новость которую показать с комментами { выбрать новость, выбрать комментарии, заполнить и показать страницу }else // не выбрана новость - показать список новостей { выбрать новости, заполнить и показать страницу } закрыть подключение к БД
Горбунов Олег Согласен БД я вообще плохо знаю. Ganzal Спасибо, убедил. Как организовать знал, но смущался из-за незнаний Уже хотел с бд работать, как с текстовыми файлами :lol:
и еще пару раз: не забывайте про существование индексов !! не забывайте про существование индексов !! не забывайте про существование индексов !! не забывайте про существование индексов !! Думаю, намек понятен? )
вам все же лучше почитать про реляционные БД ))) праймари кей это уникальный идентификаток картежа (строки в таблице) по нему индекс делается автоматом
Почитал в инструкции. Набросал вот что: [sql]//Создание таблиц CREATE TABLE `items` ( `id` INT UNSIGNED NULL AUTO_INCREMENT, `text` TEXT NOT NULL, PRIMARY_KEY(`id`)); CREATE TABLE `comments` ( `id` INT UNSIGNED NULL AUTO_INCREMENT, `id_item` INT UNSIGNED NOT NULL, `text` TINYTEXT NOT NULL, PRIMARY_KEY(`id`), INDEX parent(`id_item`)); //Выборка SELECT items.* FROM `items` LEFT JOIN `comments` ON items.id=comments.id_item WHERE items.id = '2' [/sql] Подскажите, правильно понял? И вопрос, почему при items.id не нужно брать названия таблиц/столбцов в обратные кавычки?
придирка))) комментарии в SQL начинаются с минус-минуса )))[sql]-- флуд1 -- флуд2. а в следующей строке запрос select * from me;[/sql] по поводу вами предложенной структуры - вы правильно поняли ))) про обратные кавычки мало что могу дельного сказать. я их использую постоянно (приучили), во всем запросе...
Спасибо огромное. Жалко виртуальное пиво нельзя выдавать P.S. Ко мне можно и на "ты", я уже полгода на форуме с вами , а то непривычно как-то.
тут сложно однозначно ответить. Вообще, в документации написано, что в кавычки _надо_ заключать значения, совпадающие со значением ключевых слов или имен функций, остальные _можно_ заключать.
наверное поэтому я к большинству на "Вы", но с некоторыми (например с ГО) уже не хочется быть вежливым и образованным в хорошем смысле... про пиво... с тобой можно и реального испить даже просто потому, что ты ближе обитаешь, чем ГО (зы. ГО не платит мне за упоминание его имени) встречал как-то раз на собтственном примере. использовал в таблице для поля с описанием слово desc. так все нормально пока сервак на хосте не рухнул а залить они его обратно не могли, потому что их бекаперы не расставляли кавычек при выгрузке в общем трудно однозначно ответить... я _ставлю_ кавычки и НЕ использую имена совпадающие с ключевыми или функциями
PHP: <? $DB = conn(); if(isset($_GET['id']) && inval($_GET['id'])>0); { $sql = "select * from news where `id`='$id'"; $result = mysql_query($sql); if (!$result) { echo "ошибка вывода!" . mysql_error(); exit; } while ($row = mysql_fetch_assoc($result)) { extract($row); include(TPL_PATH.'news.tpl'); } mysql_free_result($result); $sql = "select * from `news_comment` where `id_news`='$id'" ; $result = mysql_query($sql); if (!$result) { echo "ошибка вывода!" . mysql_error(); exit; } while ($row = mysql_fetch_assoc($result)) { extract($row); include(TPL_PATH.'comment.tpl'); } mysql_free_result($result); } else { $sql = "select * from news ORDER BY id DESC LIMIT 2"; $result = mysql_query($sql); if (!$result) { echo "ошибка вывода!" . mysql_error(); exit; } while ($row = mysql_fetch_assoc($result)) { extract($row); include(TPL_PATH.'news.tpl'); } mysql_free_result($result); } $DB = close(); ?> чёт с комментами совсем не получается....
Код (Text): if(isset($_GET['id']) && inval($_GET['id'])>0); ну вот, я ошибку сделал а вы перепечатали intval() думаю если бы был включен нужный уровень ошибок - вы бы узнали что inval не существует пока пишите - пускай выводятся ВСЕ возможные ошибки (или чаще смотрите логи апача) когда допишите - поставьте уровень предупреждений какой хотите
Странно, но подобный запрос возвращает мне подобный массив: item[0] {item_text => "Текст 1", comment_text => "Комментарий 1"} item[1] {item_text => "Текст 1", comment_text => "Комментарий 2"} item[2] {item_text => "Текст 1", comment_text => "Комментарий 3"} item[2] {item_text => "Текст 1", comment_text => "Комментарий 4"} Это нормально или mysql, помимо текста комментария, каждый раз выбирает и текст статьи?
mysql видимо внимательно следит, не Kreker ли с ним общается, и по результату смотрит что ему выбирать. Выбирает оно то, что указано в запросе, в данном случае
Эту строку я стырил со своего поста, что выше. Когда пробовал в действительности (а это удалил), mysql выбирала 1 статью и все комменты к ней, но массив получался странный (см. выше), то есть в каждом подмассиве первым элементом был текст статьи, а вторым - текст поста. Вот и вопрос. БД выбирает 1 раз текст статьи или столько же раз, сколько и комментов? И зачем каждый раз текст забивается в массив? А если статья в десять тысяч знаков и комментов под 100. Получается, что у меня массив такой здоровый будет?
1) нарисуй на бумажке структуру своей базы. 2) переименуй названия полей в разных таблицах, чтобы не совпадали - так удобнее и меньше ошибок налепишь. 3) осознай, что именно ты получаешь своим запросом (только после пункта 2).
что предложите чтоб новости выводились в обратном порядке, с последней новости? Нашел вот такой код, но он у меня почему-то не работает: PHP: <?php $link = mysql_pconnect("localhost", "mysql_user", "mysql_password") or die("Could not connect: " . mysql_error()); mysql_select_db("samp_db") or die("Could not select database: " . mysql_error()); $query = "SELECT last_name, first_name FROM friends"; $result = mysql_query($query) or die("Query failed: " . mysql_error()); /* получение рядов в обратном порядке */ for ($i = mysql_num_rows($result) - 1; $i >= 0; $i--) { if (!mysql_data_seek($result, $i)) { echo "Cannot seek to row $i: " . mysql_error() . "\n"; continue; } if(!($row = mysql_fetch_object($result))) continue; echo "$row->last_name $row->first_name<br />\n"; } mysql_free_result($result); ?>