За последние 24 часа нас посетили 20524 программиста и 1096 роботов. Сейчас ищут 372 программиста ...

Подключение к БД, запрос

Тема в разделе "PHP и базы данных", создана пользователем AlexG, 10 ноя 2017.

Метки:
  1. AlexG

    AlexG Новичок

    С нами с:
    10 ноя 2017
    Сообщения:
    18
    Симпатии:
    0
    Всем привет.
    Вступительная часть, имеется приложение написанное на c++, точнее Qt, которое работает с некой БД MySQL. Появилась необходимость прикрутить web-морду для некоторого функционала. На php ранее не писал, есть опыт на pascal (delphi), c++ (Qt), немного знаком с html, css, js. Так вот, почитал на досуге, взвесил все, закатал рукава, взял шашку и вперед =)
    Имеем: php 7.1, MySQL 5.6 и OpenServer 5.2.2 (Самой минимальной комплектации), немножко мозгов, и руки (надеюсь с нужного места)

    Основная часть.

    PHP:
    1.    
    2. class PDORepository{
    3.         const DB_USERNAME="root";
    4.         const DB_PASSWORD="258889";
    5.         const DB_HOST="localhost";
    6.         const DB_NAME="myrec_db";
    7.         const DB_OPTIONS = [
    8.             PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    9.             PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    10.             PDO::ATTR_EMULATE_PREPARES   => false
    11.             ];
    12.  
    13.         function getConnection(){
    14.             $db_username = self::DB_USERNAME;
    15.             $db_password = self::DB_PASSWORD;
    16.             $db_host = self::DB_HOST;
    17.             $db_name = self::DB_NAME;
    18.             $db_options = self::DB_OPTIONS;
    19.             try {
    20.                 $connection = new PDO("mysql:dbname=$db_name;host=$db_host", $db_username, $db_password, $db_options);
    21.                 return $connection;
    22.             } catch (Exception $ex) {
    23.                 echo'Ошибка подключения: '.$ex->getMessage();
    24.             }
    25.         }
    26.         function queryList($sql, $args){
    27.             $connection = $this->getConnection();
    28.             $stmt = $connection->prepare($sql);
    29.             if ($args == ''){
    30.                 try {
    31.                     $stmt->execute();
    32.                     return $stmt;
    33.                 } catch (Exception $ex) {
    34.                     echo'Ошибка запроса: '.$ex->getMessage();
    35.                 }
    36.             } else {
    37.                 try {
    38.                     $stmt->execute($args);
    39.                     return $stmt;
    40.                 } catch (Exception $ex) {
    41.                     echo'Ошибка запроса: '.$ex->getMessage();
    42.                 }
    43.             }
    44.         }
    45.     }

    PHP:
    1. ...
    2.     if (file_exists("../config.php")){
    3.         include_once "../config.php";
    4.     }
    5. ...
    6.     function select_quests (){
    7.         $dbc = new PDORepository();
    8.         $dbc ->getConnection();
    9.         $sql_text = "SELECT quests.id as quest_id, quests.date_in, clients.name as client_name, clients.inn as client_inn, status_quest.name as status_name
    10.                     FROM quests, clients, status_quest
    11.                     WHERE (quests.id_clients = clients.id) && (quests.deleted = :qd) && (quests.id_status = status_quest.id) && (status_quest.finish = :sf)
    12.                     ORDER BY quest_id";
    13.         $arg = array('qd' => '0', 'sf' => '0');
    14.         $sql_result = $dbc ->queryList($sql_text, $arg);
    15.         //echo '<pre>';
    16.         //echo var_dump($sql_result);
    17.         //echo '</pre>';
    18.         return $sql_result;
    19.        ...
    20.     }

    Ошибок в работе нет, но функция queryList() не возвращает результат запроса. Если посмотреть var_dump'пом, то видим:
    Код (Text):
    1.  
    2. object(PDOStatement)#3 (1) {
    3.   ["queryString"]=>
    4.   string(390) "SELECT quests.id as quest_id, quests.date_in, clients.name as client_name, clients.inn as client_inn, status_quest.name as status_name
    5.                      FROM quests, clients, status_quest
    6.                      WHERE (quests.id_clients = clients.id) && (quests.deleted = :qd) && (quests.id_status = status_quest.id) && (status_quest.finish = :sf)
    7.                      ORDER BY quest_id"

    Итоги/Вопросы: Где я лоханулся? (Плохо знаком с отладкой в php) Какие буду предложения и замечания?
    Спасибо за помощь.
     
  2. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
  3. Maputo

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

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    В конфиге в строке 39 возвращается подготовленный запрос, который еще надо будет разобрать построчно (fetch)
    Что-то типа того должно быть в конфиге вместо 39 строки или в основном файле после 14 строки:
    PHP:
    1. $res_arr = [];
    2. while ($row = $sql_result->fetch())
    3. {
    4.     $res_arr[] = $row;
    5. }
    Уже в самом $res_arr будут результаты запроса в виде массива
     
    AlexG нравится это.
  4. AlexG

    AlexG Новичок

    С нами с:
    10 ноя 2017
    Сообщения:
    18
    Симпатии:
    0
    Возможно, но на php.net читал, что это не обязательно (с версии 5.6, кажись), т.е. префикс должен быть в самом запросе, а когда присваиваешь значение самой переменной, то префикс можно упустить. В других языках, с которыми работал, префикс не использовал. В этом, проверил, тоже все работает без него. Вот сам запрос:
    PHP:
    1.        
    2. $sql_text = "SELECT quests.id as quest_id, quests.date_in, clients.name as client_name, clients.inn as client_inn, status_quest.name as status_name
    3.                     FROM quests, clients, status_quest
    4.                     WHERE (quests.id_clients = clients.id) && (quests.deleted = :qd) && (quests.id_status = status_quest.id) && (status_quest.finish = :sf)
    5.                     ORDER BY quest_id";
    6.         $arg = array('qd' => '0', 'sf' => '0');

    Вот вар_дамп ответа:
    Код (Text):
    1.  
    2. array(1) {
    3.   [0]=>
    4.   array(5) {
    5.     ["quest_id"]=>
    6.     int(1)
    7.     ["date_in"]=>
    8.     string(10) "2017-11-09"
    9.     ["client_name"]=>
    10.     string(31) "Рога и копыта ООО"
    11.     ["client_inn"]=>
    12.     string(12) "860312345678"
    13.     ["status_name"]=>
    14.     string(32) "Зарегистрирована"
    15.   }
    16. }
    Как-то так.
     
  5. AlexG

    AlexG Новичок

    С нами с:
    10 ноя 2017
    Сообщения:
    18
    Симпатии:
    0
    Спасибо, действительно все работает. Ранее я делал таким образом:
    PHP:
    1.                    
    2. $stmt->execute();
    3. $sql_result = $stmt->fetchAll();
    4. return $sql_result;
    Но почему-то не сработало, т.е. возвращался результат как в 1 посте. Почитал мануалы, fetchAll - возвращает все строки с результатирующего набора, соответственно fetch - возвращает следующую строку, но мы его прогоняем в цикле, по всему набору. Так в чем же тогда разница? Никак не пойму.
     
  6. Maputo

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

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    Проверьте еще раз, что у Вас возвращает метод queryList. Скорее всего путаница с оператором return.
     
  7. AlexG

    AlexG Новичок

    С нами с:
    10 ноя 2017
    Сообщения:
    18
    Симпатии:
    0
    Проверил, работает с fetchAll(). Может ранее где-то опечатка была.

    PDO объект и ссылки на него надо зарывать самому или его как mysqli php закрывает сам? Многие закрываю путем
    Код (Text):
    1.  
    2. $sql_result = null;
    3. $dbc = null;
    Но некоторые пишут, что не нужно. Однозначного мнения не нашел.
     
  8. Maputo

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

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    Присвоение null не самый удачный вариант удаления объекта. После отработки скрипта он автоматически удаляется.
     
  9. AlexG

    AlexG Новичок

    С нами с:
    10 ноя 2017
    Сообщения:
    18
    Симпатии:
    0
    Спасибо за помощь и разъяснения.