За последние 24 часа нас посетили 5908 программистов и 554 робота. Сейчас ищут 258 программистов ...

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

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

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

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

    Valick Новичок

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

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

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

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

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

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

    Valick Новичок

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

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

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

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

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

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

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

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

    Valick Новичок

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

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

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

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

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

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

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

    Valick Новичок

    С нами с:
    12 авг 2018
    Сообщения:
    398
    Симпатии:
    81
    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
    Сообщения:
    933
    Симпатии:
    132
    И он еще мои примеры костылями обзывает :)
    --- Добавлено ---
    Осталось для полного комплекта полет в космос прикрутить :D
     
  16. Булат Азат улы

    С нами с:
    31 авг 2017
    Сообщения:
    45
    Симпатии:
    2
    @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
    Сообщения:
    933
    Симпатии:
    132
    Нормально. Только отделяйте работу с базой от вывода, даже если вывод делается не напрямую «в браузер».

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

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

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

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

    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
    Сообщения:
    45
    Симпатии:
    2
    @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
    Сообщения:
    933
    Симпатии:
    132
    Так и должно быть. Вы можете частный шаблон подключить внутри общего по имени. Но еще лучше, если вы будете делать так, как описано в концовке этой статьи.

    При использовании БД не тяните фактические данные в код. На крайняк метаданные для всего сайта еще можно подключить из файла, но конкретных страниц – нет!
    --- Добавлено ---
    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
    Сообщения:
    11.983
    Симпатии:
    1.709
    Адрес:
    :сердА
    Что тут вообще происходит, господа?
    1) Зачем хранить статику в БД, а не в файлах, которые потом можно инклудить?
    2) Зачем собирать страницу на лету в БД, а не на стороне PHP, из фрагментов, подставляя нужные данные?
    3) Почему бы не хранить в БД только динамически меняемые данные?

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

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

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

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

    С нами с:
    9 авг 2016
    Сообщения:
    933
    Симпатии:
    132
    Фиг знает, о чем он. Может, имеется в виду шапка, подвал и т.п. Или что «Контакты» – типа не шаблонная страница, поэтому можно понавтыкать контент в шаблон, оставив в нем окошки только для того, что часто меняется.
    --- Добавлено ---
    П. 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
    Сообщения:
    11.983
    Симпатии:
    1.709
    Адрес:
    :сердА
    В БД мы храним структурированные данные. Макет страницы таковыми данными не является. Ценности не имеет, полезной нагрузки не несет. Если привести пример из жизни - это как рамка для фотографии. В случае чего, должна быть возможность легко ее заменить, она не должна быть частью фотографии, она не является частью композиции. По этому макет храним отдельно, в виде файлов, которые удобно править здесь и сейчас. А данные храним в БД, без лишнего мусора, чтобы как раз, было удобно искать.

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

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

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

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

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