Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PHP: Доступ из функции в global scope / 7 сообщений из 7, страница 1 из 1
26.09.2013, 09:26
    #38408018
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP: Доступ из функции в global scope
Есть у меня примерно такой код:
Код: 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
26.09.2013, 11:47
    #38408184
r u
r u
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP: Доступ из функции в global scope
Alibek B.,

ну а кто мешает сделать
echo mysqli_error($dbh);
в том месте где нужно?
...
Рейтинг: 0 / 0
26.09.2013, 14:00
    #38408435
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP: Доступ из функции в global scope
Код: php
1.
2.
3.
4.
$data = db_query("...");
if ($data===false)
{
throw new Exception(mysqli_error())
...
Рейтинг: 0 / 0
26.09.2013, 14:11
    #38408465
Electric200
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP: Доступ из функции в global scope
Я бы не советовал так размазывать код. Не совсем правильно в выполняем коде, возвращать результат работы методов 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
26.09.2013, 14:47
    #38408522
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP: Доступ из функции в global scope
Код: php
1.
2.
3.
4.
5.
6.
7.
if ($this->mysql->error) {
            $this->error = $this->mysql->error_list;
            
        } else {
            return $result;
        }
        



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


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