За последние 24 часа нас посетили 22596 программистов и 1278 роботов. Сейчас ищут 737 программистов ...

Можно ли как-то запросить данные из БД в БД

Тема в разделе "MySQL", создана пользователем Булат Азат улы, 16 сен 2018.

  1. Булат Азат улы

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

    С нами с:
    31 авг 2017
    Сообщения:
    61
    Симпатии:
    6
    Адрес:
    Республика Татарстан, город Казань
    Всех приветствую! Скажите пожалуйста, можно ли как-то в строках БД каким-то кодом запросить еще другую информацию из БД?
    Например, в поле с типом данных "TEXT" имеется некий текст. И где-то в середине этого текста нужно вставить, допустим, другое значение, допустим, с типом "VARCHAR".
    Как в такой ситуации поступить? Можно как-то внутри текста вставить другие данные из БД?
    (Например, [TEXT]...[Команда, которая берет данные из БД]...[TEXT])
     
  2. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @Булат Азат улы, если сильно захотеть - можно в космос улететь. Вы бы лучше подробнее описали ситуацию, указали место поконкретнее куда надо вставить, а главное ответили на вопрос каким образом материализовалась данная задача, что вас привело к умозаключению, что сделать нужно именно то, что вы просите.
     
    #2 Valick, 16 сен 2018
    Последнее редактирование: 16 сен 2018
  3. Булат Азат улы

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

    С нами с:
    31 авг 2017
    Сообщения:
    61
    Симпатии:
    6
    Адрес:
    Республика Татарстан, город Казань
    @Valick, у меня в базе есть текстовые поля. Там хранятся некоторые страницы сайта целиком (точнее, то, что внутри тегов <body>). И среди этого текста есть некоторые названия (слово или словосочетания), которые со временем могут меняться. А именно - название ВУЗа (так сложилось, что полное наименование ВУЗа часто меняют). И для того, чтобы после очередного изменения названия не лезть во все текстовые поля, искать там названия ВУЗа и менять его, думаю, было бы легче создать поле и прописать туда наименование ВУЗа - сокращенное и полное, и уже в текстовых полях в БД вставлять вместо имени ВУЗа значение из нужного поля.
     
  4. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    Расставляйте в тексте свои шорт-тэги и перед выводом заменяйте их на актуальные значения.
    --- Добавлено ---
    Также есть eval, но это небезопасно.
     
  5. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    Если по-простому:
    PHP:
    1. <div id="body">
    2. <?php printf($page['content'],$vuz) ?>
    3.  
    4. </div>
    В $page['content'] строки с кодами вроде %s, %1$s и т.п.
    --- Добавлено ---
    Только не забудьте экранировать обычный символ процента в содержимом текстовых полей.
     
  6. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    именно отсюда и растут ноги вашей проблемы, переписывать сайт я так понимаю никто не собирается, тогда дальше только "на костылях". Костыли вам предложили постом выше.
     
  7. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    @Valick, о чем вы? Такая подмена бывает иногда востребована. Ну конечно не во всем содержимом тега body, но мне кажется, это был условный пример.
     
  8. Булат Азат улы

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

    С нами с:
    31 авг 2017
    Сообщения:
    61
    Симпатии:
    6
    Адрес:
    Республика Татарстан, город Казань
    @Valick, сайт-то я и делал. А почему это костыли? Как правильно надо делать сайты?
    Я-то отдельно по значениям выводил только страницы ввиде списка (например, список преподавателей - с помощью foreach, по одному выбирая данные из БД), или таблицы расписания занятий. А если не повторяющийся текст (например, страница с контактами - сначала у меня идет код карты (2ГИС), потом телефоны, адресы и т.п...) - почему и как его делить, когда сохраняю их в БД?
    --- Добавлено ---
    @miketomlin, это я не совсем понял? Что такое "%s, %1$s"? Вместо них нельзя использовать обычные условные названия, пипа как "name", "fullName"?
     
  9. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    По одному не надо, нужно предварительно выбирать весь список (одним запросом).

    Посмотрите описание printf. Именованные параметры там не поддерживаются, но поддерживаются нумерованные, как я показал во втором коде.

    Сразу видно, что вы никогда не писали на Си :)
     
  10. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    хороший вопрос
    к примеру хранить в формате XML
     
  11. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    Та же фигня, вид сбоку.
    --- Добавлено ---
    Пускай сначала на кошках потренируется.
    --- Добавлено ---
    Я там описался. После подправил исходное сообщение.
     
  12. Булат Азат улы

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

    С нами с:
    31 авг 2017
    Сообщения:
    61
    Симпатии:
    6
    Адрес:
    Республика Татарстан, город Казань
    @miketomlin, я неправильно написал - да, я выбираю весь список.
    Код (Text):
    1. $db->query("SELECT text1, text2 FROM table1");
    И потом уже, с помощью foreach вставляю строки.
    @Valick, в XML хранить так же, полностью <body>? А почему именно XML? Почему неправильно хранить в БД (как у меня сейчас)? Ну, или, в файле формата TXT?
    А? Чё? :eek:
     
  13. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    Где хранить, он не писал. XML можно хранить и в БД ;)
    --- Добавлено ---
    Любитель животных что ли?

    ОК, респект. Можешь на неодушевленных предметах тренироваться :) Или на крайняк на себе :D
     
  14. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    PHP:
    1. <?php
    2. $text = "
    3. <contact>
    4.    <university>
    5.        <name>Какой-то универ...</name>
    6.        <description>
    7.        Блаблаблаблабла... самый лучший вуз
    8.        </description>
    9.        <phone name = 'rector'>322-223</phone>
    10.        <phone name = 'zavhoz'>223-322</phone>
    11.        <map name = 'yandex'> ... </map>
    12.        <map name = 'google'> ... </map>
    13.    </university>
    14. </contact>
    15. ";
    16.  
    17. $xml = new SimpleXMLElement($text);
    18. $xml->university->name = 'Бобруйский Университет';
    19.  
    20. echo nl2br($xml->asXML());
    примерный пример
     
  15. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    И он еще мои примеры костылями обзывает :)
    --- Добавлено ---
    Осталось для полного комплекта полет в космос прикрутить :D
     
  16. Булат Азат улы

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

    С нами с:
    31 авг 2017
    Сообщения:
    61
    Симпатии:
    6
    Адрес:
    Республика Татарстан, город Казань
    @miketomlin, как я понял - он посоветовал данные в <body> вывести в файл формата XML (в поддерживаемом XML виде). И потом уже через PHP это выводить. Я неправильно понял?
    А вообще, в чем смысл хранить это всё в XML?
    И как "научно" правильно-то будет выводить информацию, которая одна и не повторяется по странице (например, как сказал ранее, список преподавателей с информацией о них)?
    То есть, если на странице есть что-то повторяющееся по базе - я это с удовольствием использую:

    PHP:
    1. $resPrepod = $db->query("SELECT prepod_img, prepod_name, prepod_nameId, prepod_post, prepod_education, prepod_subjects FROM  prepods ORDER BY  prepod_poz");
    2. $dataPrepod = $resPrepod->fetchAll(PDO::FETCH_ASSOC);
    3. foreach($dataPrepod as $itemPrepod){
    4.     $bodyContent .= "<div id='".$itemPrepod['prepod_nameId']."' class='bContent'><p class='isemContent'>".$itemPrepod['prepod_name']."</p><img class='imgCenter' src='".SAIT."images/prep/".$itemPrepod['Prepod_img']."' width='110' height='140' alt='".$itemPrepod['prepod_name']."' title='".$itemPrepod['prepod_name']."'><p><span class='oName'>Должность: </span>".$itemPrepod['prepod_post']."</p><p><span class='oName'>Образование: </span></p><dl class='imgList'>".$itemPrepod['prepod_education']."</dl><p><span class='oName'>Предметы: </span></p><ul>".$itemPrepod['prepod_subjects']."</ul><div class='clear'></div></div>";
    5. }
    А если нет таких повторяющихся списков - то я сохраняю в текстовом формате весь контент <body> в БД в текстовом поле, со всеми тегами, и таким же образом вывожу на сайт, только уже без foreach.

    А как правильно-то сделать???
     
  17. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    Нормально. Только отделяйте работу с базой от вывода, даже если вывод делается не напрямую «в браузер».

    И вместо «$bodyContent .=» используйте обычные шаблоны и альт. синтаксис алг. конструкций.
     
  18. Булат Азат улы

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

    С нами с:
    31 авг 2017
    Сообщения:
    61
    Симпатии:
    6
    Адрес:
    Республика Татарстан, город Казань
    @miketomlin, то есть, лучше сначала все подобные "$itemPrepod['prepod_nameId']" по отдельности присваивать переменным, а потом уже записывать переменные?
    @miketomlin, это как-то вообще не понял. Какой альтернативный синтаксис? Что за алгоритмические конструкции? Что за обычные шаблоны?
     
  19. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    Нет. Работа с базой выполняется до начала вывода. Чтобы можно было направить выполнение по альт. пути, например в случае возникновения ошибки при работе с БД.

    PHP:
    1. <?php foreach($dataPrepod as $itemPrepod): ?>
    2.     <div id='<?= $itemPrepod['prepod_nameId'] ?>' class='bContent'>
    3.         <p class='isemContent'><?= $itemPrepod['prepod_name'] ?></p>
    4.         <img class='imgCenter' src='<?= SAIT,'images/prep/',$itemPrepod['Prepod_img'] ?>' width='110' height='140'>
    5.         <div class='clear'></div>
    6.     </div>
    7. <?php endforeach; ?>
    --- Добавлено ---
    Если есть риск, что в отдельных значениях могут быть апострофы, то можно их прогонять через спец. ф-цию представления.
    --- Добавлено ---
    Или например использовать более нативные для обрамления значений атрибутов кавычки (двойные), а значения хранить в закодированном в HTML виде (&quot; ) или опять-таки их прогонять через спец. ф-цию представления при выводе.
     
  20. Булат Азат улы

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

    С нами с:
    31 авг 2017
    Сообщения:
    61
    Симпатии:
    6
    Адрес:
    Республика Татарстан, город Казань
    @miketomlin, Аа... Это понял. Но так у меня не получится, так как HTML-код у меня находится ниже, чем код PHP:
    Код (Text):
    1. <?php
    2. require_once("config.php");
    3.  
    4. $head = "Шапка сайта";
    5. $nav = "Код навигации";
    6. $footer = "Футер";
    7.  
    8. switch($_SERVER["REQUEST_URI"]){
    9. case "/":
    10.     $titleName = "Заголовок страницы";
    11.     $description = "Текст";
    12.     $SNav = "Навигация (хлебные крошки)";
    13.     $bodyContent = "Начало контента <body>";
    14.    
    15.     $bodyContent .= "Тут добавления в эту переменную - всё то, что извлекается с базы";
    16. break;
    17. }
    18. ?>
    19.  
    20. <!DOCTYPE html>
    21. <html>
    22. <head>
    23.     <meta charset="utf-8">
    24.     <meta name = "viewport" content = "width=device-width, initial-scale=1">
    25.     <title><?= $titleName ?></title>
    26.     <meta name="description" content="<?= $description ?>" />
    27.     <link rel="shortcut icon" href="/images/icon.ico">
    28.     <link href="/css/style.css" type="text/css" rel="stylesheet" media="screen and (min-device-width: 480.01px)">
    29.     <link href="/css/styleMobile.css" type="text/css" rel="stylesheet" media="screen and (max-device-width: 480px)">
    30.     <script src="/js/jquery.js" type="text/javascript"></script>
    31.     <script src="/js/scripts.js" type="text/javascript"></script>
    32. </head>
    33. <body>
    34.     <div id="mineBlok">
    35.         <header><?= $head ?></header>
    36.         <nav id="nav"><?= $nav ?></nav>
    37.         <div id="centBlock">
    38.             <div id="sNav"><ul><?= $SNav ?></ul></div>
    39.             <?= $bodyContent ?>
    40.         </div>
    41.         <footer><?= $footer ?></footer>
    42.     </div>
    43. </body>
    44. </html>
    Как видно по коду, если бы я выводил данные прямо на месте - у меня бы они вышли даже выше, чем <!DOCTYPE html>.
     
  21. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    Так и должно быть. Вы можете частный шаблон подключить внутри общего по имени. Но еще лучше, если вы будете делать так, как описано в концовке этой статьи.

    При использовании БД не тяните фактические данные в код. На крайняк метаданные для всего сайта еще можно подключить из файла, но конкретных страниц – нет!
    --- Добавлено ---
    PHP:
    1. if ($data=have_data()) {
    2.     set_template($data['template']);
    3. } else {
    4.     // установить шаблон и данные страницы ошибки
    5.     error(503);
    6. }
    7. ...
    8. <div id="body">
    9. <?php require(THEME.get_template().'.php'); ?>
    10.  
    11. </div>
     
    #21 miketomlin, 16 сен 2018
    Последнее редактирование: 16 сен 2018
  22. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    Что тут вообще происходит, господа?
    1) Зачем хранить статику в БД, а не в файлах, которые потом можно инклудить?
    2) Зачем собирать страницу на лету в БД, а не на стороне PHP, из фрагментов, подставляя нужные данные?
    3) Почему бы не хранить в БД только динамически меняемые данные?

    Есть вероятность, что автор слишком загнался и напилил себе сам проблем.
     
  23. Булат Азат улы

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

    С нами с:
    31 авг 2017
    Сообщения:
    61
    Симпатии:
    6
    Адрес:
    Республика Татарстан, город Казань
    @Fell-x27,
    1) а вот объясните пожалуйста - почему лучше хранить статику не в БД, а в файлах (например, посоветовали в коде XML)?
    2) так я-то, вроде, в PHP и собираю... Или я что-то не так понимаю?
    3) это, как я понял, продолжение первого пункта... Ну почему неправильно хранить в базе статику? Так разве не лучше? Например, для поиска по сайту?

    Как я понимаю, это азы сайтостроения, которые надо бы знать до начала программирования. Программировать умею, а вот что как и где правильно разместить - этого я умею не очень... Может, есть какие-то видеокурсы или другая инфо в доступном языке, которые вы знаете?
     
  24. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    Фиг знает, о чем он. Может, имеется в виду шапка, подвал и т.п. Или что «Контакты» – типа не шаблонная страница, поэтому можно понавтыкать контент в шаблон, оставив в нем окошки только для того, что часто меняется.
    --- Добавлено ---
    П. 2 – это, видимо, реакция на ваш «странный вопрос» из стартового поста.
    --- Добавлено ---
    Иногда уместно вместо шорт-кодов делать так:
    PHP:
    1. <?= $page['field1'] ?><div><?= $vuz ?></div><?= $page['field2'] ?>
    Значение $vuz тоже может быть выбрано из БД.
    --- Добавлено ---
    Кстати, не понятно, зачем вы шапку, навигацию и футер выносите в отдельные переменные. Чтобы их не выполнять в шаблоне? В таком случае можно прямо в шаблоне понавтыкать <?php readfile(THEME.'widgets/static/header.html'); ?> и т.п.
    --- Добавлено ---
    Хотя это может быть чревато «видимыми задержками» при выводе напрямую в браузер. Можно делать так:
    PHP:
    1. <?php $header=file_get_contents(THEME.'widgets/static/header.html'); ?>
    2. <!DOCTYPE html>
    3. ...
     
  25. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    В БД мы храним структурированные данные. Макет страницы таковыми данными не является. Ценности не имеет, полезной нагрузки не несет. Если привести пример из жизни - это как рамка для фотографии. В случае чего, должна быть возможность легко ее заменить, она не должна быть частью фотографии, она не является частью композиции. По этому макет храним отдельно, в виде файлов, которые удобно править здесь и сейчас. А данные храним в БД, без лишнего мусора, чтобы как раз, было удобно искать.

    Из вашего поста:
    Можно сделать вывод, что вы страницу целиком из БД тянете и потом отдаете клиенту, вместо того, чтобы из БД взять только название ВУЗа и подставить его в макет страницы.

    Нет, не лучше. Посчитайте, сколько символов от содержимого body, которое у вас лежит в БД, занимают названия университетов? Переведите в проценты. Вот этот процент - то, насколько эффективно вы используете БД. Какой поиск вы упрощаете таким образом, к слову? Далее, как ни банально, но страница тупо больше весит, чем пара слов. Неоптимальное использование дискового пространства. Мб дело в скорости? Нет, она не будет высокой.

    Быть может вы пытались сделать кэш? В таком случае, опять же, лучше тоже использовать файлы. Как минимум, потому что их можно бесплатно раздавать через nginx, не тревожа пхп-машину/апач. У вас ведь стоит nginx на входе? Если нет, поставьте.

    Не нравятся файлы? Окей, есть всякие редисы и прочие noSQL-решения, сделанные для хранения кэша в оперативке. Это тоже очень быстро и весело.

    Но вот именно БД для кэширования - плохая идея.