Такой вопрос. Есть у меня класс, обертка к 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:\xampp\htdocs\EnginePHP\class\config.php'; try { $this->dbinfo = (require 'c:\xampp\htdocs\EnginePHP\class\config.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:\xampp\htdocs\EnginePHP\class\db_pdo.php'; $this->myPDO = new DB_PDO(); } catch(Exeption $e) { echo "Ошибка создания класса"; } // } // вывод city public function outCity() { require 'c:\xampp\htdocs\EnginePHP\polls\city10.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:\xampp\htdocs\EnginePHP\polls\school20.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:\xampp\htdocs\EnginePHP\polls\opros30.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:\xampp\htdocs\EnginePHP\class\Forms.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 перезаписывается, то почему в сессии будет работать?
А, это я уже пытался понять где значение перезаписывается, мол если там уже не ноль, то чтобы не переписывалось. Не работает...
Спойлер: 1 код PHP: <?php class DB_PDO { public $pdo; public $dbinfo; private $insert_id; public function __construct() { // подключение PDO // require_once 'c:\xampp\htdocs\EnginePHP\class\config.php'; try { $this->dbinfo = (require 'c:\xampp\htdocs\EnginePHP\class\config.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); } } ?> Спойлер: 2 код PHP: <?php class Forms { public function __construct() { // подключение своему классу для работы с PDO (db_pdo.php) try { require_once 'c:\xampp\htdocs\EnginePHP\class\db_pdo.php'; $this->myPDO = new DB_PDO(); } catch(Exeption $e) { echo "Ошибка создания класса"; } // } // вывод city public function outCity() { require 'c:\xampp\htdocs\EnginePHP\polls\city10.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:\xampp\htdocs\EnginePHP\polls\school20.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:\xampp\htdocs\EnginePHP\polls\opros30.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); } } ?> Спойлер: 3 код PHP: <?php require_once 'c:\xampp\htdocs\EnginePHP\class\Forms.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>'; } ?>
Почитал я чуть-чуть, и мелькнула у меня мысль, не вызывать во внешних классах даже геттер: Код (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); } Но не сильно понимаю, как это сделать. По идее должно работать, но по факту ругается на недостаточное количество аргументов, получается в этой функции не добавляется в массив еще одно значение.
у тебя изначально код похож на Гора Велосипедов на велосипеде, и тебя видимо все устраивает. Удали обвертку - это кошмар. И в этом кошмаре безысходном, ты продолжаешь ФуФуФуВыкрутяйшенМегаКодинг
И что мне даст удаление обертки? Один огромный класс? Я понимаю, что не все гладко, что здесь скорее функциональное программирование с оберткой ООП. Обертка мне нужна в любом случае, потому как пригодится в любом другом проекте. Да и как бы говорится, что каждый класс должен выполнять свою функцию. А не так, что в одном классе и работа с БД, и вывод форм, и прочее. Лучше четко ткни носом, что и где не правильно, чем заниматься абстрактными диалогами.
У тебя получается не обвертка для проекта, ..... А проект заточенный под обвертку. Ну могу еще раз повторить, но с цветами... с контрастностью... Удали обвертку - это кошмар. И в этом кошмаре безысходном, ты продолжаешь ФуФуФуВыкрутяйшенМегаКодинг
Ну ? а у тебя что ? зачем класс Form в своем конструкторе подключает базу данных ? Давай логику посмотрим ? запускаем... Выводим сити ? require 'c:\xampp\htdocs\EnginePHP\polls\city10.php'; Спойлер: но перед этим я бы уделил внимание дальше этого метода PHP: if (isset($_REQUEST['select'])) { Окей, супер. Мы проверяем на существовании данных. Гуд А что дальше в этом методе творится ? 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);
Этот метод как раз работает четко, запись вставляется, и возвращает айди вставленной записи. Но вот в следующий метод, где нужен этот айди для обновления записи, он уже приходит по какой-то причине нулевой. И вот это я не пойму, хотя нигде промежуточно он не вызывается. Вот я его вардампом проверяю есть, а вот в новом методе его нет.
да ? Окей... Удали во всех скриптах оператор говноКодинга - @ В начале скрипта пропиши следующее: PHP: <?php error_reporting ( E_ALL ); Вывод всех ошибок. Исправляй.