Получение данных из БД

← К списку тем

Подскажите пожалуйста как получить данные из бд и вывести их в бота?
Скриншот: https://ibb.co/1XSj03s
Есть таблица mytable а в ней Столбцы name и surname (имя и фамилия).
По запросу в боте Имени он бы выдавал Фамилию.
Пишем боту к примеру: Вадим а он в ответ: Петров. Пишем Иван в ответ Кротков.
Если можно пример.
Спасибо большое за помощь,вы супер.
Davidsoft 13.05.2020 в 20:10

Авторизуйтесь через Telegram, чтобы ответить.
Откройте бот @SiteAuthBot, нажмите кнопку Старт/Start. Следуйте инструкциям бота.


Ответы

  • Попробуйте вот этот код.

    Не тестировал.

    &lt;?php<br />
    header("HTTP/1.1 200 OK");<br />
    header('Content-type: text/html; charset=utf-8');<br />
    <br />
    new Bot();<br />
    <br />
    class Bot<br />
    {<br />
        private $token = "ВАШ_ТОКЕН";<br />
    <br />
        private $host = 'localhost';<br />
        private $db = '';<br />
        private $user = '';<br />
        private $pass = '';<br />
        private $charset = 'utf8mb4';<br />
    <br />
        private $pdo;<br />
    <br />
        public function __construct()<br />
        {<br />
            $this->setPdo();<br />
            $this->router(json_decode(file_get_contents('php://input')));<br />
            return true;<br />
        }<br />
    <br />
        private function router($data)<br />
        {<br />
            if (isset($data->message->text)) {<br />
                if ($data->message->text == "/start") {<br />
                    $this->sendMessage($data->message->chat->id, "Пришлите имя пользователя");<br />
                } else { <br />
                    $select = $this->pdo->prepare("SELECT * FROM mytable WHERE name = :name LIMIT 1");<br />
                    $select->execute(['name' => $data->message->text]);<br />
                    if ($select->rowCount() === 0) {<br />
                        $this->sendMessage($data->message->chat->id, "По запросу =" . $data->message->text . "= данных нет");<br />
                    } else {<br />
                        $item = $select->fetch();<br />
                        $this->sendMessage($data->message->chat->id, $data->message->text . " - " . $item['surname']);<br />
                    }<br />
                }<br />
            } else { <br />
                $this->sendMessage($data->message->chat->id, "Wrong data");<br />
            }<br />
            return true;<br />
        }<br />
    <br />
        private function sendMessage($user_id, $text)<br />
        {<br />
            $data_send = [<br />
                'chat_id' => $user_id,<br />
                'text' => $text,<br />
                'parse_mode' => 'html'<br />
            ];<br />
            return $this->botApiQuery("sendMessage", $data_send);<br />
        }<br />
    <br />
        private function setPdo()<br />
        {<br />
            $dsn = "mysql:host=$this->host;dbname=$this->db;charset=$this->charset";<br />
            $opt = [<br />
                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,<br />
                PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,<br />
                PDO::ATTR_EMULATE_PREPARES => false,<br />
                PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci"<br />
            ];<br />
            $this->pdo = new PDO($dsn, $this->user, $this->pass, $opt);<br />
        }<br />
    <br />
        private function botApiQuery($method, $fields = array())<br />
        {<br />
            $ch = curl_init('https://api.telegram.org/bot' . $this->token . '/' . $method);<br />
            curl_setopt_array($ch, array(<br />
                CURLOPT_POST => count($fields),<br />
                CURLOPT_POSTFIELDS => http_build_query($fields),<br />
                CURLOPT_SSL_VERIFYPEER => 0,<br />
                CURLOPT_RETURNTRANSFER => 1,<br />
                CURLOPT_TIMEOUT => 10<br />
            ));<br />
            $r = json_decode(curl_exec($ch), true);<br />
            curl_close($ch);<br />
            return $r;<br />
        }<br />
    }<br />
    ?&gt;
    iMakeBots 14.05.2020 в 14:52
    • Всё работает.СПАСИБО
      Davidsoft 14.05.2020 в 18:31
    • А в место фамилии можно файл передать?
      Davidsoft 14.05.2020 в 18:58
      • Конечно. Используйте метод апи Telegram sendDocument
        iMakeBots 14.05.2020 в 19:01
        • а где в примере прописать?
          Davidsoft 14.05.2020 в 19:17
        • на sendDocument не реагирует.Хочу ссылку на видео передать вместо фамилии.
          ссылка: https://t.me/fullfilmsnavecher/222
          Davidsoft 14.05.2020 в 22:47
          • https://t.me/fullfilmsnavecher/222 -> это ссылка на пост в канале - она как ссылка на файл не будет валидной

            $this-&gt;sendMessage($data-&gt;message-&gt;chat-&gt;id, $data-&gt;message-&gt;text . &quot; - &quot; . $item['surname']);

            Замените на
            $this-&gt;botApiQuery(&quot;sendMessage&quot;, ['chat_id' =&gt; $data-&gt;message-&gt;chat-&gt;id, 'file' =&gt; 'ССЫЛКА на ФАЙЛ']);
            iMakeBots 16.05.2020 в 08:24
            • тоже молчит бот
              Davidsoft 16.05.2020 в 08:55
            • не проснулся еще)))) Допустил неточность

              sendMessage замените на sendDocument
              iMakeBots 16.05.2020 в 08:58
            • так стоит $this->botApiQuery("sendDocument", ['chat_id' => $data->message->chat->id, 'file' => 'https://сайт/file/Logo.mp4']);
              Davidsoft 16.05.2020 в 09:01
            • Размер файла?
              iMakeBots 16.05.2020 в 09:02
            • 768 КБ
              Davidsoft 16.05.2020 в 09:03
            • так из базы пробовал $this->botApiQuery("sendDocument", ['chat_id' => $data->message->chat->id, 'file' => $item['surname']]);
              тихо
              Davidsoft 16.05.2020 в 09:05
            • Спасибо ещё раз. Надо было вместо 'file' => написать 'document' => и всё заработало
              Davidsoft 16.05.2020 в 11:50
            • Ещё возник вопрос. Как сделать комментарий к файлу?
              Davidsoft 16.05.2020 в 11:51
            • Укажите доп параметр caption
              iMakeBots 16.05.2020 в 11:52
            • Спасибо.
              Выводит так: https://ibb.co/c3HzBm5
              Davidsoft 16.05.2020 в 12:19
    • А как вывести несколько данных?
      К примеру есть несколько фильмов в базе с одинаковым названием.
      Davidsoft 16.05.2020 в 18:10
      • $select = $this-&gt;pdo-&gt;prepare(&quot;SELECT * FROM mytable WHERE name = :name&quot;);<br />
        $select-&gt;execute(['name' =&gt; $data-&gt;message-&gt;text]);<br />
        f ($select-&gt;rowCount() === 0) {<br />
            $this-&gt;sendMessage($data-&gt;message-&gt;chat-&gt;id, &quot;По запросу =&quot; . $data-&gt;message-&gt;text . &quot;= данных нет&quot;);<br />
        } else {<br />
            while ($row = $select-&gt;fetch()) {<br />
                $this-&gt;sendMessage($data-&gt;message-&gt;chat-&gt;id, $data-&gt;message-&gt;text . &quot; - &quot; . $row['surname']);<br />
            }<br />
        }
        iMakeBots 18.05.2020 в 09:25
        • Один результат выдаёт.
          И так один: SELECT * FROM mytable WHERE name LIKE :name
          Davidsoft 18.05.2020 в 12:22
        • Приведите пример данных в бд
          iMakeBots 18.05.2020 в 12:48
          • https://ibb.co/jTBwKvR
            Davidsoft 18.05.2020 в 13:01
          • Покажите ваш код
            iMakeBots 18.05.2020 в 13:17
            • if (isset($data->message->text)) {
              if ($data->message->text == "/start") {

              $this->sendMessage($data->message->chat->id, "Приветствую!nПришлите мне название фильма.(Без ошибок)");

              } else {

              $select = $this->pdo->prepare("SELECT * FROM mytable WHERE name = :name");

              $select->execute(['name' => $data->message->text]);
              if ($select->rowCount() === 0) {
              $this->sendMessage($data->message->chat->id, "По запросу =<b>" . $data->message->text . "</b>= данных нет,возможно написано с ошибкой.");
              } else {
              $item = $select->fetch();
              $this->botApiQuery("sendDocument", ['chat_id' => $data->message->chat->id, 'document' => $item['link'] ,'caption' => "<b>".$data->message->text." - (".$item['year'].")</b> rnИщите ваши любимые фильмы",'parse_mode' => 'html']);
              }
              }
              } else {
              $this->sendMessage($data->message->chat->id, "Wrong data");
              }
              return true;
              }
              Davidsoft 18.05.2020 в 13:20
            • Обратите внимание на пример кода который я привел выше - вы не используете цикл while
              iMakeBots 18.05.2020 в 13:22
            • спасибо. всё отлично.
              Davidsoft 18.05.2020 в 13:44
            • Я уже наверно вам надоел :-)
              Если конечно у вас есть время,интересует ещё один вопрос.
              Как добавить ещё вывод похожих названий?
              К примеру есть название: Полёт на луну или просто Полёт.
              Или: Крепкий орешек 1,Крепкий орешек 2,Крепкий орешек 3
              Davidsoft 18.05.2020 в 14:05
            • Если не будете использовать полнотекстовый поиск, тогда просто используйте оператор LIKE

              ... LIKE concat('%',:title,'%') ...
              iMakeBots 18.05.2020 в 14:07
        • Спасибо всё отлично.
          Если можно ещё спрошу?
          Можно вывести данные в кнопки,с кнопкой далее и назад.(Это не критично).
          Пример:
          https://ibb.co/bN2QDgb
          https://ibb.co/jfnhhG7
          И вообще как в скрипте добавить кнопки ReplyKeyboardMarkup что-то пытался на ваших примерах,не выходит.
          Спасибо.
          Davidsoft 23.05.2020 в 18:32
          • Кнопки Вперед<=>Назад - это по типу постраничной навигации, для этого можно использовать параметры LIMIT в запросах к MySQL - первым параметром передавайте начало вторым количество:

            LIMIT 0, 10 - значит вывести первые 10 шт записей попадающие под условия запроса - 0 - 9 записи,
            LIMIT 10, 10 - это типа 2 страница то есть следующие 10 записей начиная c 10-й записи, 10 - 19 записи

            Примеры кнопок, которые вы привели это InlineKeyboardMarkup.
            iMakeBots 23.05.2020 в 18:56
            • Лимит добавил на 20 а вот как в кнопки вывести незнаю,ещё и кнопок хотелось добавить ReplyKeyboardMarkup
              Davidsoft 23.05.2020 в 19:00
            • Примеры в статье очень наглядные - попробуйте.

              iMakeBots 23.05.2020 в 19:02
            • именно в этот пример можно добавить ReplyKeyboardMarkup?
              уже всё перепробовал.
              Davidsoft 25.05.2020 в 15:12
            • &lt;?php<br />
              header("HTTP/1.1 200 OK");<br />
              header('Content-type: text/html; charset=utf-8');<br />
              <br />
              new Bot();<br />
              <br />
              class Bot<br />
              {<br />
                  private $token = "ВАШ_ТОКЕН";<br />
              <br />
                  private $host = 'localhost';<br />
                  private $db = '';<br />
                  private $user = '';<br />
                  private $pass = '';<br />
                  private $charset = 'utf8mb4';<br />
              <br />
                  private $pdo;<br />
              <br />
                  public function __construct()<br />
                  {<br />
                      $this->setPdo();<br />
                      $this->router(json_decode(file_get_contents('php://input')));<br />
                      return true;<br />
                  }<br />
              <br />
                  private function router($data)<br />
                  {<br />
                      if (isset($data->message->text)) {<br />
                          if ($data->message->text == "/start") {<br />
                              $this->sendMessageWithButtons($data->message->chat->id, "Пришлите имя пользователя + еще выводим кнопки");<br />
                          } else { <br />
                              $select = $this->pdo->prepare("SELECT * FROM mytable WHERE name = :name LIMIT 1");<br />
                              $select->execute(['name' => $data->message->text]);<br />
                              if ($select->rowCount() === 0) {<br />
                                  $this->sendMessage($data->message->chat->id, "По запросу =" . $data->message->text . "= данных нет");<br />
                              } else {<br />
                                  $item = $select->fetch();<br />
                                  $this->sendMessage($data->message->chat->id, $data->message->text . " - " . $item['surname']);<br />
                              }<br />
                          }<br />
                      } else { <br />
                          $this->sendMessage($data->message->chat->id, "Wrong data");<br />
                      }<br />
                      return true;<br />
                  }<br />
              <br />
                  private function sendMessage($user_id, $text)<br />
                  {<br />
                      $data_send = [<br />
                          'chat_id' => $user_id,<br />
                          'text' => $text,<br />
                          'parse_mode' => 'html'<br />
                      ];<br />
                      return $this->botApiQuery("sendMessage", $data_send);<br />
                  }<br />
              <br />
                  private function sendMessageWithButtons($user_id, $text, $buttons)<br />
                  {<br />
                      $data_send = [<br />
                          'chat_id' => $user_id,<br />
                          'text' => $text,<br />
                          "reply_markup" => $this->getButtons(),<br />
                          'parse_mode' => 'html'<br />
                      ];<br />
                      return $this->botApiQuery("sendMessage", $data_send);<br />
                  }<br />
              <br />
                  private function getButtons() {<br />
                      $buttons = json_encode([<br />
                         "keyboard" => [<br />
                              [<br />
                                  [<br />
                                      // текст кнопки<br />
                                      "text" => "Button 1",<br />
                                      // необязательное поле: в значении true при нажатии на кнопку будет передан телефон<br />
                                      "request_contact" => false,<br />
                                      // необязательное поле: в значении true будет передано месторасположение<br />
                                      "request_location" => false,<br />
                                      // request_location и request_contact - взаимоисключающие значения<br />
                                  ],<br />
                                  [<br />
                                      "text" => "Button 2",<br />
                                  ]<br />
                              ]<br />
                          ],<br />
                          // в значении true после нажатия на любую кнопку клавиатура будет скрыта,<br />
                          // вызвать обратно можно по нажатию спец иконки в интерфейсе приложения Телеграм<br />
                          'one_time_keyboard' => false,<br />
                          // в случае false клавиатура всегда имеет ту же высоту, что и стандартная клавиатура приложения.<br />
                          'resize_keyboard' => true,<br />
                          // показывать клавиатуру только пользователю который ее вызвал, удобно для групп<br />
                          'selective' => true,<br />
                      ], true);<br />
              <br />
                      return $buttons;<br />
                  }<br />
              <br />
                  private function setPdo()<br />
                  {<br />
                      $dsn = "mysql:host=$this->host;dbname=$this->db;charset=$this->charset";<br />
                      $opt = [<br />
                          PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,<br />
                          PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,<br />
                          PDO::ATTR_EMULATE_PREPARES => false,<br />
                          PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci"<br />
                      ];<br />
                      $this->pdo = new PDO($dsn, $this->user, $this->pass, $opt);<br />
                  }<br />
              <br />
                  private function botApiQuery($method, $fields = array())<br />
                  {<br />
                      $ch = curl_init('https://api.telegram.org/bot' . $this->token . '/' . $method);<br />
                      curl_setopt_array($ch, array(<br />
                          CURLOPT_POST => count($fields),<br />
                          CURLOPT_POSTFIELDS => http_build_query($fields),<br />
                          CURLOPT_SSL_VERIFYPEER => 0,<br />
                          CURLOPT_RETURNTRANSFER => 1,<br />
                          CURLOPT_TIMEOUT => 10<br />
                      ));<br />
                      $r = json_decode(curl_exec($ch), true);<br />
                      curl_close($ch);<br />
                      return $r;<br />
                  }<br />
              }<br />
              ?&gt;
              iMakeBots 25.05.2020 в 15:19
          • увы не получается кнопки добавить.
            Davidsoft 24.05.2020 в 02:18
            • молчит бот.
              по моему из-за этой строки
              $this->sendMessageWithButtons($data->message->chat->id, "Пришлите имя пользователя еще выводим кнопки");
              Davidsoft 25.05.2020 в 15:44
            • Вы все методы добавили?
              iMakeBots 25.05.2020 в 15:46
            • private function sendMessage($user_id, $text)<br />
                  {<br />
                      $data_send = [<br />
                          'chat_id' =&gt; $user_id,<br />
                          'text' =&gt; $text,<br />
                          'parse_mode' =&gt; 'html'<br />
                      ];<br />
                      return $this-&gt;botApiQuery(&quot;sendMessage&quot;, $data_send);<br />
                  }<br />
              <br />
                  private function sendMessageWithButtons($user_id, $text, $buttons)<br />
                  {<br />
                      $data_send = [<br />
                          'chat_id' =&gt; $user_id,<br />
                          'text' =&gt; $text,<br />
                          &quot;reply_markup&quot; =&gt; $this-&gt;getButtons(),<br />
                          'parse_mode' =&gt; 'html'<br />
                      ];<br />
                      return $this-&gt;botApiQuery(&quot;sendMessage&quot;, $data_send);<br />
                  }<br />
              <br />
                  private function getButtons() {<br />
                      $buttons = json_encode([<br />
                         &quot;keyboard&quot; =&gt; [<br />
                              [<br />
                                  [<br />
                                      // текст кнопки<br />
                                      &quot;text&quot; =&gt; &quot;Button 1&quot;,<br />
                                      // необязательное поле: в значении true при нажатии на кнопку будет передан телефон<br />
                                      &quot;request_contact&quot; =&gt; false,<br />
                                      // необязательное поле: в значении true будет передано месторасположение<br />
                                      &quot;request_location&quot; =&gt; false,<br />
                                      // request_location и request_contact - взаимоисключающие значения<br />
                                  ],<br />
                                  [<br />
                                      &quot;text&quot; =&gt; &quot;Button 2&quot;,<br />
                                  ]<br />
                              ]<br />
                          ],<br />
                          // в значении true после нажатия на любую кнопку клавиатура будет скрыта,<br />
                          // вызвать обратно можно по нажатию спец иконки в интерфейсе приложения Телеграм<br />
                          'one_time_keyboard' =&gt; false,<br />
                          // в случае false клавиатура всегда имеет ту же высоту, что и стандартная клавиатура приложения.<br />
                          'resize_keyboard' =&gt; true,<br />
                          // показывать клавиатуру только пользователю который ее вызвал, удобно для групп<br />
                          'selective' =&gt; true,<br />
                      ], true);<br />
              <br />
                      return $buttons;<br />
                  }
              Davidsoft 25.05.2020 в 15:48
            • Посмотрите есть ли ошибки в логах на сервере и в webhookinfo
              iMakeBots 25.05.2020 в 15:50
            • да нету вроде ошибок
              Davidsoft 25.05.2020 в 15:58
            • удалил в private function sendMessageWithButtons($user_id, $text, $buttons)
              $buttons появились
              Davidsoft 25.05.2020 в 16:12
            • callback_data как обработать?
              Davidsoft 25.05.2020 в 17:50
            • Проверяете наличие этого свойства в объекте который вам пришел и обрабатываете заранее подготовленной логикой.

              В обоих статьях про кнопки есть примеры обработки callback_data.

              Для теста поднимите бота из последней статьи про кнопки - "поиграйте" с методами и параметрами - поймете как все работает, потом смело и уверенно прикрутите к своему боту любой набор кнопок клавиатуры или инлайн.
              iMakeBots 25.05.2020 в 18:07
            • в этом боте не работает по чему-то
               /** Обработка Inline кнопки<br />
                   * @param $callback_data<br />
                   */<br />
                  private function actionInlineButton($callback_data)<br />
                  {<br />
                      // получаем массив из переданного параметра callback_data кнопки inline<br />
                      // разделяем по знаку _<br />
                      // под индексом 0 идет значение actionInlineButton<br />
                      // под последующим индексом 1 идет значение, которое может при создании<br />
                      // кнопки генерироваться под ваши требования, например это может быть id какого-нибудь объекта<br />
                      // значений может быть больше, но общая строка не должна превышать 64 байта<br />
                      $params = explode(&quot;_&quot;, $callback_data[&quot;data&quot;]);<br />
              <br />
                      // отправляем Уведомление<br />
                      $this-&gt;botApiQuery(&quot;answerCallbackQuery&quot;, [<br />
                          &quot;callback_query_id&quot; =&gt; $callback_data[&quot;id&quot;],<br />
                          &quot;text&quot; =&gt; &quot;Событие inline получено&quot;,<br />
                          &quot;alert&quot; =&gt; false<br />
                      ]);<br />
              <br />
                      // отправляем текстовое сообщение<br />
                      $this-&gt;botApiQuery(&quot;sendMessage&quot;, [<br />
                          &quot;chat_id&quot; =&gt; $this-&gt;userId,<br />
                          &quot;text&quot; =&gt; &quot;Параметр &quot; . $params[&quot;1&quot;],<br />
                      ]);<br />
                  }<br />
              <br />
                  /**<br />
                   * Обработка KeyBoard кнопки<br />
                   */<br />
                  private function actionKeyboardButton()<br />
                  {<br />
                      // отправляем текстовое сообщение<br />
                      $this-&gt;botApiQuery(&quot;sendMessage&quot;, [<br />
                          &quot;chat_id&quot; =&gt; $this-&gt;userId,<br />
                          &quot;text&quot; =&gt; &quot;Обработана кнопка &quot; . $this-&gt;data['message']['text'],<br />
                      ]);<br />
                  }<br />
              
              Davidsoft 25.05.2020 в 18:35
            • Код который вы привели он не универсальный и работает в тех условиях которые описаны в боте в статье (там где вы его скопировали) - воспроизведите условия для этих методов и у вас все заработает
              iMakeBots 25.05.2020 в 21:00
            • Просто опыта маловата.
              Davidsoft 26.05.2020 в 15:29
            • Рассмотрите метод route() в примере в статье, посмотрите как он обрабатывает поступающие к нему запросы, обратите внимание на условия где ожидаются данные callback_data
              iMakeBots 26.05.2020 в 15:56