За последние 24 часа нас посетили 23564 программиста и 1664 робота. Сейчас ищет 821 программист ...

mysqli - отлов ошибки отсутствия прав на БД

Тема в разделе "Прочие вопросы по PHP", создана пользователем DarkElf, 28 июл 2008.

  1. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    PHP:
    1. <?php
    2. try{
    3.     $this->mysqli = new mysqli('server','login','pass','my_db');
    4.     if(!$this->mysqli){
    5.         throw new Exception('connect databases faild!');
    6.     }
    7. } catch(Exception $e) {
    8.     $this->_fault($e->getMessage());
    9. }
    10. ?>
    прав на БД у учетной записи нет. но и не выдается ошибки, она выявляется позже.

    вопрос: можно ли как-то отловить либо как-то переписать код, чтобы отлавливать ошибку отсутствия прав на базу?
     
  2. dAllonE

    dAllonE Guest

    А если вместо:

    PHP:
    1.  
    2. <?php
    3.    if(!$this->mysqli){
    4.           throw new Exception('connect databases faild!');
    5.    }
    6. ?>
    7.  
    Поставить

    PHP:
    1.  
    2. <?php
    3.    if ($this->connect_errno()) {
    4.           throw new Exception('connect databases faild!');
    5.    }
    6. ?>
    7.  
     
  3. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    dAllonE
    не-а

    PHP:
    1. <?php
    2. try{
    3.     $this->mysqli = new mysqli('server','login','pass','my_db');
    4.     if($this->mysqli->connect_error){
    5.         exit('1');
    6.         throw new Exception('connect databases faild!');
    7.     } else {
    8.         exit('2');
    9.     }
    10. } catch(Exception $e) {
    11.     $this->_fault($e->getMessage());
    12. }
    13. ?>
    выводит "2", прав на базу нет
     
  4. dAllonE

    dAllonE Guest

    Хм... А если тогда по ламерски делать SET db сразу же после коннекта? ;)
     
  5. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    DarkElf
    Я на днях тоже пробовал отловить ошибку базы при подключении. Если она не доступна, почему-то вываливается ошибка + мой текст исключения... Не уж то придется по старинке die();..
     
  6. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Сделайте new, connect и select_db и обработайте ошибки при каждом - то всё будет норм :)
     
  7. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    Kreker

    а die() тоже не помогает.. при использовании такого конструктора, похоже, недоступность базы по правам вообще не проверяется.

    Psih

    имхо, разовый случай, хотя и отнявший на поиски причины пару часов. не стоит ради него что-то переписывать:)
     
  8. EugeneTM

    EugeneTM Активный пользователь

    С нами с:
    19 апр 2008
    Сообщения:
    85
    Симпатии:
    0
     
  9. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    PHP:
    1. <?php
    2. class my{
    3.     public function __construct(){
    4.         try{
    5.             $this->mysqli = new mysqli('server','login','pass','my_db');
    6.             if(mysqli_connect_error()){
    7.                 throw new Exception('Ошибка соединения с БД: '.mysqli_connect_error());
    8.             }
    9.         }
    10.         catch(Exception $e) {
    11.             $this->_fault($e->getMessage());
    12.         }
    13.     }
    14.     private function _fault($error){
    15.         exit($error);
    16.     }
    17. }
    18. ?>
    Код (Text):
    1. Ошибка соединения с БД: Access denied for user 'login'@'server' to database 'my_db'
    т.е. ошибка именно отсутствия прав доступа к конкретной базе данных.

    EugeneTM

    так что работает и без обертки, разница в том, что ошибки при соединении вылавливаются только в функции mysqli_connect_error(). НО, если обычную ошибку пробовать отлавливать с помощью mysqli_error(), то будет NULL...

    PHP 5.2.5
     
  10. EugeneTM

    EugeneTM Активный пользователь

    С нами с:
    19 апр 2008
    Сообщения:
    85
    Симпатии:
    0
    Обертка не помешает не только при коннекте. Ошибки анализировать с ифами нафиг тебе не нада. Сделаешь это один раз и все. Жить проще станет.
    Этот код без обертки напиши и сравни

    PHP:
    1. try{
    2. $myLink = new MyMySQLi($host, $Login, $Password, $db);
    3. $myLink ->myQuery("SET NAMES 'utf8';");
    4. $myLink ->myQuery("SET SESSION collation_connection = 'utf8_general_ci';");
    5. } catch (Exception $e) {
    6. // .......
    7. }
     
  11. EugeneTM

    EugeneTM Активный пользователь

    С нами с:
    19 апр 2008
    Сообщения:
    85
    Симпатии:
    0


    PHP:
    1. function __construct($host, $userName, $passwd, $dbName) {
    2. parent::__construct($host, $userName, $passwd, $dbName);
    3. if [b](mysqli_connect_errno())[/b] {
    4. throw new Exception(mysqli_connect_error(), mysqli_connect_errno());
    5. }
    6. }
     
  12. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    EugeneTM, а что мешает переопределить метод query? Зачам заводить второй метод с именем myQuery?
     
  13. EugeneTM

    EugeneTM Активный пользователь

    С нами с:
    19 апр 2008
    Сообщения:
    85
    Симпатии:
    0
    Тупо, чтоб не путаться.
    Переопределить в принципе ничего мешать не должно.