LINUX.ORG.RU

Простой поиск на PHP в БД POSTGRESQL

 , ,


1

1

Ох и закидают меня сейчас тухлыми томатами за вопрос про пиху, но я к этому морально подготовился…=)

В общем изучая этот «прекрасный» ЯП в паре со SQL, а именно с постгрёй, хочу разобраться как реализовывается поиск. Пока что простой. Вот пример БД

testdb=# SELECT * FROM users ORDER BY id;
 id | id_birthday | surname  |  name    | cash 
----+-------------+----------+----------+------
  1 |        1604 | Иванов   | Иван     |   12
  2 |         502 | Петрова  | Евлампия |    5
  3 |        3112 | Головач  | Елена    |    9
(3 rows)

Вот кусок индексного файла

<body>
  <p>
    <h3>Введите свою дату рождения</h3>
    <form action="index.php" method="post">
      <input type="search" name="search">
      <button type="submit" name="submit" value="search">Найти</button>
    </form>
  </p>
  
  <!-- Вывод всех пользователей для понимания что в БД вообще есть -->
  <table border="2">
    <thead>
      <tr>
        <th>id</th>
        <th>Фамилия</th>
        <th>Имя</th>
        <th>Денег в кармане</th>
      </tr>
    </thead>
    <tbody>
      <?php include 'conndb.php';
        $sql = 'SELECT * FROM users';
        $query = pg_query($conndb, $sql);
        while ($result = pg_fetch_array($query)) {
          echo "
            <tr>
              <td>{$result['id_birthday']}</td>
              <td>{$result['surname']}</td>
              <td>{$result['name']}</td>
              <td>{$result['cash']}</td>
            </tr>";
        }
      ?>
    </tbody>
  </table>
  <!-- Конец вывод всех пользователей -->
</body>

В самом верху html-форма, в которой необходимо ввести искомое. Поиск хочу сделать по дате рождения (id_birthday). Перелопатив гугл, везде в основном поиск реализуется на мускуле либо на марии. С ПГ очень мало материала. Подскажите как реализовать задуманное.
P.S> буду благодарен за актуальные материалы «без воды» для изучения PG + PHP

Перемещено Dimez из development


Сделай отдельные поля где можно вводить дату, одно поле поиска это неудобно, и тогда:

$sQuerySelect = "SELECT * FROM `users` WHERE 1=1"
$sQueryFilter = "";
$sQueryOrder = "ORDER BY `users`.`id`";

if (!empty($_GET['birthday'])) {
  $sBirthdaySql = date('Y-m-d H:i:s', strtotime($_GET['birthday'])); 
  $sQueryFilter .= " AND `users`.`birthday` = '$sBirthdaySql'";
}

if (!empty($_GET['user_id'])) {
  $idUserSql = (int)$_GET['user_id'];
  $sQueryFilter .= " AND `users`.`id` = $idUserSql";
}

$rsQuery = pg_query($conndb, "$sQuerySelect $sQueryFilter $sQueryOrder");

Если ты все же хочешь одно поле поиска для всего, то мне подсказать трудно, не имел дела с PostgreSQL, но вроде бы оно делается так:

if (!empty($_GET['search'])) {
  $sSearchSql = pg_escape_string($dbconn, $_GET['search']);
  $sQueryFilter .= " 
    AND to_tsvector(
      `users`.`name` || `users`.`surname` || `users`.`birthday`
    ) @@ to_tsquery('$sSearchSql')
  ";
}

Я думаю информации по MySQL намного больше, может тебе сначала поизучать PHP+MySQL, а потом когда станут понятны базовые операции, перейти к PG?

Ну и лучше сначала проверить твои запросы без PHP, а потом уже программировать. Для MySQL есть удобный phpmyadmin.

MOPKOBKA ★★★★
()
Последнее исправление: MOPKOBKA (всего исправлений: 6)

Вместо echo

while ($result = pg_fetch_array($query)) {
          echo "
            <tr>
              <td>{$result['id_birthday']}</td>
              <td>{$result['surname']}</td>
              <td>{$result['name']}</td>
              <td>{$result['cash']}</td>
            </tr>";
        }
