Вход • Регистрация

Как получить значения из таблицы БД

  • 08 июня, суббота
  • Всех приветствую,
    Для статей есть список авторов с различными характеристиками, под идентификаторы страниц паторов создано поле 'autor' в таблице 'site'
    Для страниц статей получаю данные запросом
    Код

    $autor = DB::query_fetch_all("SELECT s.autor, c.name1 FROM {site} AS s INNER JOIN {clauses} AS c ON s.autor = c.id WHERE s.id=%d", $this->diafan->_site->id);


    Могу ли я получить данные определенного автора по его ID например на странице новости?

    Пробую в news.view.id.php вывести, но что то не выходит
    Код

    $autorID = 236;
    $autor = DB::query_fetch_all("SELECT autor, name1 FROM {site} AS s INNER JOIN {clauses} WHERE id='.$autorID.'");


    Не особо разбираюсь в БД, если что не сильно закидывайте кирпичами )))
  • 08 июня, суббота
  • Ну, наверное должен быть запрос такой, предположу:
    Код
    $autor = DB::query_fetch_all("SELECT s.autor, c.[name] FROM {site} AS s INNER JOIN {clauses} AS c WHERE id='.$autorID.'");
    • 08 июня, суббота
    • Нет, к сожалению, не получается, возвращает пустой массив
      • 08 июня, суббота
      • А можете скрин таблицы из БД скинуть? (чтобы шапку с названиями полей было видно)
  • 09 июня, воскресенье , редакция: 09 июня, воскресенье
  • Я так понимаю, что там завязка какая то с двумя таблицами.
    Из site похоже берется ID автора, потом из таблицы clauses берутся значения по ID
    Обращение к site можно получается пропустить, ведь ID у меня задается.
  • 09 июня, воскресенье
  • Что-то вы тут явно намудрили. Вы уверены в правильности совмещения запроса?
    Если у вас на определенной странице уже есть id автора, то огород городить нет смысла. Выцепляйте только то, что нужно об авторе.

    Код
    $autorID = 236;
    $autor= DB::query_result("SELECT name1 FROM {clauses} WHERE id='%h'", $autorID);


    Соответственно, после получения результата выводите, например, имя автора
    Код
    echo $autor;

    • 09 июня, воскресенье
    • Спасибо, вроде работает.
      А если несколько полей за один запрос получить надо, то правильно понимаю должно быть чтото типа этого?
      Код

      $autor= DB::query_result("SELECT name1, keywords1 FROM {clauses} WHERE id='%h'", $autorID);
      print_r($autor); //выводим массив
  • 09 июня, воскресенье
  • Цитата
    Не особо разбираюсь в БД, если что не сильно закидывайте кирпичами )))

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

    Дмитрий, не путайте как раз ещё методы обращения к БД и получаемые результаты ;)

    Киньте глаз на документацию https://www.diafan.ru/dokument/full-manual/developers/includes/database/
    Где начинается:

    DB::query_result () - просто запрос и просто ответ в одну переменную, как его БД отдаст, обычно, когда нужно просто получить быстрый, точный конкретный результат при LIMIT 1, например, получить id или name
    DB::query_fetch_array () - это будет уже массив, где поля БД - индексы массива, когда надо получить строку из БД
    DB::query_fetch_all () - это будет двумерный массив, где будет куча строк из БД на первом уровне порядковые номера строк от 0,1,2,3 и пр, а в каждом элементе уже вторая вложенность с индексами из названия полей БД
    DB::query_range_fetch_all - то же самое, что выше, но не все, а можно указывать range, типа limit 100, 100

    Цитата
    $autor= DB::query_result("SELECT name1, keywords1 FROM {clauses} WHERE id='%h'", $autorID);

    То есть, не DB::query_result ;))))
  • 09 июня, воскресенье , редакция: 09 июня, воскресенье
  • Дальше! Вот так не надо:
    Код
    $autor = DB::query_fetch_all("SELECT autor, name1 FROM {site} AS s INNER JOIN {clauses} WHERE id='.$autorID.'");

    Всегда указывайте маску (%s, %d, %h, %fи пр.) и выносите переменную за скобки. Так Вы от sqlinjection застрахуетесь, система за Вас всю фильтрацию сделает )
    Как у Александры
    Код
    $autor= DB::query_result("SELECT name1 FROM {clauses} WHERE id='%h'", $autorID);

    НО! Александра, зачем маска %h? ))
    %h - это для текстовых переменных без HTML, то есть, чтобы в передаваемой в запрос строковой переменной почистились всякие теги, если они есть. Эту маску нужно использовать, когда передается строка и там не было ничего кроме символов и цифр.
    Код
    DB::query_result("SELECT id FROM {clauses} WHERE name='%h'", $autorNAME);
    - например в таком запросе да, надо %H
    А если у нас заведомо числовая переменная и числовое поле БД, то надо маску %d - digit, цифры

    Код
    $autor= DB::query_result("SELECT name1 FROM {clauses} WHERE id='%d'", $autorID);
    - вот так, тут кроме цифр ничего не пролезет

    И ещё момент!
    Поле name1 - здесь 1- это номер языковой версии для переводимого поля.
    Если на сайте два языка, в таблице будет name1 и name2 в БД.
    Если 3, будет name1, name2, name3 и т.д.
    Мы же не будем отбирать каждый раз name1 или name3 для каждой версии?
    Поэтому в запросах переводимые поля можно запрашивать просто в квадратных скобках: [name] и система автоматически подставит 1 (или иной индекс текущего языка в системе)

    То есть, итого:
    Код
    $autor= DB::query_result("SELECT [name] FROM {clauses} WHERE id='%d'", $autorID);
    • 09 июня, воскресенье
    • Руководствовалась этим
      Цитата
      %d – число,
      %s – строка,
      %h – строка без HTML кода,
      %% – символ %,
      %f – число с плавающей точкой,
      %b – файлы

      и т.к. мне недавно нужно было %h, то влепила это.

      [name] - с этим тоже согласна, но, априори, у меня один язык))
      Собственно, решение рабочее, а далее каждый под себя может подстроить.
      • 10 июня, понедельник
      • Рабочее-то рабочее, но фен-шуй лучше не злить ))
  • 13 июня, четверг
  • Отлично, спасибо огромное, получил +100500 инфы )))
    Буду изучать и пробовать.

Новости

  • 18 июня, вторник
  • В сборке большое обновление demo-шаблона, дополнительная защита от спама, улучшение YML-импорта и еще много важного и интересного.
  • 24 апреля
  • В новой сборке совершили революцию в структурировании кастомизированной информации в шаблонах, добавили авторегистрацию пользователей, усовершенствовали защиту от спама, актуализировали накопительную скидку, а также улучшили производительность и стабильность работы системы.
  • 12 января
  • После выхода сборки 7.1 мы выпустили уже три патча, в каждом из которых улучшаем административную часть сайта. Сборка DIAFAN.CMS 7.1.3 уже доступна к установке. 

Форум