Всем привет. Вступительная часть, имеется приложение написанное на c++, точнее Qt, которое работает с некой БД MySQL. Появилась необходимость прикрутить web-морду для некоторого функционала. На php ранее не писал, есть опыт на pascal (delphi), c++ (Qt), немного знаком с html, css, js. Так вот, почитал на досуге, взвесил все, закатал рукава, взял шашку и вперед =) Имеем: php 7.1, MySQL 5.6 и OpenServer 5.2.2 (Самой минимальной комплектации), немножко мозгов, и руки (надеюсь с нужного места) Основная часть. Спойлер: Имеется некий config.php с неким классом для работы с БД: PHP: class PDORepository{ const DB_USERNAME="root"; const DB_PASSWORD="258889"; const DB_HOST="localhost"; const DB_NAME="myrec_db"; const DB_OPTIONS = [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => false ]; function getConnection(){ $db_username = self::DB_USERNAME; $db_password = self::DB_PASSWORD; $db_host = self::DB_HOST; $db_name = self::DB_NAME; $db_options = self::DB_OPTIONS; try { $connection = new PDO("mysql:dbname=$db_name;host=$db_host", $db_username, $db_password, $db_options); return $connection; } catch (Exception $ex) { echo'Ошибка подключения: '.$ex->getMessage(); } } function queryList($sql, $args){ $connection = $this->getConnection(); $stmt = $connection->prepare($sql); if ($args == ''){ try { $stmt->execute(); return $stmt; } catch (Exception $ex) { echo'Ошибка запроса: '.$ex->getMessage(); } } else { try { $stmt->execute($args); return $stmt; } catch (Exception $ex) { echo'Ошибка запроса: '.$ex->getMessage(); } } } } Спойлер: Так же есть php-файл с набором функций, откуда я работаю с данным классом: PHP: ... if (file_exists("../config.php")){ include_once "../config.php"; } ... function select_quests (){ $dbc = new PDORepository(); $dbc ->getConnection(); $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 FROM quests, clients, status_quest WHERE (quests.id_clients = clients.id) && (quests.deleted = :qd) && (quests.id_status = status_quest.id) && (status_quest.finish = :sf) ORDER BY quest_id"; $arg = array('qd' => '0', 'sf' => '0'); $sql_result = $dbc ->queryList($sql_text, $arg); //echo '<pre>'; //echo var_dump($sql_result); //echo '</pre>'; return $sql_result; ... } Ошибок в работе нет, но функция queryList() не возвращает результат запроса. Если посмотреть var_dump'пом, то видим: Спойлер: Тыц Код (Text): object(PDOStatement)#3 (1) { ["queryString"]=> 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 FROM quests, clients, status_quest WHERE (quests.id_clients = clients.id) && (quests.deleted = :qd) && (quests.id_status = status_quest.id) && (status_quest.finish = :sf) ORDER BY quest_id" Итоги/Вопросы: Где я лоханулся? (Плохо знаком с отладкой в php) Какие буду предложения и замечания? Спасибо за помощь.
@AlexG, в примере использования подготовки запроса к выполнению индексы массива параметров написаны с символом ':' в качестве префикса.
В конфиге в строке 39 возвращается подготовленный запрос, который еще надо будет разобрать построчно (fetch) Что-то типа того должно быть в конфиге вместо 39 строки или в основном файле после 14 строки: PHP: $res_arr = []; while ($row = $sql_result->fetch()) { $res_arr[] = $row; } Уже в самом $res_arr будут результаты запроса в виде массива
Возможно, но на php.net читал, что это не обязательно (с версии 5.6, кажись), т.е. префикс должен быть в самом запросе, а когда присваиваешь значение самой переменной, то префикс можно упустить. В других языках, с которыми работал, префикс не использовал. В этом, проверил, тоже все работает без него. Вот сам запрос: Спойлер: Запрос PHP: $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 FROM quests, clients, status_quest WHERE (quests.id_clients = clients.id) && (quests.deleted = :qd) && (quests.id_status = status_quest.id) && (status_quest.finish = :sf) ORDER BY quest_id"; $arg = array('qd' => '0', 'sf' => '0'); Вот вар_дамп ответа: Спойлер: var_dump Код (Text): array(1) { [0]=> array(5) { ["quest_id"]=> int(1) ["date_in"]=> string(10) "2017-11-09" ["client_name"]=> string(31) "Рога и копыта ООО" ["client_inn"]=> string(12) "860312345678" ["status_name"]=> string(32) "Зарегистрирована" } } Как-то так.
Спасибо, действительно все работает. Ранее я делал таким образом: PHP: $stmt->execute(); $sql_result = $stmt->fetchAll(); return $sql_result; Но почему-то не сработало, т.е. возвращался результат как в 1 посте. Почитал мануалы, fetchAll - возвращает все строки с результатирующего набора, соответственно fetch - возвращает следующую строку, но мы его прогоняем в цикле, по всему набору. Так в чем же тогда разница? Никак не пойму.
Проверил, работает с fetchAll(). Может ранее где-то опечатка была. PDO объект и ссылки на него надо зарывать самому или его как mysqli php закрывает сам? Многие закрываю путем Код (Text): $sql_result = null; $dbc = null; Но некоторые пишут, что не нужно. Однозначного мнения не нашел.
Присвоение null не самый удачный вариант удаления объекта. После отработки скрипта он автоматически удаляется.