powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / mysqli_stmt - как заполучить fetch_object?
6 сообщений из 6, страница 1 из 1
mysqli_stmt - как заполучить fetch_object?
    #37906617
_Промешан_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Версия PHP < 5.3
В общем такая ситуация.
Кое-где подсмотрел как получить fetch_assoc, по аналогии сделал fetch_array. Придумал и как сделать fetch_object, но разумеется криво. Задача - получить схожий синтаксис как при mysql_fetch_object. То есть ->SomeField, без скобок и тд.
Если можете поправьте.

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
  class stmt_Ex extends mysqli_stmt
  {
      protected $varsBound = false;
      protected $results;
      public function __construct($link, $query)
      {
          parent::__construct($link, $query);
      }
      public function bind_param2($params){
        if (!empty($params))
          return call_user_func_array(array($this,"bind_param"), $params);
      }
      protected function createClass($res){
        $meta = $this->result_metadata();
        $cwls = "Class feobj { protected \$results; public function __construct(\$res){ \$this->results = \$res;}";
        while ($v = $meta->fetch_field()){
          $cwls .="public \$$v->name; ";
        }
        $cwls .= " public function fillparams() { foreach(\$this->results as \$k => \$v) { \$this->\$k = \$v;} } }";
        eval($cwls);
        return new feobj($res);
      }
      protected function fillvarsBound(){
          if (!$this->varsBound) {
              $meta = $this->result_metadata();
              while ($column = $meta->fetch_field()) {
                  // this is to stop a syntax error if a column name has a space in
                  // e.g. "This Column". 'Typer85 at gmail dot com' pointed this out
                  $columnName = str_replace(' ', '_', $column->name);
                  $bindVarArray[] = &$this->results[$columnName];
              }
              call_user_func_array(array($this, 'bind_result'), $bindVarArray);
              $this->varsBound = true;
          }
        
      }
      public function fetch_object(){
          $this->fillvarsBound();
          if ($this->fetch() != null) {
              foreach ($this->results as $k => $v) {
                  $results[$k] = $v;
              }
              $fo = $this->createClass($results); // создает необходимый класс
              $fo->fillparams();  // заполняет поля класса чтобы работал вызов fo->Field;
              return $fo;
          } else {
              return null;
          }      
      }
  }


То есть для одного раза тема работает. Но при следующем фетче, разумеется, ругается на создание класса feobj (нельзя его создавать дважды). Посему у меня два решения:
1. как-то убить класс перед повторным созданием
2. спросить на форуме sql.ru как это реализовать правильно

Благодарю.
...
Рейтинг: 0 / 0
mysqli_stmt - как заполучить fetch_object?
    #37906619
_Промешан_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так, разобрался кажется.

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
  class stmt_obj {
      protected $Arr = array();
      public function __get ($_indexes) {
        return $this->Arr[$_indexes];
      }

      public function __set ($_indexes, $_values) {
        $this->Arr[$_indexes] = $_values;
      }

      public function __isset ($_indexes) {
        return isset($this->Arr[$_indexes]);
      }

      public function __unset ($_indexes) {
        unset($this->Arr[$_indexes]);
      }      
  }

Если что не так - пишите.
Ф-ия fetch_object Изменилась так:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
public function fetch_object(){
          $this->fillvarsBound();
          if ($this->fetch() != null) {
              $obj = new stmt_obj();
              foreach ($this->results as $k => $v) {
                  $results[$k] = $v;
                  $obj->$k = $v;
              }
              return $obj;
          } else {
              return null;
          }      
      }
...
Рейтинг: 0 / 0
mysqli_stmt - как заполучить fetch_object?
    #37906678
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: php
1.
2.
$a = array('a'=>123, 'b'=>456);
$a = (object)$a;
...
Рейтинг: 0 / 0
mysqli_stmt - как заполучить fetch_object?
    #37906760
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
mysqli_stmt - как заполучить fetch_object?
    #37907723
_Промешан_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hettа ваще http://php.net/manual/ru/mysqli-result.fetch-object.php спасибо за первое сообщение.
А вот со ссылкой - разве mysqli_stmt приводится к mysqli_result?
...
Рейтинг: 0 / 0
mysqli_stmt - как заполучить fetch_object?
    #37907734
_Промешан_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Просто в mysqli_stmt мне нужны методы bind_param для ввода параметризмрованного запроса, что могло бы помочь против типичных sql injection, то есть не посредством конкатенации, но еще и с проверкой типа. Ничего кроме bind_param не нашел кроме как в sqli_stmt. но в нем же нет fetch array и fetch assoc и fetch object.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / mysqli_stmt - как заполучить fetch_object?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]