ZendFramework Ошибка вызова класса mysqli внутри Zend FrameWork 3

donpadlo

Новичок
Доброе! Не могу понять где туплю..

Контроллер:
Код:
<?php

namespace Application\Controller;


use Zend\Mvc\Controller\AbstractActionController;

use Zend\View\Model\ViewModel;


use Application\Common\CommonServices;

use Application\Common\MySQL;


class IndexController extends AbstractActionController{       

    var $sqln;

    public function __construct() {       

       $this->$sqln=new MySQL();

           $this->$sqln->connect("localhost",'root','ввв','222');

     }

Класс работы с MySQL:

Код:
<?php


namespace Application\Common;


class MySQL {


    var $idsqlconnection;


    var $query_result;


    var $num_queries = 0;


    function connect($host, $name, $pass, $base,$codemysql="utf8"){       


        $this->idsqlconnection = new mysqli($host, $name, $pass, $base);


...
При вызове из __construct() команды
$this->$sqln->connect("localhost",'root','ввв','222');,

Zend
Framework 3 вываливается с ошибкой:
Код:
Error

File:

    /var/www/webuseorg4/module/Application/src/Common/MySQL.php:22

Message:

    Class 'Application\Common\mysqli' not found
 

donpadlo

Новичок
Ага, дошло класс mysqli находится в другом пространстве имен. Его нужно вызывать "от корня": new \mysqli($host, $name, $pass, $base);
 

donpadlo

Новичок
да и php подучить стоит
Кстати о птичках. Видимо не зря описался. Ставлю $this->sqln=new MySQL(.., ZFW3 вываливается с ошибкой:

Message: Object provided to Escape helper, but flags do not allow recursion

А как раз с $ работает как нужно. Странно...
 
Последнее редактирование:

Фанат

oncle terrible
Команда форума
Это странно, но создавать в объекте свойство с именем из пустой строки всё равно не стоит.

Кстати, еще о непрошенных советах.
Только заметил, что соединение с БД создается заново в каждом объекте.
рекомендую к прочтению, Your first database wrapper's childhood diseases
 

Фанат

oncle terrible
Команда форума
А можно поинтересоваться мотивацией?
Ну то есть с одной стороны я понимаю что соединение создается в экшене, и контроллер представляет собой инкарнацию классического пхп в отдельных файлах.
Но это все-таки фреймворк, и в формировании страницы могут использоваться несколько сервисов. И количество соединений может быстро выйти из-под контроля.
 

donpadlo

Новичок
А можно поинтересоваться мотивацией?
Ну то есть с одной стороны я понимаю что соединение создается в экшене, и контроллер представляет собой инкарнацию классического пхп в отдельных файлах.
Но это все-таки фреймворк, и в формировании страницы могут использоваться несколько сервисов. И количество соединений может быстро выйти из-под контроля.
Пока не разобрался как по другому "притащить" в контроллер созданный и с открытым соединением самописный глобальный класс по работе с MySQL. Ну и собственно в конечном итоге и подумал, что всё равно скорее всего будет : одна открытая страница = один раз выполненный метод конструктора __construct(). А раз не разобрался, пока решил оставить как есть, чтоб не утонуть в частностях во время обучения данному фреймворку. Ибо других пока проблем которые не получается решить хватает..
 

donpadlo

Новичок
Вполне допустима конструкция вида:

Код:
<?php
namespace Application\Controller;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
use Application\Common\CommonServices;
use Application\Common\MySQL;
class IndexController extends AbstractActionController{       
    public static $sqln;
    public function __construct(array $config) {     
            self::$sqln=new MySQL();
            self::$sqln->connect($config['database']['host'],$config['database']['username'],$config['database']['password'],$config['database']['basename']);           
     }
 
Сверху