Используй встроенные возможности шаблонизации
<?php while ($result = pg_fetch_array($query)): ?>
  <tr>
    <td><?= $result['id_birthday'] ?></td>
    <td><?= $result['surname'] ?></td>
    <td><?= $result['name'] ?></td>
    <td><?= $result['cash'] ?></td>
  </tr>
<?php endwhile; ?>
И желательно обернуть выводимые значения в https://www.php.net/manual/en/function.htmlspecialchars.php

Вместо include используй require.

MOPKOBKA ★★★★
()
Последнее исправление: MOPKOBKA (всего исправлений: 1)
Ответ на: комментарий от MOPKOBKA

может тебе сначала поизучать PHP+MySQL

Это как раз практически всё понятно (во всяком случае базово). Даже написал свой миниблог (НЕ (!)реклама) с нуля в sublime’е, без всяких фреймворков. Без стыда его могу отнести к говносайту полным уязвимостей, но тем не менее я понимаю принцип, синтаксис и это больше как шпаргалка для себя. Почему хочу встать на путь изучения PG…? Видимо потому, что отношу себя к перфекционическому IT-задрoту, который стремится знать всё в этой сфере.

В общем за совет огромное спасибо! Обязательно попробую. Еже-ли получится, отпишусь…=)

А книжки я тут нагуглил. Может где внутри меня сидит DBA-шник и хочет вырваться наружу…=)

Shprot
() автор топика
Последнее исправление: Shprot (всего исправлений: 1)

буду благодарен за актуальные материалы «без воды» для изучения PG

Официальный мануал уже прочитал?

theNamelessOne ★★★★★
()
Ответ на: комментарий от MOPKOBKA

Это сарказм такой? Я конечно понимаю, что в современных пхп притащили много мусора из всяких джав и лучше объяснять новичкам как на это не вестись, но не до пхп2-пхп3 же версию опускать.

firkax ★★★★★
()
Ответ на: комментарий от MOPKOBKA

Вставка переменных через <?= да и вообще множественное чередование пхп/непхп в одном файле - это из времён пхп2/3. Туда же и endwhile.

Вариант с echo, на который ты отвечал, выглядит куда лучше и приятнее.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от firkax

Не знаю почему ты думаешь что шаблонизация костылями через echo лучше чем встроенная, которая специально под это делалась. Через встроенную всегда легко вставить условия, циклы, нету проблем с аттрибутами html которые используют тот же знак скобки что и строки, работает подсветка и формитирование в редакторе.

MOPKOBKA ★★★★
()
Ответ на: комментарий от firkax

Вставка переменных через <?= да и вообще множественное чередование пхп/непхп в одном файле - это из времён пхп2/3. Туда же и endwhile.

Исходя из php.net - это альтернативный синтаксис управляющих структур, который кстати ввели с 4-ой версии (>пхп2/3) и доступен он в 8-ой. Я ни где не вижу статуса деприкейтед. Может я на начальном этапе изучения пихи неправильно скажу, но как по мне (ИМХО), использовать

while ($var):
  <html>
  <?=php;?>
  <html>
endwhile;

читабельнее, чем

while ($var) {
  echo "
    html
    php
    html";
  }

Как всегда готов к критике и поправьте меня, если я не прав.

Shprot
() автор топика
Ответ на: комментарий от Shprot

Там и про оператор if написано php 4 - подозреваю что про более старые версии просто не пишут.

Ну да, оно формально не deprecated и не удалено из пхп8, но это конструкция из древних времён, когда пхп действительно был шаблонизатором. На мой взгляд ей стоило повесить депрекейт ещё во времена 5.х.

Насчёт читабельнее - нет, не читабельнее, и зачем ты пхп код в echo выводишь? Ещё форматирование испорченное. Правильно так:

while($var) {
  echo "html\n";
  php();
  echo "html\n";
}

или даже так

$out = '';
while($var) {
  $out.="html\n";
  $out.=php();
  $out.="html\n";
}
echo $out;
Потому что часто имеет смысл отделять генерацию html-кода он её отправки в вывод.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от MOPKOBKA

Это не костыли через echo, а нормальный вывод текста. А так называемая «встроенная» делалась в 90-е годы для древних версий пхп, которые сами по себе ужасны и я бы не рекомендовал их использовать никому. Нормальный синтаксис у пхп оформился к 4 версии.

