Sqlstate hy000 general error could not call class constructor

PHP PDO Ошибка соединения с БД: SQLSTATE[HY000]: General error: could not call class constructor? Есть два класса, один с подключением к бд и дочерний с выводом юзеров, при выводе данных падает ошибка: SQLSTATE[HY000]: General error: could not call class constructor класс db Ошибка падает в строке $result = self::querySelect($query,__CLASS__); Если из класса user убрать […]

Содержание

  1. PHP PDO Ошибка соединения с БД: SQLSTATE[HY000]: General error: could not call class constructor?
  2. PHP PDO Ошибка соединения с БД: SQLSTATE[HY000]: General error: could not call class constructor?
  3. Ошибки и их обработка

PHP PDO Ошибка соединения с БД: SQLSTATE[HY000]: General error: could not call class constructor?

Есть два класса, один с подключением к бд и дочерний с выводом юзеров, при выводе данных падает ошибка: SQLSTATE[HY000]: General error: could not call class constructor
класс db

Ошибка падает в строке $result = self::querySelect($query,__CLASS__);
Если из класса user убрать конструктор, то все работает корректно, создаются объекты и выводит все данные, но стоит добавить конструктор, как начинает вылетать такая ошибка, может кто-нибудь подсказать в чем проблема и как исправить эту ошибку?
Код в исполняемом файле:

  • Вопрос задан более трёх лет назад
  • 658 просмотров

Следует отметить, что у этого класса очень много других проблем.

1. Статическая функция для коннекта это картннный буратино, который никакой полезной функции не выполняет, а выполняет только вредную, каждый раз заново соединяясь с базой дынных. Надо хотя бы проверять, еслть ли уже соединение, и возвращать его.
2. prepare с пустым execute — это картннный буратино, который никакой полезной функции не выполняет, а выполняет только вредную, пропуская все инъекции на свете. В prepare надо передавать запрос с плейсхолдерами, а execute массив с переменными для замены.
3. echo «Ошибка соединения с БД: » — это это картннный буратино, который никакой полезной функции не выполняет, а выполняет только вредную. Пользователь из сообщения об ошибке ничего не поймет, а программист о ней ничего не узнает. Для вывода ошибок try должен быть один, глобальный, и выводить их в зависимости от окружения — на домашнем компике можно вываливать прямо на экран, а на боевом сервере только логировать.
4. Пользователь — это не база данных. Поэтому наследовать классу БД он не должен. и уж тем более нет ни малейшего смысла наследовать класс со статическими методами. Объект для работы с БД надо передавать в конструктор и присваивать переменной класса. Либо если это тупой синглтон, то ничего вообще не передавать, а просто вызывать его методы где надо, хотя это неправильно.

При использовании PDO::FETCH_CLASS в результате выборки создаётся новый объект указанного класса. Свойствам объекта будут присвоены значения столбцов, имена которых совпадут с именами свойств. При этом значения назначаются свойствам объекта ДО вызова конструктора. Если свойства с именами, соответствующими названиям столбцов, не существуют, они будут созданы автоматически (с областью видимости public).

Если ваши данные нуждаются в обязательной обработке сразу после их получения из базы данных, ее можно реализовать в конструкторе класса.

Источник

PHP PDO Ошибка соединения с БД: SQLSTATE[HY000]: General error: could not call class constructor?

Есть два класса, один с подключением к бд и дочерний с выводом юзеров, при выводе данных падает ошибка: SQLSTATE[HY000]: General error: could not call class constructor
класс db

Ошибка падает в строке $result = self::querySelect($query,__CLASS__);
Если из класса user убрать конструктор, то все работает корректно, создаются объекты и выводит все данные, но стоит добавить конструктор, как начинает вылетать такая ошибка, может кто-нибудь подсказать в чем проблема и как исправить эту ошибку?
Код в исполняемом файле:

  • Вопрос задан более трёх лет назад
  • 658 просмотров

Следует отметить, что у этого класса очень много других проблем.

1. Статическая функция для коннекта это картннный буратино, который никакой полезной функции не выполняет, а выполняет только вредную, каждый раз заново соединяясь с базой дынных. Надо хотя бы проверять, еслть ли уже соединение, и возвращать его.
2. prepare с пустым execute — это картннный буратино, который никакой полезной функции не выполняет, а выполняет только вредную, пропуская все инъекции на свете. В prepare надо передавать запрос с плейсхолдерами, а execute массив с переменными для замены.
3. echo «Ошибка соединения с БД: » — это это картннный буратино, который никакой полезной функции не выполняет, а выполняет только вредную. Пользователь из сообщения об ошибке ничего не поймет, а программист о ней ничего не узнает. Для вывода ошибок try должен быть один, глобальный, и выводить их в зависимости от окружения — на домашнем компике можно вываливать прямо на экран, а на боевом сервере только логировать.
4. Пользователь — это не база данных. Поэтому наследовать классу БД он не должен. и уж тем более нет ни малейшего смысла наследовать класс со статическими методами. Объект для работы с БД надо передавать в конструктор и присваивать переменной класса. Либо если это тупой синглтон, то ничего вообще не передавать, а просто вызывать его методы где надо, хотя это неправильно.

