За последние 24 часа нас посетили 21447 программистов и 1023 робота. Сейчас ищет 661 программист ...

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

Тема в разделе "PHP для новичков", создана пользователем Stang8, 5 мар 2021.

Метки:
  1. Stang8

    Stang8 Новичок

    С нами с:
    23 июн 2020
    Сообщения:
    18
    Симпатии:
    0
    Такой вопрос. Есть у меня класс, обертка к 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:\xampp\htdocs\EnginePHP\class\config.php';
    11.         try {
    12.             $this->dbinfo = (require 'c:\xampp\htdocs\EnginePHP\class\config.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:\xampp\htdocs\EnginePHP\class\db_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:\xampp\htdocs\EnginePHP\polls\city10.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:\xampp\htdocs\EnginePHP\polls\school20.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:\xampp\htdocs\EnginePHP\polls\opros30.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:\xampp\htdocs\EnginePHP\class\Forms.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 перезаписывается, то почему в сессии будет работать?
     
  2. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    @Stang8, странно выглядит условие в методе setID
     
  3. Stang8

    Stang8 Новичок

    С нами с:
    23 июн 2020
    Сообщения:
    18
    Симпатии:
    0
    А, это я уже пытался понять где значение перезаписывается, мол если там уже не ноль, то чтобы не переписывалось. Не работает...
     
  4. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.748
    Симпатии:
    1.321
    Адрес:
    Лень
    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:\xampp\htdocs\EnginePHP\class\config.php';
    11.         try {
    12.             $this->dbinfo = (require 'c:\xampp\htdocs\EnginePHP\class\config.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:\xampp\htdocs\EnginePHP\class\db_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:\xampp\htdocs\EnginePHP\polls\city10.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:\xampp\htdocs\EnginePHP\polls\school20.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:\xampp\htdocs\EnginePHP\polls\opros30.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:\xampp\htdocs\EnginePHP\class\Forms.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. ?>
     
  5. Stang8

    Stang8 Новичок

    С нами с:
    23 июн 2020
    Сообщения:
    18
    Симпатии:
    0
    Я что-то должен был увидеть?
     
  6. Stang8

    Stang8 Новичок

    С нами с:
    23 июн 2020
    Сообщения:
    18
    Симпатии:
    0
    Почитал я чуть-чуть, и мелькнула у меня мысль, не вызывать во внешних классах даже геттер:
    Код (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. }
    Но не сильно понимаю, как это сделать. По идее должно работать, но по факту ругается на недостаточное количество аргументов, получается в этой функции не добавляется в массив еще одно значение.
     
  7. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.748
    Симпатии:
    1.321
    Адрес:
    Лень
    у тебя изначально код похож на
    2021-03-06_14-51-20.jpg

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

    Stang8 Новичок

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

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.748
    Симпатии:
    1.321
    Адрес:
    Лень
    У тебя получается не обвертка для проекта, ..... А проект заточенный под обвертку.

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

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

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.748
    Симпатии:
    1.321
    Адрес:
    Лень
    Ну ? а у тебя что ? зачем класс Form в своем конструкторе подключает базу данных ?

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

    запускаем...
    Выводим сити ? require 'c:\xampp\htdocs\EnginePHP\polls\city10.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);
     
  11. Stang8

    Stang8 Новичок

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

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.748
    Симпатии:
    1.321
    Адрес:
    Лень
    да ? Окей...

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

    В начале скрипта пропиши следующее:
    PHP:
    1. <?php
    2.  
    3. error_reporting ( E_ALL );
    Вывод всех ошибок. Исправляй. o_O