Использование свойств класса в другом классе

Stang8

Такой вопрос. Есть у меня класс, обертка к PDO. Есть у меня в этом классе свойство $insert_id, которому я через отдельный сеттер присваиваю значений ID сделанной записи в таблицу. И есть геттер для использования в другом классе. И это у меня не работает, если использую в другом классе (не унаследованном). В какое-то время, у меня свойство обнуляется, и не могу понять где и как (такое как при вызове другого метода). Если напрямую, а не через другой класс, то все работает нормально. Что я не так делаю? Вроде сеттер и само свойство – private.

Класс обертка (у метода insert есть пример, который отлично работает вне класса):

Код (Text):
  1. <?php
  2.  
  3. class DB_PDO {
  4.     public $pdo;
  5.     public $dbinfo;
  6.     private $insert_id;
  7.  
  8.     public function __construct() {
  9.         // подключение PDO
  10.         // require_once ‘c:xampphtdocsEnginePHPclassconfig.php’;
  11.         try {
  12.             $this->dbinfo = (require ‘c:xampphtdocsEnginePHPclassconfig.php’)[‘db’];
  13.             $this->pdo = new PDO(‘mysql:host=” . $this->dbinfo[“host’] .’;dbname=” .$this->dbinfo[“dbname’],
  14.                 $this->dbinfo[‘user’],
  15.                 $this->dbinfo[‘password’]);
  16.             $this->pdo->exec(‘SET NAMES UTF8’);
  17.         } catch(Exeption $e) {
  18.             header(‘HTTP/1.1 503 Сервіс тимчасово недоступний’);
  19.             header(‘Status: 503 Сервіс тимчасово недоступний’);
  20.             $output = self::fatalErrorPageContent();
  21.             $output = str_ireplace(
  22.                 ‘{DESCRIPTION}’,
  23.                 ‘<p>Зараз ця програма відчуває деякі труднощі з базою даних</p>’,
  24.                 $output
  25.             );
  26.             $output = str_ireplace(
  27.                 ‘{CODE}’,
  28.                 ‘<b>Description:</b> ‘.$e->getMessage().'<br>
  29.                     <b>File:</b> ‘.$e->getFile().'<br>
  30.                     <b>Line:</b> ‘.$e->getLine(),
  31.                 $output
  32.             );
  33.             echo $output;
  34.             exit(1);
  35.         }
  36.         //
  37.     }
  38.  
  39.     // возвращаем ID вставленной записи
  40.     public function getID() {
  41.         return $this->insert_id;
  42.     }
  43.  
  44.     // устанавливаем ID вставленной записи
  45.     public function setID($insert) {
  46.         if ($this->insert_id != 0) $this->insert_id = $insert;
  47.     }
  48.  
  49.     /*
  50.     Добавляем запись в таблицу и возвращаем ID записи
  51.     Пример: $issa = new DB_PDO();
  52.     $data = array( ‘date_start’ => date(“Y-m-d H:i:s”), ‘id_city’ => ‘1’ );
  53.     $issa->insert(“INSERT INTO `result` (date_start, id_city) values (:date_start, :id_city)”, $data);
  54.     */
  55.     public function insert($sql, $param = array()){
  56.        
  57.         $sth = $this->pdo->prepare($sql);
  58.         $sth->execute($param);
  59.         // Получаем id вставленной записи
  60.         $insert_id = $this->pdo->lastInsertId();
  61.         $this->setID($insert_id);
  62.     }
  63.  
  64.     // Обновляем запись, как и по принципу insert, только не возвращаем номер записи
  65.     public function update($sql, $param = array()){
  66.        
  67.         $sth = $this->pdo->prepare($sql);
  68.         $sth->execute($param);
  69.      }
  70. }
  71.  
  72. ?>

Класс, который использует обертку (здесь в outOpros1() приходит уже нулевое значение):

