За последние 24 часа нас посетили 20940 программистов и 1014 роботов. Сейчас ищут 410 программистов ...

Новостная лента

Тема в разделе "Вопросы от блондинок", создана пользователем Oizo, 25 окт 2007.

  1. Anonymous

    Anonymous Guest

    Вот такие вопросы возникают от непонимания принципов работы реляционной СУБД.
     
  2. Oizo

    Oizo Активный пользователь

    С нами с:
    29 июн 2007
    Сообщения:
    47
    Симпатии:
    0
    Адрес:
    Откуда; Откуда, Откуда. Откуда! Откуда?
    ну а всё же хотелось бы увидеть примерчик как реализовать хотя бы то, что я задумал... спасибо.
     
  3. Oizo

    Oizo Активный пользователь

    С нами с:
    29 июн 2007
    Сообщения:
    47
    Симпатии:
    0
    Адрес:
    Откуда; Откуда, Откуда. Откуда! Откуда?
    вот то, что я начирикал, но это не работает, может кто-нить объяснит почему.
    PHP:
    1.  
    2. <?
    3. if (!isset($_GET["id"])){
    4. $DB = conn();
    5. $sql = "select * from `news` where `id`='$id'" ;
    6.  
    7.     $result = mysql_query($sql);
    8.    
    9.     if (!$result) {
    10.         echo "ошибка вывода!" . mysql_error();
    11.         exit;
    12.     }
    13.    
    14.     while ($row = mysql_fetch_assoc($result)) {    
    15.     extract($row);
    16.     include(TPL_PATH.'news.tpl');
    17.    
    18.             }
    19.        
    20.    mysql_free_result($result);
    21.  
    22.    
    23.    $sql = "select * from `news_comment` where `id_news`='$id'" ;
    24.  
    25.     $result = mysql_query($sql);
    26.    
    27.     if (!$result) {
    28.         echo "ошибка вывода!" . mysql_error();
    29.         exit;
    30.     }
    31.    
    32.     while ($row = mysql_fetch_assoc($result)) {    
    33.     extract($row);
    34.     include(TPL_PATH.'news.tpl');
    35.    
    36.             }
    37.        
    38.    mysql_free_result($result);
    39.    $DB = close();
    40. }
    41.    ?>
     
  4. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    Kreker, в большинстве своем простейшие блоги/форумы хранят посты в 1 таблице со структурой:
    id
    parent_id ( равно 0 если это первый пост в ветке)
    date, comment_value,autor и тд

    и выборка идет простая:
    - на странице форума выбираются все где "родитель" 0
    - на странице темы выбирается строка темы + все строки где "родитель" равен id строки темы
    и работает это быстро
    не забывайте про существование индексов ;)
    Про выше описаную идею... )))
    Такая схема практически (а то и полностью) убивает приемущества СУБД и делает негибким монипулирование данными.

    Oizo, в чем у вас сейчас ступор?
     
  5. Oizo

    Oizo Активный пользователь

    С нами с:
    29 июн 2007
    Сообщения:
    47
    Симпатии:
    0
    Адрес:
    Откуда; Откуда, Откуда. Откуда! Откуда?
    стопорю в том, что не представляю. как это сделать....
     
  6. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    окей, давайте я вам приблизительную логику напишу, а вы реализуете само приложение
    Код (Text):
    1. подключаемся к БД
    2. if(isset($_GET['id'] && inval($_GET['id'])>0) // выбрана новость которую показать с комментами
    3. {
    4.    выбрать новость, выбрать комментарии, заполнить и показать страницу
    5. }else // не выбрана новость - показать список новостей
    6. {
    7.   выбрать новости, заполнить и показать страницу
    8. }
    9. закрыть подключение к БД
     
  7. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Горбунов Олег
    Согласен :( БД я вообще плохо знаю.

    Ganzal
    Спасибо, убедил. Как организовать знал, но смущался из-за незнаний :) Уже хотел с бд работать, как с текстовыми файлами :lol:
     
  8. Anonymous

    Anonymous Guest

    и еще пару раз:

    не забывайте про существование индексов !!
    не забывайте про существование индексов !!
    не забывайте про существование индексов !!
    не забывайте про существование индексов !!

    Думаю, намек понятен? )
     
  9. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Primary key(`parent_id`) ? :oops:
     
  10. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    вам все же лучше почитать про реляционные БД )))
    праймари кей это уникальный идентификаток картежа (строки в таблице)
    по нему индекс делается автоматом
     
  11. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Почитал в инструкции. Набросал вот что:
    [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 не нужно брать названия таблиц/столбцов в обратные кавычки?
     
  12. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    придирка))) комментарии в SQL начинаются с минус-минуса )))[sql]-- флуд1
    -- флуд2. а в следующей строке запрос
    select * from me;[/sql]
    по поводу вами предложенной структуры - вы правильно поняли )))
    про обратные кавычки мало что могу дельного сказать. я их использую постоянно (приучили), во всем запросе...
     
  13. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Спасибо огромное. Жалко виртуальное пиво нельзя выдавать :)
    P.S. Ко мне можно и на "ты", я уже полгода на форуме с вами :), а то непривычно как-то.
     
  14. Anonymous

    Anonymous Guest

    тут сложно однозначно ответить.
    Вообще, в документации написано, что в кавычки _надо_ заключать значения, совпадающие со значением ключевых слов или имен функций, остальные _можно_ заключать.
     
  15. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    наверное поэтому я к большинству на "Вы", но с некоторыми (например с ГО) уже не хочется быть вежливым и образованным ;) в хорошем смысле... ;)
    про пиво... с тобой можно и реального испить даже просто потому, что ты ближе обитаешь, чем ГО
    (зы. ГО не платит мне за упоминание его имени)

    встречал как-то раз на собтственном примере. использовал в таблице для поля с описанием слово desc. так все нормально пока сервак на хосте не рухнул
    а залить они его обратно не могли, потому что их бекаперы не расставляли кавычек при выгрузке
    в общем трудно однозначно ответить... я _ставлю_ кавычки и НЕ использую имена совпадающие с ключевыми или функциями
     
  16. Anonymous

    Anonymous Guest

    Правильно. В 4 утра пристаешь с вопросами про итераторы. ) И думаешь, без пива обойдешься?
     
  17. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    Ой, а у тебя было 4 утра? Сорри )))
     
  18. Oizo

    Oizo Активный пользователь

    С нами с:
    29 июн 2007
    Сообщения:
    47
    Симпатии:
    0
    Адрес:
    Откуда; Откуда, Откуда. Откуда! Откуда?
    PHP:
    1. <?
    2. $DB = conn();
    3. if(isset($_GET['id']) && inval($_GET['id'])>0);
    4. {
    5. $sql = "select * from news where `id`='$id'";
    6.  
    7.     $result = mysql_query($sql);
    8.    
    9.     if (!$result) {
    10.         echo "ошибка вывода!" . mysql_error();
    11.         exit;
    12.     }
    13.    
    14.     while ($row = mysql_fetch_assoc($result)) {    
    15.     extract($row);
    16.     include(TPL_PATH.'news.tpl');
    17.    
    18.             }
    19.     mysql_free_result($result);
    20.        
    21.  $sql = "select * from `news_comment` where `id_news`='$id'" ;
    22.  
    23.     $result = mysql_query($sql);
    24.    
    25.     if (!$result) {
    26.         echo "ошибка вывода!" . mysql_error();
    27.         exit;
    28.     }
    29.    
    30.     while ($row = mysql_fetch_assoc($result)) {    
    31.     extract($row);
    32.     include(TPL_PATH.'comment.tpl');
    33.    
    34.             }  mysql_free_result($result);
    35. }
    36. else {
    37.  
    38.     $sql = "select * from news ORDER BY id DESC LIMIT 2";
    39.  
    40.     $result = mysql_query($sql);
    41.    
    42.     if (!$result) {
    43.         echo "ошибка вывода!" . mysql_error();
    44.         exit;
    45.     }
    46.    
    47.     while ($row = mysql_fetch_assoc($result)) {    
    48.     extract($row);
    49.     include(TPL_PATH.'news.tpl');
    50.    
    51.             }
    52.  
    53. }
    54.    $DB = close();
    55.  
    56. ?>
    57.  
    чёт с комментами совсем не получается....
     
  19. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    Код (Text):
    1. if(isset($_GET['id']) && inval($_GET['id'])>0);
    ну вот, я ошибку сделал а вы перепечатали
    intval()
    думаю если бы был включен нужный уровень ошибок - вы бы узнали что inval не существует
    пока пишите - пускай выводятся ВСЕ возможные ошибки (или чаще смотрите логи апача)
    когда допишите - поставьте уровень предупреждений какой хотите
     
  20. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Странно, но подобный запрос возвращает мне подобный массив:
    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, помимо текста комментария, каждый раз выбирает и текст статьи?
     
  21. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    mysql видимо внимательно следит, не Kreker ли с ним общается, и по результату смотрит что ему выбирать.
    Выбирает оно то, что указано в запросе, в данном случае
     
  22. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Эту строку я стырил со своего поста, что выше. Когда пробовал в действительности (а это удалил), mysql выбирала 1 статью и все комменты к ней, но массив получался странный (см. выше), то есть в каждом подмассиве первым элементом был текст статьи, а вторым - текст поста.
    Вот и вопрос. БД выбирает 1 раз текст статьи или столько же раз, сколько и комментов? И зачем каждый раз текст забивается в массив? А если статья в десять тысяч знаков и комментов под 100. Получается, что у меня массив такой здоровый будет?
     
  23. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    1) нарисуй на бумажке структуру своей базы.
    2) переименуй названия полей в разных таблицах, чтобы не совпадали - так удобнее и меньше ошибок налепишь.
    3) осознай, что именно ты получаешь своим запросом (только после пункта 2).
     
  24. G_Rom_S

    G_Rom_S Активный пользователь

    С нами с:
    23 авг 2007
    Сообщения:
    6
    Симпатии:
    0
    что предложите чтоб новости выводились в обратном порядке, с последней новости?
    Нашел вот такой код, но он у меня почему-то не работает:
    PHP:
    1.  
    2. <?php
    3.    $link = mysql_pconnect("localhost", "mysql_user", "mysql_password")
    4.        or die("Could not connect: " . mysql_error());
    5.  
    6.    mysql_select_db("samp_db")
    7.        or die("Could not select database: " . mysql_error());
    8.  
    9.    $query = "SELECT last_name, first_name FROM friends";
    10.    $result = mysql_query($query)
    11.        or die("Query failed: " . mysql_error());
    12.  
    13.    /* получение рядов в обратном порядке */
    14.    for ($i = mysql_num_rows($result) - 1; $i >= 0; $i--) {
    15.        if (!mysql_data_seek($result, $i)) {
    16.            echo "Cannot seek to row $i: " . mysql_error() . "\n";
    17.            continue;
    18.        }
    19.  
    20.        if(!($row = mysql_fetch_object($result)))
    21.            continue;
    22.  
    23.        echo "$row->last_name $row->first_name<br />\n";
    24.    }
    25.  
    26.    mysql_free_result($result);
    27. ?>
    28.  
     
  25. Elkaz

    Elkaz Старожил
    Команда форума Модератор

    С нами с:
    26 июн 2006
    Сообщения:
    3.373
    Симпатии:
    0
    Адрес:
    Баку, Азербайджан
    [sql]SELECT last_name, first_name FROM friends ORDER by id DESC[/sql]