Обработка ошибок БД и отображение их пользователю - PullRequest
0 голосов
/ 07 августа 2011

У меня очень простой вопрос.

Есть ли способ связать ошибки базы данных с правильно сформированным предупреждением?

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

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'peter' for key 'username'

Я действительно не хочу показывать это пользователю, но что-то вроде:выбранное имя пользователя уже занято "

Как лучше всего определить ошибку и вывести правильно сформированное предупреждение?

Заранее спасибо

Ответы [ 3 ]

0 голосов
/ 07 августа 2011

Вы можете сначала проверить, занято ли имя пользователя:

$num_rows_aff = SELECT * FROM table where username = 'peter';

If($num_rows_aff > 0)
{
  // Username exists, Output "Username is taken";
}else{
  // Insert username into database
}
0 голосов
/ 07 августа 2011

Вы можете попробовать написать некоторые базовые функции базы данных, например, существующие () и другие, для которых вы можете передать пользовательскую строку ошибки.Примерно так:

<?php

class DB {

    private $_instance;

    public function __construct() {
        $this->_instance = new MySQLI('server','username','password','database');
    }

    public function exists($sql, $msg) {
        $result = $this->_instance->query($sql);

        if ($result->num_rows > 0) {
            throw new FrontDBException($msg);
        }

        return false;
    }

}

class FrontDBException extends Exception {
    public function __toString() {
        echo($this->getMessage());
    }
}

$db = new DB();

try {
    $db->exists('SELECT id FROM users WHERE username="' . $username . "'",
            'Username is already taken.');
} catch(FrontDBException $e) {
    echo($e);
}

?>

Но вы не можете предсказать поступающие ошибки, когда вы просто выполняете базовые запросы, вам нужно как-то обернуть их в определенные функции.

0 голосов
/ 07 августа 2011

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

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

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