Код (Text):
  1. <?php
  2.  
  3. class Forms {
  4.  
  5.     public function __construct() {
  6.         // подключение своему классу для работы с PDO (db_pdo.php)
  7.         try {
  8.             require_once ‘c:xampphtdocsEnginePHPclassdb_pdo.php’;
  9.             $this->myPDO = new DB_PDO();
  10.         } catch(Exeption $e) {
  11.             echo “Ошибка создания класса”;
  12.         }
  13.         //
  14.     }
  15.  
  16.     // вывод city
  17.     public function outCity() {
  18.         require ‘c:xampphtdocsEnginePHPpollscity10.php’;
  19.  
  20.         // получаем ID города по префиксу
  21.         $data = array(@$_REQUEST[‘select’]);
  22.         $pref = $this->myPDO->selectWhere(“SELECT `id` FROM `city` WHERE `prefix` = ?”, $data);
  23.         @$id_city = implode(”, $pref);
  24.  
  25.         // вставляем первую запись, получаем номер первой записи, для дальнейшего обновления по номеру записи
  26.         $data = array( ‘date_start’ => date(“Y-m-d H:i:s”), ‘id_city’ => $id_city );
  27.         $this->myPDO->insert(“INSERT INTO `result` (date_start, id_city) values (:date_start, :id_city)”, $data);
  28.  
  29.     }
  30.  
  31.     // вывод school
  32.     public function outSchool() {
  33.         require ‘c:xampphtdocsEnginePHPpollsschool20.php’;
  34.  
  35.         // получаем id текущей записи и обновляем выбор пользователя – школа
  36.         $this->insertID = $this->myPDO->getID();
  37.         $id = $this->insertID;
  38.         $id_school = (@$_REQUEST[‘select1’]);
  39.         $data = array( ‘id_school’ => $id_school, ‘id’ => $id );
  40.  
  41.         $this->myPDO->update(“UPDATE `result` SET `id_school` = :id_school WHERE `id` = :id”, $data);
  42.    
  43.     }
  44.  
  45.     // вывод первой части опроса
  46.     public function outOpros1() {
  47.         require ‘c:xampphtdocsEnginePHPpollsopros30.php’;
  48.         $this->insertID = $this->myPDO->getID();
  49.         $id = $this->insertID;
  50.         $age = $_REQUEST[‘ages’];
  51.         $own = $_REQUEST[‘familys’];
  52.         $clas = $_REQUEST[‘clasC’];
  53.         $data = array (‘age’ => $age, ‘own’ => $own, ‘class’ => $clas, ‘id’ => $id);
  54.  
  55.         $this->myPDO->update(“UPDATE `result` SET `age` = :age, `own` = :own, `class` = :class WHERE `id` = :id”, $data);
  56.  
  57.     }
  58.  
  59. }
  60.  
  61. ?>

Ну и использование всего этого:

Код (Text):
  1. <?php
  2.  
  3. require_once ‘c:xampphtdocsEnginePHPclassForms.php’;
  4.  
  5. $indexP = new Forms();
  6.  
  7. //echo “</br>”;
  8.  
  9. //первая форма с выбором города
  10. $indexP->outCity(); //здесь у меня появляется нужные данные
  11.  
  12.  
  13. //вторая с выбором школы
  14. if (isset($_REQUEST[‘select’])) {
  15.  
  16.     $indexP->outSchool(); //а здесь свойство уже пустое…
  17.  
  18.     echo ‘<script type=”text/javascript”>’,
  19.          ‘document.getElementById(“delete1”).remove();’,
  20.          ‘</script>’;
  21.  
  22. } elseif (@$_REQUEST[‘select1’]) { // третья форма
  23.  
  24.     $indexP->outOpros1();
  25.  
  26.     echo ‘<script type=”text/javascript”>’,
  27.          ‘document.getElementById(“delete1”).remove();’,
  28.          ‘</script>’;
  29. }
  30.  
  31. ?>

Постарался взять только то, что затрагивается, иначе слишком много букв будет. Посоветуйте что делать, куда рыть. Может сессию как-то использовать? Но если тут сойство private перезаписывается, то почему в сессии будет работать?

 

Sail

@Stang8, странно выглядит условие в методе setID

 

Stang8

А, это я уже пытался понять где значение перезаписывается, мол если там уже не ноль, то чтобы не переписывалось. Не работает…

 

MouseZver

