Stang8
Такой вопрос. Есть у меня класс, обертка к PDO. Есть у меня в этом классе свойство $insert_id, которому я через отдельный сеттер присваиваю значений ID сделанной записи в таблицу. И есть геттер для использования в другом классе. И это у меня не работает, если использую в другом классе (не унаследованном). В какое-то время, у меня свойство обнуляется, и не могу понять где и как (такое как при вызове другого метода). Если напрямую, а не через другой класс, то все работает нормально. Что я не так делаю? Вроде сеттер и само свойство — private.
Класс обертка (у метода insert есть пример, который отлично работает вне класса):
Код (Text):
<?php class DB_PDO { public $pdo; public $dbinfo; private $insert_id; public function __construct() { // подключение PDO // require_once ‘c:xampphtdocsEnginePHPclassconfig.php’; try { $this->dbinfo = (require ‘c:xampphtdocsEnginePHPclassconfig.php’)[‘db’]; $this->pdo = new PDO(‘mysql:host=» . $this->dbinfo[«host’] .’;dbname=» .$this->dbinfo[«dbname’], $this->dbinfo[‘user’], $this->dbinfo[‘password’]); $this->pdo->exec(‘SET NAMES UTF8’); } catch(Exeption $e) { header(‘HTTP/1.1 503 Сервіс тимчасово недоступний’); header(‘Status: 503 Сервіс тимчасово недоступний’); $output = self::fatalErrorPageContent(); $output = str_ireplace( ‘{DESCRIPTION}’, ‘<p>Зараз ця програма відчуває деякі труднощі з базою даних</p>’, $output ); $output = str_ireplace( ‘{CODE}’, ‘<b>Description:</b> ‘.$e->getMessage().'<br> <b>File:</b> ‘.$e->getFile().'<br> <b>Line:</b> ‘.$e->getLine(), $output ); echo $output; exit(1); } // } // возвращаем ID вставленной записи public function getID() { return $this->insert_id; } // устанавливаем ID вставленной записи public function setID($insert) { if ($this->insert_id != 0) $this->insert_id = $insert; } /* Добавляем запись в таблицу и возвращаем ID записи Пример: $issa = new DB_PDO(); $data = array( ‘date_start’ => date(«Y-m-d H:i:s»), ‘id_city’ => ‘1’ ); $issa->insert(«INSERT INTO `result` (date_start, id_city) values (:date_start, :id_city)», $data); */ public function insert($sql, $param = array()){ $sth = $this->pdo->prepare($sql); $sth->execute($param); // Получаем id вставленной записи $insert_id = $this->pdo->lastInsertId(); $this->setID($insert_id); } // Обновляем запись, как и по принципу insert, только не возвращаем номер записи public function update($sql, $param = array()){ $sth = $this->pdo->prepare($sql); $sth->execute($param); } } ?>Класс, который использует обертку (здесь в outOpros1() приходит уже нулевое значение):
Код (Text):
<?php class Forms { public function __construct() { // подключение своему классу для работы с PDO (db_pdo.php) try { require_once ‘c:xampphtdocsEnginePHPclassdb_pdo.php’; $this->myPDO = new DB_PDO(); } catch(Exeption $e) { echo «Ошибка создания класса»; } // } // вывод city public function outCity() { require ‘c:xampphtdocsEnginePHPpollscity10.php’; // получаем ID города по префиксу $data = array(@$_REQUEST[‘select’]); $pref = $this->myPDO->selectWhere(«SELECT `id` FROM `city` WHERE `prefix` = ?», $data); @$id_city = implode(», $pref); // вставляем первую запись, получаем номер первой записи, для дальнейшего обновления по номеру записи $data = array( ‘date_start’ => date(«Y-m-d H:i:s»), ‘id_city’ => $id_city ); $this->myPDO->insert(«INSERT INTO `result` (date_start, id_city) values (:date_start, :id_city)», $data); } // вывод school public function outSchool() { require ‘c:xampphtdocsEnginePHPpollsschool20.php’; // получаем id текущей записи и обновляем выбор пользователя — школа $this->insertID = $this->myPDO->getID(); $id = $this->insertID; $id_school = (@$_REQUEST[‘select1’]); $data = array( ‘id_school’ => $id_school, ‘id’ => $id ); $this->myPDO->update(«UPDATE `result` SET `id_school` = :id_school WHERE `id` = :id», $data); } // вывод первой части опроса public function outOpros1() { require ‘c:xampphtdocsEnginePHPpollsopros30.php’; $this->insertID = $this->myPDO->getID(); $id = $this->insertID; $age = $_REQUEST[‘ages’]; $own = $_REQUEST[‘familys’]; $clas = $_REQUEST[‘clasC’]; $data = array (‘age’ => $age, ‘own’ => $own, ‘class’ => $clas, ‘id’ => $id); $this->myPDO->update(«UPDATE `result` SET `age` = :age, `own` = :own, `class` = :class WHERE `id` = :id», $data); } } ?>Ну и использование всего этого:
Код (Text):
<?php require_once ‘c:xampphtdocsEnginePHPclassForms.php’; $indexP = new Forms(); //echo «</br>»; //первая форма с выбором города $indexP->outCity(); //здесь у меня появляется нужные данные //вторая с выбором школы if (isset($_REQUEST[‘select’])) { $indexP->outSchool(); //а здесь свойство уже пустое… echo ‘<script type=»text/javascript»>’, ‘document.getElementById(«delete1»).remove();’, ‘</script>’; } elseif (@$_REQUEST[‘select1’]) { // третья форма $indexP->outOpros1(); echo ‘<script type=»text/javascript»>’, ‘document.getElementById(«delete1»).remove();’, ‘</script>’; } ?>Постарался взять только то, что затрагивается, иначе слишком много букв будет. Посоветуйте что делать, куда рыть. Может сессию как-то использовать? Но если тут сойство private перезаписывается, то почему в сессии будет работать?
Sail
@Stang8, странно выглядит условие в методе setID
Stang8
А, это я уже пытался понять где значение перезаписывается, мол если там уже не ноль, то чтобы не переписывалось. Не работает…
MouseZver
PHP:
<?php class DB_PDO { public $pdo; public $dbinfo; private $insert_id; public function __construct() { // подключение PDO // require_once ‘c:xampphtdocsEnginePHPclassconfig.php’; try { $this->dbinfo = (require ‘c:xampphtdocsEnginePHPclassconfig.php’)[‘db’]; $this->pdo = new PDO(‘mysql:host=» . $this->dbinfo[«host’] .‘;dbname=» .$this->dbinfo[«dbname’], $this->dbinfo[‘user’], $this->dbinfo[‘password’]); } catch(Exeption $e) { $output = self::fatalErrorPageContent(); ‘{DESCRIPTION}’, ‘<p>Зараз ця програма відчуває деякі труднощі з базою даних</p>’, $output ); ‘{CODE}’, ‘<b>Description:</b> ‘.$e->getMessage().‘<br> <b>File:</b> ‘.$e->getFile().‘<br> <b>Line:</b> ‘.$e->getLine(), $output ); echo $output; } // } // возвращаем ID вставленной записи public function getID() { return $this->insert_id; } // устанавливаем ID вставленной записи public function setID($insert) { if ($this->insert_id != 0) $this->insert_id = $insert; } /* Добавляем запись в таблицу и возвращаем ID записи Пример: $issa = new DB_PDO(); $data = array( ‘date_start’ => date(«Y-m-d H:i:s»), ‘id_city’ => ‘1’ ); $issa->insert(«INSERT INTO `result` (date_start, id_city) values (:date_start, :id_city)», $data); */ $sth = $this->pdo->prepare($sql); $sth->execute($param); // Получаем id вставленной записи $insert_id = $this->pdo->lastInsertId(); $this->setID($insert_id); } // Обновляем запись, как и по принципу insert, только не возвращаем номер записи $sth = $this->pdo->prepare($sql); $sth->execute($param); } } ?>PHP:
<?php class Forms { public function __construct() { // подключение своему классу для работы с PDO (db_pdo.php) try { require_once ‘c:xampphtdocsEnginePHPclassdb_pdo.php’; $this->myPDO = new DB_PDO(); } catch(Exeption $e) { echo «Ошибка создания класса»; } // } // вывод city public function outCity() { require ‘c:xampphtdocsEnginePHPpollscity10.php’; // получаем ID города по префиксу $pref = $this->myPDO->selectWhere(«SELECT `id` FROM `city` WHERE `prefix` = ?», $data); // вставляем первую запись, получаем номер первой записи, для дальнейшего обновления по номеру записи $this->myPDO->insert(«INSERT INTO `result` (date_start, id_city) values (:date_start, :id_city)», $data); } // вывод school public function outSchool() { require ‘c:xampphtdocsEnginePHPpollsschool20.php’; // получаем id текущей записи и обновляем выбор пользователя — школа $this->insertID = $this->myPDO->getID(); $id = $this->insertID; $id_school = (@$_REQUEST[‘select1’]); $this->myPDO->update(«UPDATE `result` SET `id_school` = :id_school WHERE `id` = :id», $data); } // вывод первой части опроса public function outOpros1() { require ‘c:xampphtdocsEnginePHPpollsopros30.php’; $this->insertID = $this->myPDO->getID(); $id = $this->insertID; $age = $_REQUEST[‘ages’]; $own = $_REQUEST[‘familys’]; $clas = $_REQUEST[‘clasC’]; $this->myPDO->update(«UPDATE `result` SET `age` = :age, `own` = :own, `class` = :class WHERE `id` = :id», $data); } } ?>PHP:
<?php require_once ‘c:xampphtdocsEnginePHPclassForms.php’; $indexP = new Forms(); //echo «</br>»; //первая форма с выбором города $indexP->outCity(); //здесь у меня появляется нужные данные //вторая с выбором школы $indexP->outSchool(); //а здесь свойство уже пустое… echo ‘<script type=»text/javascript»>’, ‘document.getElementById(«delete1»).remove();’, ‘</script>’; } elseif (@$_REQUEST[‘select1’]) { // третья форма $indexP->outOpros1(); echo ‘<script type=»text/javascript»>’, ‘document.getElementById(«delete1»).remove();’, ‘</script>’; } ?>
Stang8
Я что-то должен был увидеть?
Stang8
Почитал я чуть-чуть, и мелькнула у меня мысль, не вызывать во внешних классах даже геттер:
Код (Text):
public function update($sql, $param = array()){ $id = $this->getID(); $result = array ($param) + array (‘id’ => $id); $sth = $this->pdo->prepare($sql); $sth->execute((array) $result); }Но не сильно понимаю, как это сделать. По идее должно работать, но по факту ругается на недостаточное количество аргументов, получается в этой функции не добавляется в массив еще одно значение.
MouseZver
у тебя изначально код похож на
Гора Велосипедов на велосипеде, и тебя видимо все устраивает. Удали обвертку — это кошмар. И в этом кошмаре безысходном, ты продолжаешь ФуФуФуВыкрутяйшенМегаКодинг
Stang8
И что мне даст удаление обертки? Один огромный класс? Я понимаю, что не все гладко, что здесь скорее функциональное программирование с оберткой ООП. Обертка мне нужна в любом случае, потому как пригодится в любом другом проекте. Да и как бы говорится, что каждый класс должен выполнять свою функцию. А не так, что в одном классе и работа с БД, и вывод форм, и прочее.
Лучше четко ткни носом, что и где не правильно, чем заниматься абстрактными диалогами.
MouseZver
У тебя получается не обвертка для проекта, ….. А проект заточенный под обвертку.
Ну могу еще раз повторить, но с цветами… с контрастностью…
Удали обвертку — это кошмар.
И в этом кошмаре безысходном, ты продолжаешь ФуФуФуВыкрутяйшенМегаКодинг
MouseZver
Ну ? а у тебя что ? зачем класс Form в своем конструкторе подключает базу данных ?
Давай логику посмотрим ?
запускаем…
Выводим сити ? require ‘c:xampphtdocsEnginePHPpollscity10.php’;
PHP:
Окей, супер. Мы проверяем на существовании данных. Гуд
А что дальше в этом методе творится ?
PHP:
// получаем ID города по префиксу // Какое мы получаем ????? откуда ????? у нас ничего не выбрано // КАК ДАЛЬШЕ ЭТО ВСЕ БУДЕТ РАБОТАТЬ ??? $pref = $this->myPDO->selectWhere(«SELECT `id` FROM `city` WHERE `prefix` = ?», $data); // вставляем первую запись, получаем номер первой записи, для дальнейшего обновления по номеру записи $this->myPDO->insert(«INSERT INTO `result` (date_start, id_city) values (:date_start, :id_city)», $data);
Stang8
Этот метод как раз работает четко, запись вставляется, и возвращает айди вставленной записи. Но вот в следующий метод, где нужен этот айди для обновления записи, он уже приходит по какой-то причине нулевой. И вот это я не пойму, хотя нигде промежуточно он не вызывается. Вот я его вардампом проверяю есть, а вот в новом методе его нет.
MouseZver
да ? Окей…
Удали во всех скриптах оператор говноКодинга — @
В начале скрипта пропиши следующее:
PHP:
<?phpВывод всех ошибок. Исправляй.