Каков наилучший подход к обработке запросов БД - PullRequest
2 голосов
/ 17 января 2011

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

На данный момент у меня есть каталог classes, в котором есть файл для каждого класса, и у меня есть еще один каталог с именем db, который включает в себя conn.php, в котором есть строка подключения и другие файлы в db каталог находится в каталоге classes, по одному для каждого класса, но для обработки запросов mysql.

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

Я включаю каждый файл БД в соответствующий файл БД, например, в файле user.class.php, который вы найдете include('db/user.db.php').

Кроме того, я включаю файл conn.php в каждый файл базы данных.

user.class.php

include('db/user.db.php');
class User {
    public $fname;
    public $userid;

    function __construct($userid) {
        $this->user_id = $userid;
        $this->fname = DB_GetFirstName($userid);
        }
}

user.db.php

include('conn.php');
function DB_GetFirstName($userid) {
    $result = mysql_fetch_array(mysql_query("SELECT USR_FName FROM users WHERE USR_ID = '$userid'"));
    return $result[0];
}

conn.php:

$conn = mysql_connect("localhost", "user", "pass");
mysql_select_db("dbname", $conn);

Как вы справляетесь с этим?

Ответы [ 3 ]

3 голосов
/ 17 января 2011

Использовать слой абстракции базы данных . То, что вы сделали, звучит так, как будто это лучший подход, чем необработанные строки SQL, при условии, что вы проверяете ввод и предотвращаете инъекционные атаки.

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

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

1 голос
/ 17 января 2011

Вы уже поступаете правильно, отделяя свой уровень домена от уровня доступа к базе данных. Но способ, которым вы соедините это, мог бы быть улучшен. Взгляните на шаблон Table Data Gateway (TDG).

В шаблоне Table Data Gateway один класс инкапсулирует весь доступ к определенной таблице. Это похоже на ваш User.Db.php, с той разницей, что TDG является реальным классом. Вместо набора функций вы группируете любой связанный доступ к БД в этот конкретный класс. Это дает немедленное преимущество: вы можете передать экземпляр любому классу, который нуждается в нем, вместо того, чтобы жестко кодировать вызовы функций в них.

Всякий раз, когда вам нужно работать с определенной таблицей, вы используете TDG для извлечения / изменения строк из нее. Затем вы можете работать с возвращенными наборами записей. Или используйте DataMapper , чтобы отобразить данные из набора записей в классы вашего домена, например, Ваш пользовательский класс. Для простых DataMappers создание собственного хорошо. Как только он станет более сложным, вам лучше использовать существующий ORM.

Альтернативой TDG будет шаблон Row Data Gateway .

Хорошее введение в TDG (с примером Zend Framework) можно найти на

и для шлюза данных строк

1 голос
/ 17 января 2011

Для небольших проектов я использую очень простой класс php http://code.google.com/p/edb-php-class/

$result = $db->q("select * from `users`limit 3");

foreach($result as $a){
        echo $a['name'].' '.$a['surname'].' '.$a['email'].' '.$a['country'].'</br>';
}

для более широкого использования слоя абстракции базы данных.

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