не могу понять проблему

Arramis

Новичок
написал класс вида
PHP:
class my_plugin
   {
     private $_wpdb;
  
     public function __construct()
     {
       global $wpdb;
       $this->_wpdb = $wpdb;
       ...
     }

     ...

     public function process_admin_requests()
     {            
       var_dump($this->_wpdb);     //   нормально печатает всё содержимое члена класса _wpdb
    
       if ( isset( $_POST['some_param'] ) )
       {
         //   здесь необходимо выполнять запросы к базе данных, но почему - то
         var_dump($this->_wpdb); //   выдает null !
         ...    
       }
     }
   }
этот класс находится в файле myplugin_class.php который подключается в другой файл myplugin.php
который принимает ajax запросы с клиента (там всё ок).

Почему в проверке на существование переменной в массиве $_POST член класса _wpdb больше не валиден ?? (тоесть null)
спасибо
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Arramis, потому, что когда у тебя отправляется пост запрос, приложение работает по иному (как - это тебе никто не скажет, так как этого кода мало, чтобы понять) и у тебя твой говнокодерский стиль с global не прокатывает.

PS: сори если грубовато, но global и правда зло

PPS: или в случае пост запроса, ты хочешь сказать, что первый var_dump нормально отрабатывает, а внутри проверки значение нуль?
 

Arramis

Новичок
PPS: или в случае пост запроса, ты хочешь сказать, что первый var_dump нормально отрабатывает, а внутри проверки значение нуль?
да, именно так и происходит. второй var_dump выдает null.
пост запрос формируется на стороне клиента и отправляется нативными средствами js на файл в котором вызывается метод process_admin_requests().
для полноты картины покажу код создания админ страницы для плагина
PHP:
class my_plugin
  {
    private $_wpdb;

    public function __construct()
    {
      global $wpdb;
      $this->_wpdb = $wpdb;

      add_action( 'admin_menu',  array($this, 'my_plygin_menu') );

      ...

    }

    public function randomtext_menu()
    {
      add_menu_page('title', 'title2', 'manage_options', 'identifier', array($this, 'myplugin_options') );
    }

     public function myplugin_options()
     {
        // Здесь код формирующий вид страницы настроек плагина
        // и подключения скрипта который делает поста запрос
     }

    ...

    public function process_admin_requests()
    {
      var_dump($this->_wpdb);  // нормальный оутпут

      if ( isset( $_POST['some_param'] ) )
      {
        var_dump($this->_wpdb); //  здесь выдает null !

        ...

      }
    }
  }
 
Последнее редактирование:

Arramis

Новичок
и да, сорри что забыл сказать, это класс для плагина под wordpress
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Я тебе не верю. Того что ты говоришь - быть не может. Потому, как если свести все в один впевдопример, получим
У нас есть пост запрос, который послан скрипту:
PHP:
...
var_dump($this->_wpdb); // нормальный оутпут
if ( isset( $_POST['some_param'] ) )
{
      var_dump($this->_wpdb); // здесь выдает null !...
}
...
У тебя нет модифицирующих $this->_wpdb конструкций в коде, посему, либо ты не понял моего вопроса, либо 42.
 

Arramis

Новичок
У тебя нет модифицирующих $this->_wpdb конструкций в коде, посему, либо ты не понял моего вопроса
что ты понимаешь под 'У тебя нет модифицирующих $this->_wpdb конструкций в коде' ??
$this->_wpdb я присвоил реальный объект для работы с дб в конструкторе, чтобы в каждом методе не делать global $wpdb
??
 

fixxxer

К.О.
Партнер клуба
с вероятностью 99.99% ты темнишь и там кроме проверки $_POST если другой код, с вероятностью 0.01% происходит какая-то жесть типа zend heap corruption
 

Arramis

Новичок
с вероятностью 99.99% ты темнишь и там кроме проверки $_POST если другой код
ок ок, тогда вот полный код(без правок, черновой) метода обрабатывающий запрос ( кстати данные с клиента приходят нормально )
PHP:
public function process_admin_requests()
        {                          
            //var_dump($this->_wpdb);
            if ( true ) {
                //var_dump($this->_wpdb);
            }
          
            if ( isset( $_POST['RTaction_name'] ) )
            {
                $RTaction_name = $_POST['RTaction_name'];
                $newData; $text_id;
              
                switch($RTaction_name)
                {
                    case "add" :
                        if ( isset($_POST['newData']) )
                        {  
                            $newData = $_POST['newData'];
                            //$this->_wpdb->insert( TABLE_NAME, array('sentence' => $newData), array('%s') );      
                        }                      
                    return;
                    case "update" :
                        if ( isset($_POST['newData']) && isset($_POST['RTtext_id']) )
                        {
                            $newData = $_POST['newData'];
                            $text_id = $_POST['RTtext_id'];
                            //$this->_wpdb->update( TABLE_NAME, array('sentence' => $newData, 'id' => $text_id), array('%s', '%d') );
                        }                      
                    return;
                    case "delete" :
                        if ( isset($_POST['RTtext_id']) )
                        {
                            $text_id = $_POST['RTtext_id'];
                            //$this->_wpdb->delete( TABLE_NAME, array('id' => $text_id), array('%d') );
                        }                      
                    return;
                }
            }
        }
 

fixxxer

К.О.
Партнер клуба
По такой логике получается, что если написать просто-напросто так:

PHP:
public function process_admin_requests() {
var_dump($this->_wpdb);
var_dump($this->_wpdb);
}
то второй var_dump выведет null.

Это так?
 

Arramis

Новичок
По такой логике получается, что если написать просто-напросто так:

PHP:
public function process_admin_requests() {
var_dump($this->_wpdb);
var_dump($this->_wpdb);
}
то второй var_dump выведет null.

Это так?
я не знаю,
знаю что у меня второй var_dump выдает null только когда если он внутри проверки на существование переменной $_POST
 

Arramis

Новичок
афигеть ! оказалось этот $wpdb каким то магическим образом самообнуляется (в целях безопастности чтоли)
подключил его вручную все заработало, я так и думал что это замашки вордпресса))
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
fixxxer, ты веришь в магию и экстрасенсов? Я вот не очень.
 

fixxxer

К.О.
Партнер клуба
c0dex, я верю, что его первый var_dump был где-то в другом месте, потому и задал такой вопрос :) Ну похоже так и оказалось.
 

Arramis

Новичок
c0dex, я верю, что его первый var_dump был где-то в другом месте
неа, первый var_dump был в том же методе (и соотвественно файле), так как я описал в посте здесь, и выводы были именно такие какие я показывал тут, а что я сделал - это подключил всего лишь файл(из стандартного каталога вордпресса) где создаётся этот странный глобальный объект $wpdb, и он стал себя вести подобающе )) почему так - ума не приложу. особенность безопастности cms какая то.
 

Активист

Активист
Команда форума
если вы привели вышуказанной код так, как он есть два вердампа действительно там, то это скорее всего бага PHP под вашу ОС, если конечно эти строки отрабатывали.

Делал я один баг репорт на php.net, там был segmentagion failed в MySQLnd. Мне девелопер сказал так - такого быть не может ни при каких условиях, хотя gdb был предоставлен и трассировка с debug pkg. Перекомпилил сам, ошибки уже не было. Видимо проблема с либами.
 
Сверху