При использовании PDO::FETCH_CLASS в результате выборки создаётся новый объект указанного класса. Свойствам объекта будут присвоены значения столбцов, имена которых совпадут с именами свойств. При этом значения назначаются свойствам объекта ДО вызова конструктора. Если свойства с именами, соответствующими названиям столбцов, не существуют, они будут созданы автоматически (с областью видимости public).

Если ваши данные нуждаются в обязательной обработке сразу после их получения из базы данных, ее можно реализовать в конструкторе класса.

Источник

Ошибки и их обработка

PDO предлагает на выбор 3 стратегии обработки ошибок в зависимости от вашего стиля разработки приложений.

PDO::ERRMODE_SILENT

До PHP 8.0.0, это был режим по умолчанию. PDO просто предоставит вам код ошибки, который можно получить методами PDO::errorCode() и PDO::errorInfo() . Эти методы реализованы как в объектах запросов, так и в объектах баз данных. Если ошибка вызвана во время выполнения кода объекта запроса, нужно вызвать метод PDOStatement::errorCode() или PDOStatement::errorInfo() этого объекта. Если ошибка вызова объекта базы данных, нужно вызвать аналогичные методы у этого объекта.

PDO::ERRMODE_WARNING

Помимо установки кода ошибки PDO выдаст обычное E_WARNING сообщение. Это может быть полезно при отладке или тестировании, когда нужно видеть, что произошло, но не нужно прерывать работу приложения.

PDO::ERRMODE_EXCEPTION

Начиная с PHP 8.0.0 является режимом по умолчанию. Помимо задания кода ошибки PDO будет выбрасывать исключение PDOException , свойства которого будут отражать код ошибки и её описание. Этот режим также полезен при отладке, так как сразу известно, где в программе произошла ошибка. Это позволяет быстро локализовать и решить проблему. (Не забывайте, что если исключение является причиной завершения работы скрипта, все активные транзакции будут откачены.)

Режим исключений также полезен, так как даёт возможность структурировать обработку ошибок более тщательно, нежели с обычными предупреждениями PHP, а также с меньшей вложенностью кода, чем в случае работы в тихом режиме с явной проверкой возвращаемых значений при каждом обращении к базе данных.

Подробнее об исключениях в PHP смотрите в разделе Исключения.

PDO стандартизирован для работы со строковыми кодами ошибок SQL-92 SQLSTATE. Отдельные драйверы PDO могут задавать соответствия своих собственных кодов кодам SQLSTATE. Метод PDO::errorCode() возвращает одиночный код SQLSTATE. Если необходима специфичная информация об ошибке, PDO предлагает метод PDO::errorInfo() , который возвращает массив, содержащий код SQLSTATE, код ошибки драйвера, а также строку ошибки драйвера.

Пример #1 Создание PDO объекта и установка режима обработки ошибок

= ‘mysql:dbname=testdb;host=127.0.0.1’ ;
$user = ‘dbuser’ ;
$password = ‘dbpass’ ;

$dbh = new PDO ( $dsn , $user , $password );
$dbh -> setAttribute ( PDO :: ATTR_ERRMODE , PDO :: ERRMODE_EXCEPTION );

// PDO выбросит исключение PDOException (если таблица не существует)
$dbh -> query ( «SELECT wrongcolumn FROM wrongtable» );
?>

Результат выполнения данного примера:

Метод PDO::__construct() будет всегда бросать исключение PDOException , если соединение оборвалось, независимо от установленного значения PDO::ATTR_ERRMODE .

Пример #2 Создание экземпляра класса PDO и установка режима обработки ошибок в конструкторе

= ‘mysql:dbname=test;host=127.0.0.1’ ;
$user = ‘googleguy’ ;
$password = ‘googleguy’ ;

$dbh = new PDO ( $dsn , $user , $password , array( PDO :: ATTR_ERRMODE => PDO :: ERRMODE_WARNING ));

// Следующий запрос приводит к ошибке уровня E_WARNING вместо исключения (когда таблица не существует)
$dbh -> query ( «SELECT wrongcolumn FROM wrongtable» );
?>

Источник

Я был занят, пытаясь создать свою собственную платформу (чтобы стать более опытным в этой области), и наткнулся на ошибку, которую я не мог исправить, выполнив поиск в Google … вау …

Я хочу получить данные из базы данных, помещенной в объект / класс. Я делал это раньше, другим способом, которым я учился в школе, но я хотел настроить его и сделать его более динамичным, чтобы я мог использовать его в своей структуре.

Проблема, с которой я столкнулся, заключается в следующем:

SQLSTATE[HY000]: General error: could not call class constructor on line 96

Это функция в моем классе базы данных:

public function getObject($query, $classRootPath)
{
try {
//Check if slashes are double already and make them if not
if(!strpos($classRootPath, "\\")) {
$classRootPath = str_replace("\","\\",$classRootPath);
}

$statement = $this->pdo->prepare($query);
$statement->execute(PDO::FETCH_CLASS, "Campers\Camper"); // I want this path to be $classRootPath once it is working with this dummy data
return $statement->fetchAll();

// return $this->pdo->query($query)->fetchAll(PDO::FETCH_CLASS, "Campers\Camper");

} catch (PDOException $e) {
throw new Exception("DB receive object failed: " . $e->getMessage());
}
}

Эта функция вложена в Database и класс называется Database / Database.php

Следующий класс вложен в Campers и называется Camper.php

class Camper {
public $ID, $date, $camperID;

public function __construct($ID, $date, $camperID)
{
$this->ID = $ID;
$this->date = $date;
$this->camperID = $camperID;
}
}

Единственная причина, по которой я могу думать, что это не работает, это то, что звонок "Campers\Camper" звонит сверху Database, но я не знаю, как избежать этого. Я пробовал с .. но я получил ошибки назад, и это самое близкое, что я могу получить. Здесь он может найти класс, но не может найти конструктор Camper

Я проверил, работает ли мой класс / соединение БД, так что это не ошибка.

Структура моей таблицы соответствует моей Campers конструктор класса.

1

Решение

От PSR-4 spec:

Имя завершающего класса соответствует имени файла, оканчивающемуся на .php. Имя файла ДОЛЖНО совпадать с регистром имени завершающего класса.

Вы, вероятно, не можете создать экземпляр этого Camper класс как есть в любом случае. PSR-4 ожидает, что ваше имя файла соответствует классу. Он должен быть расположен в framework/Campers/Camper.php,

1

Другие решения

Эта ошибка подразумевает, что более чем не удалось вызвать конструктор, она также используется для указания того, что произошла ошибка при ее вызове.

В моем случае, исключение было брошено внутри конструктора. Если вы не распечатываете / не регистрируете трассировку стека, вы можете легко пропустить ее.

Наслаждайтесь!
🙂

0

Я был занят попыткой создать свою собственную инфраструктуру (чтобы стать более опытным в этой области), и наткнулся на ошибку, которую я не смог исправить, выполнив поиск google… wow…

Я хочу получить данные из базы данных, помещенной в объект/класс. Я делал это раньше, иначе я учился в школе, но я хотел настроить его и сделать его более динамичным, чтобы я мог использовать его в своих рамках.

Проблема, на которую я наткнулся, такова:

SQLSTATE[HY000]: General error: could not call class constructor on line 96

Это функция в моем классе базы данных:

public function getObject($query, $classRootPath)
{
    try {
        //Check if slashes are double already and make them if not
        if(!strpos($classRootPath, "\\")) {
            $classRootPath = str_replace("\","\\",$classRootPath);
        }

        $statement = $this->pdo->prepare($query);
        $statement->execute(PDO::FETCH_CLASS, "Campers\Camper"); // I want this path to be $classRootPath once it is working with this dummy data
        return $statement->fetchAll();

        // return $this->pdo->query($query)->fetchAll(PDO::FETCH_CLASS, "Campers\Camper");

    } catch (PDOException $e) {
        throw new Exception("DB receive object failed: " . $e->getMessage());
    }
}

Эта функция вложен в Database и класс называется Database/Database.php

Следующий класс вложен в Campers и называется Camper.php

class Camper {
    public $ID, $date, $camperID;

    public function __construct($ID, $date, $camperID)
    {
        $this->ID = $ID;
        $this->date = $date;
        $this->camperID = $camperID;
    }
}

Единственная причина, по которой я могу думать об этом, не работает, заключается в том, что вызов "Campers\Camper" вызывает верхнюю часть Database, но я не знаю, как избежать этого. Я пробовал с .. но у меня появились ошибки, и это самое близкое, что я могу получить. Здесь он может найти класс, хотя он не может найти конструктор Camper

Я тестировал, если мой класс/соединение db работает, так что не ошибка.

Структура моей таблицы соответствует конструктору класса Campers.








by


asked

Feb 21, 2020



There are two classes, one with the dB connection and the child with the withdrawal of the users, when output falls, the error is: SQLSTATE[HY000]: General error: could not call class constructor
the db class

class db
{
private static $dbh;

public static function getDbh()
{
try {
self::$dbh = new PDO('mysql:host=localhost;dbname=pdo_dev;charset=utf8', 'root', 'root');
self::$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch (PDOException $e) {
echo "Ошибка соединения с БД: ".$e->getMessage();
}
}

public static function querySelect($query,$class)
{
self::getDbh();
$sth = self::$dbh->prepare($query);
$sth->execute();
$result = $sth->fetchAll(PDO::FETCH_CLASS, $class);
return $result;
}
}

класс user

class user extends db
{
protected $id;
protected $name;

function __construct($id,$name)
{
$this->id=$id;
$this->name=$name;
}

/**
* @return mixed
*/
public function getName()
{
return $this->name;
}

/**
* @param mixed $name
*/
public function setName($name)
{
$this->name = $name;
}

public static function getUsers()
{
$query="SELECT * FROM user";
$result = self::querySelect($query,__CLASS__);
return $result;
}
}

Ошибка падает в строке $result = self::querySelect($query,__CLASS__);
Если из класса user убрать конструктор, то все работает корректно, создаются объекты и выводит все данные, но стоит добавить конструктор, как начинает вылетать такая ошибка, может кто-нибудь подсказать в чем проблема и как исправить эту ошибку?
Код в исполняемом файле:

$result = user::getUsers();
foreach ($result as $item) {
echo $item->getName()."<br />";
}

3 Answers








by
mrTeo


answered

Feb 21, 2020



When using PDO::FETCH_CLASS as the result of the selection creates a new object of the specified class. Object properties are assigned the values of the columns whose names coincide with the names of the properties. The values assigned to object properties BEFORE calling the constructor. If the properties with names that match the column names do not exist they will be created automatically (with visibility public).

If your data need to be processed immediately after receiving them from the database, it can be implemented in the constructor of the class.








by
FanatPHP


answered

Feb 21, 2020



It should be noted that this class has so many other problems.

1. Static function to connect it cartny Pinocchio, which has no useful function does not execute and executes only harmful, each time re-connecting with the base of the melon. You should at least check eslt already a connection and return it.
2. prepare empty execute is cartny Pinocchio, which has no useful function does not execute and executes only harmful passing all injection to the light. To prepare you need to pass the query with placeholders, and execute an array with variables to replace.
3. echo «Error connecting to database:» is it cartny Pinocchio, which has no useful function does not, and only performs harmful. The user of the error message do not understand, and the programmer don’t know. For error output, try must be a single, global, and display them depending on the environment — at home kompik, you can dump directly on the screen and combat log server only.
4. The user is not the database. Therefore, to inherit the database class it should not. and certainly there is no sense to inherit the class with static methods. Object for working with DB should be passed to the constructor and assign the class variable. Or if this is a stupid singleton, then nothing at all to convey, and just call its methods where necessary, but this is wrong.

Show more to read here (through the gugloperevodchik)
https://phpdelusions.net/pdo/common_mistakes
https://phpdelusions.net/articles/error_reporting








by
Rsa97


answered

Feb 21, 2020



Are you a child of the user class has defined an explicit constructor, so the constructor of the parent class db is not called automatically. Add to the constructor of the user class explicitly calling parent::__construct();

Was going through the ajax request. Below is the error I have got 

 TemplateFile: SQLSTATE[HY000]: General error: could not call class constructor

 #0 /var/www/ProcessWire/wire/core/Pages.php(0): PDOStatement->fetchObject()
 #1 /var/www/ProcessWire/wire/core/Pages.php(229): Pages->getById(Array, Array)
 #2 [internal function]: Pages->___find('parent_id=1, st...', Array)
 #3 /var/www/ProcessWire/wire/core/Wire.php(365): call_user_func_array(Array, Array)
 #4 /var/www/ProcessWire/wire/core/Wire.php(320): Wire->runHooks('find', Array)
 #5 /var/www/ProcessWire/wire/core/PageTraversal.php(78): Wire->__call('find', Array)
 #6 /var/www/ProcessWire/wire/core/PageTraversal.php(78): Pages->find('parent_id=1, st...', Array)
 #7 /var/www/ProcessWire/wire/core/Page.php(1033): PageTraversal->children(Object(Page), 'start=0, limit=...', Array)
 #8 /var/www/ProcessWire/wire/modules/Process/ProcessPageList/ProcessPageList.module(178): Page->children('start=0, limit=...')
 #9 [internal function]: ProcessPageList->___find('start=0, limit=...', Object(Page))
 #10 /var/www/ProcessWire/wire/core/Wire.php(365): call_user_func_array(Array, Array)
 #11 /var/www/ProcessWire/wire/core/Wire.php(320): Wire->runHooks('find', Array)
 #12 /var/www/ProcessWire/wire/modules/Process/ProcessPageList/ProcessPageList.module(165): Wire->__call('find', Array)
 #13 /var/www/ProcessWire/wire/modules/Process/ProcessPageList/ProcessPageList.module(165): ProcessPageList->find('start=0, limit=...', Object(Page))
 #14 /var/www/ProcessWire/wire/modules/Process/ProcessPageList/ProcessPageList.module(109): ProcessPageList->render()
 #15 [internal function]: ProcessPageList->___execute()
 #16 /var/www/ProcessWire/wire/core/Wire.php(365): call_user_func_array(Array, Array)
 #17 /var/www/ProcessWire/wire/core/Wire.php(320): Wire->runHooks('execute', Array)
 #18 /var/www/ProcessWire/wire/core/ProcessController.php(213): Wire->__call('execute', Array)
 #19 /var/www/ProcessWire/wire/core/ProcessController.php(213): ProcessPageList->execute()
 #20 [internal function]: ProcessController->___execute()
 #21 /var/www/ProcessWire/wire/core/Wire.php(365): call_user_func_array(Array, Array)
 #22 /var/www/ProcessWire/wire/core/Wire.php(320): Wire->runHooks('execute', Array)
 #23 /var/www/ProcessWire/wire/core/admin.php(85): Wire->__call('execute', Array)
 #24 /var/www/ProcessWire/wire/core/admin.php(85): ProcessController->execute()
 #25 /var/www/ProcessWire/site/modules/AdminThemeThinktag/controller.php(13): require('/var/www/Proces...')
 #26 /var/www/ProcessWire/site/templates/admin.php(13): require('/var/www/Proces...')
 #27 /var/www/ProcessWire/wire/core/TemplateFile.php(169): require('/var/www/Proces...')
 #28 [internal function]: TemplateFile->___render()
 #29 /var/www/ProcessWire/wire/core/Wire.php(365): call_user_func_array(Array, Array)
 #30 /var/www/ProcessWire/wire/core/Wire.php(320): Wire->runHooks('render', Array)
 #31 /var/www/ProcessWire/wire/modules/PageRender.module(356): Wire->__call('render', Array)
 #32 /var/www/ProcessWire/wire/modules/PageRender.module(356): TemplateFile->render()
 #33 [internal function]: PageRender->___renderPage(Object(HookEvent))
 #34 /var/www/ProcessWire/wire/core/Wire.php(365): call_user_func_array(Array, Array)
 #35 /var/www/ProcessWire/wire/core/Wire.php(320): Wire->runHooks('renderPage', Array)
 #36 /var/www/ProcessWire/wire/core/Wire.php(387): Wire->__call('renderPage', Array)
 #37 /var/www/ProcessWire/wire/core/Wire.php(387): PageRender->renderPage(Object(HookEvent))
 #38 /var/www/ProcessWire/wire/core/Wire.php(320): Wire->runHooks('render', Array)
 #39 /var/www/ProcessWire/wire/modules/Process/ProcessPageView.module(172): Wire->__call('render', Array)
 #40 /var/www/ProcessWire/wire/modules/Process/ProcessPageView.module(172): Page->render()
 #41 [internal function]: ProcessPageView->___execute()
 #42 /var/www/ProcessWire/wire/core/Wire.php(365): call_user_func_array(Array, Array)
 #43 /var/www/ProcessWire/wire/core/Wire.php(320): Wire->runHooks('execute', Array)
 #44 /var/www/ProcessWire/index.php(195): Wire->__call('execute', Array)
 #45 /var/www/ProcessWire/index.php(195): ProcessPageView->execute()
 #46 {main}

Понравилась статья? Поделить с друзьями:
  • Sqlstate hy000 general error 2013 lost connection to mysql server during query
  • Sqlstate hy000 general error 1205 lock wait timeout exceeded try restarting transaction
  • Sqlstate hy000 general error 1114 the table is full
  • Sqlstate hy000 general error 1005 can t create table
  • Sqlstate hy000 general error 1 no such table