PHP:
  1. <?php
  2.  
  3. class DB_PDO {
  4.     public $pdo;
  5.     public $dbinfo;
  6.     private $insert_id;
  7.  
  8.     public function __construct() {
  9.         // подключение PDO
  10.         // require_once ‘c:xampphtdocsEnginePHPclassconfig.php’;
  11.         try {
  12.             $this->dbinfo = (require ‘c:xampphtdocsEnginePHPclassconfig.php’)[‘db’];
  13.             $this->pdo = new PDO(‘mysql:host=” . $this->dbinfo[“host’] .‘;dbname=” .$this->dbinfo[“dbname’],
  14.                 $this->dbinfo[‘user’],
  15.                 $this->dbinfo[‘password’]);
  16.             $this->pdo->exec(‘SET NAMES UTF8’);
  17.         } catch(Exeption $e) {
  18.             header(‘HTTP/1.1 503 Сервіс тимчасово недоступний’);
  19.             header(‘Status: 503 Сервіс тимчасово недоступний’);
  20.             $output = self::fatalErrorPageContent();
  21.             $output = str_ireplace(
  22.                 ‘{DESCRIPTION}’,
  23.                 ‘<p>Зараз ця програма відчуває деякі труднощі з базою даних</p>’,
  24.                 $output
  25.             );
  26.             $output = str_ireplace(
  27.                 ‘{CODE}’,
  28.                 ‘<b>Description:</b> ‘.$e->getMessage().‘<br>
  29.                    <b>File:</b> ‘.$e->getFile().‘<br>
  30.                    <b>Line:</b> ‘.$e->getLine(),
  31.                 $output
  32.             );
  33.             echo $output;
  34.             exit(1);
  35.         }
  36.         //
  37.     }
  38.  
  39.     // возвращаем ID вставленной записи
  40.     public function getID() {
  41.         return $this->insert_id;
  42.     }
  43.  
  44.     // устанавливаем ID вставленной записи
  45.     public function setID($insert) {
  46.         if ($this->insert_id != 0) $this->insert_id = $insert;
  47.     }
  48.  
  49.     /*
  50.     Добавляем запись в таблицу и возвращаем ID записи
  51.     Пример: $issa = new DB_PDO();
  52.     $data = array( ‘date_start’ => date(“Y-m-d H:i:s”), ‘id_city’ => ‘1’ );
  53.     $issa->insert(“INSERT INTO `result` (date_start, id_city) values (:date_start, :id_city)”, $data);
  54.     */
  55.     public function insert($sql, $param = array()){
  56.      
  57.         $sth = $this->pdo->prepare($sql);
  58.         $sth->execute($param);
  59.         // Получаем id вставленной записи
  60.         $insert_id = $this->pdo->lastInsertId();
  61.         $this->setID($insert_id);
  62.     }
  63.  
  64.     // Обновляем запись, как и по принципу insert, только не возвращаем номер записи
  65.     public function update($sql, $param = array()){
  66.      
  67.         $sth = $this->pdo->prepare($sql);
  68.         $sth->execute($param);
  69.      }
  70. }
  71.  
  72. ?>

PHP:
  1. <?php
  2. class Forms {
  3.     public function __construct() {
  4.         // подключение своему классу для работы с PDO (db_pdo.php)
  5.         try {
  6.             require_once ‘c:xampphtdocsEnginePHPclassdb_pdo.php’;
  7.             $this->myPDO = new DB_PDO();
  8.         } catch(Exeption $e) {
  9.             echo “Ошибка создания класса”;
  10.         }
  11.         //
  12.     }
  13.     // вывод city
  14.     public function outCity() {
  15.         require ‘c:xampphtdocsEnginePHPpollscity10.php’;
  16.         // получаем ID города по префиксу
  17.         $data = array(@$_REQUEST[‘select’]);
  18.         $pref = $this->myPDO->selectWhere(“SELECT `id` FROM `city` WHERE `prefix` = ?”, $data);
  19.         @$id_city = implode(, $pref);
  20.         // вставляем первую запись, получаем номер первой записи, для дальнейшего обновления по номеру записи
  21.         $data = array( ‘date_start’ => date(“Y-m-d H:i:s”), ‘id_city’ => $id_city );
  22.         $this->myPDO->insert(“INSERT INTO `result` (date_start, id_city) values (:date_start, :id_city)”, $data);
  23.     }
  24.     // вывод school
  25.     public function outSchool() {
  26.         require ‘c:xampphtdocsEnginePHPpollsschool20.php’;
  27.         // получаем id текущей записи и обновляем выбор пользователя – школа
  28.         $this->insertID = $this->myPDO->getID();
  29.         $id = $this->insertID;
  30.         $id_school = (@$_REQUEST[‘select1’]);
  31.         $data = array( ‘id_school’ => $id_school, ‘id’ => $id );
  32.         $this->myPDO->update(“UPDATE `result` SET `id_school` = :id_school WHERE `id` = :id”, $data);
  33.  
  34.     }
  35.     // вывод первой части опроса
  36.     public function outOpros1() {
  37.         require ‘c:xampphtdocsEnginePHPpollsopros30.php’;
  38.         $this->insertID = $this->myPDO->getID();
  39.         $id = $this->insertID;
  40.         $age = $_REQUEST[‘ages’];
  41.         $own = $_REQUEST[‘familys’];
  42.         $clas = $_REQUEST[‘clasC’];
  43.         $data = array (‘age’ => $age, ‘own’ => $own, ‘class’ => $clas, ‘id’ => $id);
  44.         $this->myPDO->update(“UPDATE `result` SET `age` = :age, `own` = :own, `class` = :class WHERE `id` = :id”, $data);
  45.     }
  46. }
  47. ?>