Через встроенную всегда легко вставить условия, циклы,

Нормальный код это не html с вставленными циклами (кто так пишет - постоянно устраивает sql инъекции и прочую гадость), а в первую очередь именно алгоритм работы, в который уже местами вставлен html.

нету проблем с аттрибутами html которые используют тот же знак скобки что и строки

Используй разные. А ещё есть heredoc без кавычек.

firkax ★★★★★
()
Ответ на: комментарий от firkax

Потому что часто имеет смысл отделять генерацию html-кода он её отправки в вывод.

Это делается через ob_* функции, а не ручные костылянием, где легко что то упустить, и надо постоянно куда то что то прокидывать.

MOPKOBKA ★★★★
()
Последнее исправление: MOPKOBKA (всего исправлений: 1)
Ответ на: комментарий от firkax

Нормальный код это не html с вставленными циклами (кто так пишет - постоянно устраивает sql инъекции и прочую гадость), а в первую очередь именно алгоритм работы, в который уже местами вставлен html.

Все нормальные проекты используют шаблонизаторы, в них не надо следить за тем куда ты выводишь текст, экранировать кавычки, по нескольким функциям разбрасывать элемент списка постов в блоге.

Твое предложение, либо как раз проповедует либо

1) смешанные файлы с sql-инъекциями, где ты одновременно в цикле получаешь данные из запроса, и тут же генерируешь текст

2) либо создание лишнего шага { получение данных -> генерация спискового шаблона -> вывод шаблона с подставленными шаблонами }

Я предлагаю вполне стандартный подход, ты получаешь данные, преобразовываешь их, и потом передаешь шаблону, где есть только html с циклами, условиями, и выводом значений, какой то логики там быть не должно. Тоже что было в Perl, есть в Golang, Java, но я предлагаю не брать сторонние шаблонизаторы, потому что PHP и сам хороший шаблонизатор. Смотреть какая функция в каком году появилась не вижу смысла, переменные там тоже давно, ты же не отказываешь от них.

Используй разные. А ещё есть heredoc без кавычек.

Лишние действия, потом еще переключать кавычки если в тексте ', а в тегах ", нужно следить куда выводишь. В каких то случаях это может понадобится, но лучше не вводить сложную логику в шаблоны, с какими то скреплениями переменных и прочим.

Шаблоны, это то что я предлагаю https://laravel.com/docs/11.x/blade

Считаю что мой вариант лучше, потому что

1. Он более краткий, меньше буков писать, больше буков = больше ошибок, при этом в наглядности он не теряет, а наоборот выигрывает

2. Меньше возможностей ошибиться, сделать echo вместо записи в переменную, или пропустить точку и сделать $output = «text» вместо $output .= «text»

3. Мой подход распространен и используется в передовых фреймворках, новых языках, набирающих популярность генераторах статических сайтов, даже в мире JS например в svelte

MOPKOBKA ★★★★
()
Последнее исправление: MOPKOBKA (всего исправлений: 4)

Перелопатив гугл, везде в основном поиск реализуется на мускуле либо на марии.

Открой мануал пострги. Прочитай его. А еще лучше открой учебник по реляционным базам данных и прочитай его. После того, как ты будешь обладать знаниями о том как делаются элементарные выборки, таких вопросов возникать не будет.

crutch_master ★★★★★
()

id | id_birthday | surname | name | cash

Ты всё не так понял. Тебе не нужна отдельная таблица для дней рождения. ДР - это атомарное константное значение, его не надо выводить в отдельную таблицу. Какой в этом смысл? Ты собрался менять куче человек ДР по ключу?
Вот с другой стороны поле cash. Что будет с наличкой если ты похерешь апдейтом значение поля? Чел что-то купил, cash уменьшился на 20. Чел тебе пишет и говорит, я не хотел это покупать, отмените покупку.
Или вот поле surname. Головач Лена не хочет, чтобы над ней всю жизнь кекали и когда-нибудь станет Ивановой. А Евлампия когда-нибудь съедет от своих поехавших родителей выйдет замуж станет какой-нибудь Гойночук Ксенией. И как ты будешь искать их по старым именам и фамилиям? А что будет с твоими ПД, когда они утекут? А они обязательно утекут. ПД должны быть зашифрованы.
База данных - это основа. Тут думать надо, как это всё будет жить.

crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 2)
Ответ на: комментарий от crutch_master

Как называть постгрю значения не имеет.

Ну тогда падакольник, кепчук, кинопластырь, калидор и т.п. в принципе можно говорить. Люди же понимают. Какая разница как называть

А что будет с твоими ПД, когда они утекут?

Блин, чувак. Это проект просто в период обучения PHP+SQL. На самом деле я развернул на VPS в Амстердаме сервис обхода блокировок (да не увидит это сообщение РКН) сперва для супруги (инста) и себя (всё остальное), Но так как ресурсов там более, чем достаточно, сервис стал доступен за скромную плату (да не увидит это сообщение ФНС) другим пользователям. На данный момент, на той же VPS’ке, я хочу сделать веб с формой поиска, где идентификация будет по дате рождения. Пользователь вводит свою д/р и видит по какой месяц у него оплачено

Shprot
() автор топика
Ответ на: комментарий от Shprot

я html в отдельных файлах храню $shab=file_get_contents('страшная-понуха.html'), а потом str_replace('%id_birthday%',$result['id_birthday'],$shab) в вашем случае всё упрощается

$shab=file_get_contents('страшная-понуха.html');
while ($result = pg_fetch_array($query)) {
    $tmp=$shab;
    foreach ($result as $key => $value) {
        $tmp=str_replace("%$key%",$value,$tmp);
    }
    echo($tmp);
}
только в страшная-понуха.html прописать %id_birthday% в нужных местах, кода меньше, ошибок меньше, править шаблоны проще

s-warus ★★★
()
Последнее исправление: s-warus (всего исправлений: 2)
Ответ на: комментарий от s-warus

Так это из коробки есть в php, ничего заменять не надо, пример:

template.php

...
<div class="user">
  <span>Birthday:</span> <?= $result['birthday'] ?>
</div>
...

code.php

<?php
while ($result = pg_fetch_array($query)) {
  require 'template.php';
}

Но правильнее так,

$templateData = [];
...
while ($post = pg_fetch_array($queryPost)) {
  $templateData['post'][] = $post;
}
...

while ($users = pg_fetch_array($queryUsers)) {
  $templateData['user'][] = $user;
}
...
еще какой то код, и потом полный шаблон страницы, где могут быть подключены еще шаблоны, и они используют только $templateData
...
require 'template.php';

MOPKOBKA ★★★★
()
Последнее исправление: MOPKOBKA (всего исправлений: 1)
Ответ на: комментарий от Shprot

Ну тогда падакольник, кепчук, кинопластырь, калидор и т.п. в принципе можно говорить.

Ты работаешь с деньгами нихрена не умея в бд. Тебя должны волновать ситуации что будет, когда деньги до тебя не дойдут, будучи уплачены, когда клиент ошибётся двумя нулями и захочет возврат и еще куча разных ненормальных ситуаций, а не всё вот это. Найдётся какая-нибудь вечно всем недовольная мразь и ФНС про тебя узнает гарантированно вместе с остальными надзорными органами. А тут у тебя и ПД хранятся на сервере где-то за бугром и бд не сертифицирована, и вообще всё не так. А тебя волнует то как кто-то называет постгрю, лол.

crutch_master ★★★★★
()
Ответ на: комментарий от Shprot

Пользователь вводит свою д/р и видит по какой месяц у него оплачено

Посчитай вероятность того, что у двух человек из 20 др в один день.

crutch_master ★★★★★
()
Ответ на: комментарий от crutch_master

Посчитай вероятность того, что у двух человек из 20 др в один день.

Ты сейчас уже просто как астрологический овен к запятым придираешься. Я наверно не стану вычислять и расписывать тут теорию вероятности, только скажу, что момент с двумя одинаковыми днюхами учтён. Буду умнее, промолчу в дальнейшем.

P.S> есле ниважна каг назэвадь весчи роботоя с диньгами, то можна и фшколи ниучица. тибяжы фсёровно панемают

Shprot
() автор топика
Ответ на: комментарий от Shprot

Что за дичь ты устроил? Забанься срочно и меняй ник, от позора уже не отмоешься.

firkax ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.