powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PHP: Доступ из функции в global scope
7 сообщений из 7, страница 1 из 1
PHP: Доступ из функции в global scope
    #38408018
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть у меня примерно такой код:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
...
$dbh = new mysqli(null, $db_name, $db_username, $db_password);
...
function db_query($cmd)
{
    global $dbh;
    $sql = ...;
    $result = $dbh->query($sql);
    return $result;
}
...
$data = db_query("...");
if ($data===false)
{
    // вывод сообщения об ошибке
    ...
}
else
{
    // работа с данными
    ...
}



У меня используется функция db_query, которая выполняет запрос и возвращает результаты (при успешном выполнении) или false (при ошибке). Обычно этого хватает, но для удобства (для логов) хотелось бы дополнительно получить значение mysqli_error.
Не подскажите, как это можно сделать? (речь, ествественно, не о том, чтобы вывести mysqli_error внутри db_query; его нужно получить в том месте, откуда db_query вызывался).

Мне в голову приходит только два способа, но оба мне не нравятся: либо в db_query сохранять значение mysqli_error в глобальную переменную $lastmysqlerror, либо (пользуясь тем, что указатель $dbh глобальный) использовать $dbh->error.
Второй способ конечно получше, но я бы хотел полностью абстрагироваться от глобальных переменных. Может быть в MySQL есть какой-нибудь глобальный стек ошибок?

________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
...
Рейтинг: 0 / 0
PHP: Доступ из функции в global scope
    #38408184
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

ну а кто мешает сделать
echo mysqli_error($dbh);
в том месте где нужно?
...
Рейтинг: 0 / 0
PHP: Доступ из функции в global scope
    #38408435
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: php
1.
2.
3.
4.
$data = db_query("...");
if ($data===false)
{
throw new Exception(mysqli_error())
...
Рейтинг: 0 / 0
PHP: Доступ из функции в global scope
    #38408465
Electric200
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы не советовал так размазывать код. Не совсем правильно в выполняем коде, возвращать результат работы методов mysqli. А если вы захотите к примеру заменить mysqlli на DBAL ? Вам нужно будет по всему коду проверять где вы использовали $mysqli->error_list к примеру.
Логика в том, что обработка ошибок базы данных, должна полностью быть реализована в классе базы данных, и не выходит за его приделы.
К примеру
Код: 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.
    
    protected  $error;
    protected  $query;
    protected  $mysqli;
    
    public function __construct()
    {
        $this->error = false;
        $this->mysqli = new mysqli("localhost", "user", "password", "database");
        if ($mysqli->connect_errno) {
           $this->error = $mysqli->connect_errno;
        }
        
    }
    
    public function query ($query)
    {
        $result = $this->mysqli->query($query);
        $this->query = $query;
        
        if ($this->mysql->error) {
            $this->error = $this->mysql->error_list;
            
        } else {
            return $result;
        }
        
    }
    
    public function getError()
    {
        return $this->error;
    }
    
    public function getQuery()
    {
        return $this->query;
    }
    
}

///////////////Код
$db = new  DB ();
$db->query('SELECT *......');
if ($db->getError() !=false) {
    throw new \Exception('ErrorQuery:'.$db->getQuery().'---ErrorText'.$db->getError());
}


Конечно можно еще и в самом классе DB реализовать логику обработки ошибок с легированием запросом. В таком случае ваш код, вообще не нужно подтачивать под обработку ошибок. Ну здесь уже кому как нравится.
...
Рейтинг: 0 / 0
PHP: Доступ из функции в global scope
    #38408522
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: php
1.
2.
3.
4.
5.
6.
7.
if ($this->mysql->error) {
            $this->error = $this->mysql->error_list;
            
        } else {
            return $result;
        }
        



не пишите так больше.
...
Рейтинг: 0 / 0
PHP: Доступ из функции в global scope
    #38408543
Electric200
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И почему же?
...
Рейтинг: 0 / 0
PHP: Доступ из функции в global scope
    #38408611
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сами подумайте на досуге.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PHP: Доступ из функции в global scope
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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