PHP:
  1. <?php
  2. require_once ‘c:xampphtdocsEnginePHPclassForms.php’;
  3. $indexP = new Forms();
  4. //echo “</br>”;
  5. //первая форма с выбором города
  6. $indexP->outCity(); //здесь у меня появляется нужные данные
  7. //вторая с выбором школы
  8. if (isset($_REQUEST[‘select’])) {
  9.     $indexP->outSchool(); //а здесь свойство уже пустое…
  10.     echo ‘<script type=”text/javascript”>’,
  11.          ‘document.getElementById(“delete1”).remove();’,
  12.          ‘</script>’;
  13. } elseif (@$_REQUEST[‘select1’]) { // третья форма
  14.     $indexP->outOpros1();
  15.     echo ‘<script type=”text/javascript”>’,
  16.          ‘document.getElementById(“delete1”).remove();’,
  17.          ‘</script>’;
  18. }
  19. ?>
 

Stang8

Я что-то должен был увидеть?

 

Stang8

Почитал я чуть-чуть, и мелькнула у меня мысль, не вызывать во внешних классах даже геттер:

Код (Text):
  1.  
  2. public function update($sql, $param = array()){
  3.         $id = $this->getID();
  4.         $result = array ($param) + array (‘id’ => $id);
  5.         $sth = $this->pdo->prepare($sql);
  6.         $sth->execute((array) $result);
  7. }

Но не сильно понимаю, как это сделать. По идее должно работать, но по факту ругается на недостаточное количество аргументов, получается в этой функции не добавляется в массив еще одно значение.

 

MouseZver

у тебя изначально код похож на
2021-03-06_14-51-20.jpg

Гора Велосипедов на велосипеде, и тебя видимо все устраивает. Удали обвертку – это кошмар. И в этом кошмаре безысходном, ты продолжаешь ФуФуФуВыкрутяйшенМегаКодинг

 

Stang8

И что мне даст удаление обертки? Один огромный класс? Я понимаю, что не все гладко, что здесь скорее функциональное программирование с оберткой ООП. Обертка мне нужна в любом случае, потому как пригодится в любом другом проекте. Да и как бы говорится, что каждый класс должен выполнять свою функцию. А не так, что в одном классе и работа с БД, и вывод форм, и прочее.
Лучше четко ткни носом, что и где не правильно, чем заниматься абстрактными диалогами.

 

MouseZver

У тебя получается не обвертка для проекта, ….. А проект заточенный под обвертку.

Ну могу еще раз повторить, но с цветами… с контрастностью…

Удали обверткуэто кошмар.
И в этом кошмаре безысходном, ты продолжаешь ФуФуФуВыкрутяйшенМегаКодинг

 

MouseZver

Ну ? а у тебя что ? зачем класс Form в своем конструкторе подключает базу данных ?

Давай логику посмотрим ?

запускаем…

Выводим сити ? require ‘c:xampphtdocsEnginePHPpollscity10.php’;

PHP:
  1. if (isset($_REQUEST[‘select’])) {

Окей, супер. Мы проверяем на существовании данных. Гуд

А что дальше в этом методе творится ?

PHP:
  1. // получаем ID города по префиксу
  2. $data = array(@$_REQUEST[‘select’]);
  3. // Какое мы получаем ????? откуда ????? у нас ничего не выбрано
  4.  
  5. // КАК ДАЛЬШЕ ЭТО ВСЕ БУДЕТ РАБОТАТЬ ???
  6.  
  7. $pref = $this->myPDO->selectWhere(“SELECT `id` FROM `city` WHERE `prefix` = ?”, $data);
  8. @$id_city = implode(, $pref);
  9.  
  10. // вставляем первую запись, получаем номер первой записи, для дальнейшего обновления по номеру записи
  11. $data = array( ‘date_start’ => date(“Y-m-d H:i:s”), ‘id_city’ => $id_city );
  12. $this->myPDO->insert(“INSERT INTO `result` (date_start, id_city) values (:date_start, :id_city)”, $data);
 

Stang8

Этот метод как раз работает четко, запись вставляется, и возвращает айди вставленной записи. Но вот в следующий метод, где нужен этот айди для обновления записи, он уже приходит по какой-то причине нулевой. И вот это я не пойму, хотя нигде промежуточно он не вызывается. Вот я его вардампом проверяю есть, а вот в новом методе его нет.

 

MouseZver

да ? Окей…

Удали во всех скриптах оператор говноКодинга – @

В начале скрипта пропиши следующее:

PHP:
  1. <?php
  2.  
  3. error_reporting ( E_ALL );

Вывод всех ошибок. Исправляй. o_O

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *