Обработка ошибок базы данных Codeigniter, пытаясь охватить все мои возможные сценарии - PullRequest
0 голосов
/ 18 мая 2018

Я пытаюсь охватить все свои базы в случае, если моя база данных MYSQL возвращает какие-либо ошибки (без строк, без подключения, без таблицы и т. Д.), Когда я делаю запрос с использованием CodeIgniter 3.

У меня есть вспомогательная функция, которая возвращает широту и долготу на основе предоставленного почтового индекса.Он всегда будет возвращать только одну строку (если запись завершена).Вот моя вспомогательная функция на данный момент:

if (!function_exists('get_coordinates_from_zipcode')) {

    //gets latitude and longitude coordinates from supplied zipcode. Returns array
    function get_coordinates_from_zipcode($zipcode) {
        $ci =& get_instance();
        $ci->load->database();

        $query = $ci->db->get_where('Geo', array('zip =' => $zipcode))->row_array();

        if (!$query) {
            return FALSE;
        } else {
            return $query;
        }
    }
    //* Fields returned from geolocation database *//
    /*  -zip
        -lat
        -lng
    // Returns false on error or no records
    */

}

А вот мой View, который я использую (передавая ему массив $data['array'] из моего Controller):

<?php if ($array == FALSE || !$array) : ?>
<?php echo "No data returned"; ?>
<?php else : ?>
<?php echo $array['zip'] . ' is located at ' . $array['lat'] . ' and ' . $array['lng']; ?>
<?php endif; ?>

Это хорошо работает, если строк нет, но я хочу решить любые другие проблемы, например, более одной строки (маловероятно, что это произойдет), или если есть проблема с подключением к базе данных или таблице.

Я пробовал это в моем Helper

if ($ci->db->error()) {
        return $ci->db->error(); //
    } else {
        return $query;
}

Когда я делаю это и намеренно использую недопустимый почтовый индекс, чтобы передать ошибку в представление, $ci->db->error() всегда возвращает array(2) { ["code"]=> int(0) ["message"]=> string(0) "" } ипустой.И, конечно, я получаю ошибки, которые Undefined index: lat и Undefined index: lng

Должен ли я передавать массив $ci-db->error() в представление и действовать там?

Я просто хочу убедиться,все мои базы покрыты.По моему мнению, я должен обрабатывать ошибки в функции Helper, но error() всегда кажется пустым, даже когда есть ошибка (например, нет строк, нет подключения к БД или нет таблицы с таким именем.

Я чувствую, что

if (!$query) {
    return FALSE;
} else {
    return $query;
}

внутри моей вспомогательной функции не покроет все проблемы, которые могут возникнуть при подключении к базе данных.

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Я не понимаю цели вашего помощника здесь - если вы не используете модель и если вы обходите контроллер здесь, почему вы вообще сначала используете Codeigniter?

Теперь ваш вопрос

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

возможный подход

Модель

class Geo_model extends CI_Model
{
    public function __construct()
    {
        $this->load->database();
    }

    public function get_coordinates_from_zipcode($zipcode = false)
    {
        if (!$zipcode)  throw new InvalidArgumentException('Zipcode should be set');

        $query = $this->db
            ->select('*')
            ->from('Geo')
            ->where('zip', $zipcode)
            ->get();

        $arrError = $this->db->error();

        if (isset($arrError['message']) && !empty($arrError['message']))    throw new RuntimeException($arrError['message']);

        if ($query->num_rows() != 1)    throw new RuntimeException('Query - Number of rows should be 1');

        return $query->row_array();

    }
}

контроллер

class Geo extends CI_Controller
{

    public function coordinatesfromzipcode($zipcode)
    {
        $this->load->model('Geo_model');
        try
        {
            $row = $this->Geo_model->get_coordinates_from_zipcode($zipcode);
            //load your coordinates view
        }
        catch (Excepetion $e)
        {
            //load an error view or something like that...
            echo $e->getMessage();
        }

    }
}
0 голосов
/ 18 мая 2018

Почему бы вам просто не сделать следующее:

if (!function_exists('get_coordinates_from_zipcode')) {

    //gets latitude and longitude coordinates from supplied zipcode. Returns array
    function get_coordinates_from_zipcode($zipcode) {
        $ci =& get_instance();
        $ci->load->database();

        if ($ci->db->conn_id === false) {
            return false; // connection couldn't be established
        }

        $query = $ci->db->get_where('Geo', array('zip =' => $zipcode));

        if ($query && $query->num_rows() == 1) {
            return $query->row_array();
        }
        return false;
    }
    //* Fields returned from geolocation database *//
    /*  -zip
        -lat
        -lng
    // Returns false on error or no records
    */

}

Таким образом:

  1. Вы протестировали, что запрос не вернул ЛОЖНЫЙ результат
  2. Вы проверяете, что получаете только 1 строку
  3. Вы удостоверяетесь, что установили соединение с БД (кажется, немного излишним)

Обратите внимание: вам следует всегда проверяйте значение num_rows() перед попыткой доступа к результирующему массиву / объекту.Если строк нет, вы получите неопределенные индексы при попытке доступа к массиву.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...