Разработка общего интерфейса базы данных на PHP

Вы можете создать пользовательское событие «отменить выбор» относительно безболезненно, но поскольку вы уже обнаружили, что стандартное событие изменения запускается только на недавно установленном переключателе, а не на ранее проверенном, который только что был снят.

Если вы хотите сказать что-то вроде:

$("#one").on("deselect", function() {
    alert("Radio button one was just deselected");
});

Затем запустите что-то вроде следующей функции из обработчика готового документа (или поместите код непосредственно в документ готов обработчик):

function setupDeselectEvent() {
    var selected = {};
    $('input[type="radio"]').on('click', function() {
        if (this.name in selected && this != selected[this.name])
            $(selected[this.name]).trigger("deselect");
        selected[this.name] = this;
    }).filter(':checked').each(function() {
        selected[this.name] = this;
    });
}

Рабочая демонстрация: http://jsfiddle.net/s7f9s/2

Что это делает, так это поместить обработчик кликов на все радиостанции на странице (это не останавливает добавление ваших собственных обработчиков событий кликов к тем же радиостанциям), которые будут проверять, было ли ранее выбранное радио в той же группе (то есть с тем же именем), и если это вызвано событие «отменить выбор» на , которое радио. Затем он сохраняет только что щелкнутый, как текущий. Событие «отменить выбор» не запускается, если вы нажмете уже проверенную радиостанцию ​​или если ранее не было отмечено. Бит .filter().each() в конце состоит в том, чтобы отметить, какие радиостанции уже выбраны . (Если вам нужно обслуживать более одной формы на той же странице, имеющей независимые радиогруппы с таким же именем, тогда обновите соответствующую функцию соответственно.)

11
задан lamas 21 March 2010 в 21:05
поделиться

11 ответов

Если вам нужна скорость, используйте необработанные запросы (но вам действительно следует использовать PDO с подготовленными запросами ).

Если вам нужно что-то еще ООП, вы можете - как вы это предлагаете - спроектировать это с помощью помощников.

Однажды я разработал нечто подобное, имевшее следующую концепцию:

  1. классы подключения / обработчика БД (обработка множественных подключений к разным базам данных и различным серверам, таким как MySQL, Oracle и т. Д.);
  2. A класс на действие (например, SELECT, DELETE и т. д.);
  3. Классы фильтров (например, RangeFilter);

Код выглядел примерно так:

$select = new Select('field1', 'field2', );
$result = $select->from('myTable')
                 ->addFilter(SQLFilter::RangeFilter, 'field2')
                 ->match(array(1, 3, 5))
                 ->unmatch(array(15, 34))
                 ->fetchAll();

Это простой пример того, как вы можете его построить.

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

Это может показаться долгой и тяжелой работой, но на самом деле , на создание всех этих функций у вас не уйдет так много времени (≈1 месяц).

3
ответ дан 3 December 2019 в 08:03
поделиться

изучали ли вы http://www.doctrine-project.org/ или другие фреймворки php orm (на ум приходит zend_db )?

5
ответ дан 3 December 2019 в 08:03
поделиться

Три совета:

  • Используйте хранимые процедуры (чтобы можно было отделить php от базы данных)
  • Используйте PDO / MySQLi для подготовленных операторов CALL NEWS_LIST (?,?)
  • Используйте статический класс для своей БД. Позволяет получить к нему доступ в любом модуле.
2
ответ дан 3 December 2019 в 08:03
поделиться

Поймите это: взаимодействие с базой данных - это решенная проблема.

Итак, если вы действительно не хотите это делать а) для опыта или б) потому что у вас ОКР и вы хотите знать каждый символ кода, который вы будете использовать, я бы выбрал существующее решение.

И их много: PEAR :: MDB2, Zend :: Db, Creole, Doctrine, Propel, и это лишь некоторые из них.

0
ответ дан 3 December 2019 в 08:03
поделиться

Необработанный SQL по-прежнему является для меня победителем, мне нравится контролировать то, что я отправляю на сервер (для таких случаев, как использование индекса, сложные предложения JOIN и т. Д.), Поэтому я обычно избегаю вспомогательных функций.

Вам следует использовать PDO, который уже предоставляет много возможностей, а если этого недостаточно, вы можете расширить это (возможно, с помощью ваших собственных функций, таких как проверка совпадений в Memcached / APC перед фактическим запросом к базе данных). Вы также можете расширить класс для реализации ваших собственных функций SQL, например:

function getUser($user_id) {
    return $this->query("SELECT * FROM users WHERE id = " . (int) $user_id);
}

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

$this->db->query("SELECT * FROM users WHERE id = " . (int) $user_id);

и получать тот же результат. Функции должны действовать просто как ярлыки, и расширенный класс не должен включаться в структуру, так как он будет зависеть от сайта.

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

1
ответ дан 3 December 2019 в 08:03
поделиться

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

Например, у вас может быть такой файл, как models / Customers.php, с таким кодом:

<?php

class Customers {

    public function getById($id) {
        $sql = "SELECT first_name, last_name FROM customers WHERE id='$id'";
        $res = $DB::getRow($sql);
        return ($res);
    }
}

Я предполагаю, что какой-то помощник БД уже создан и доступен как $ DB. Здесь - простой, использующий PDO.

Теперь вы должны включить это в свой модуль и использовать следующий способ:

<?php

include_once "models/Customers.php";

$customers = new Customers();
$theCustomer = $customers->getById(intval($_REQUEST['cust_id']));


echo "Hello " . $theCustomer['first_name']

Ура.

6
ответ дан 3 December 2019 в 08:03
поделиться

Если вы все же планируете создать класс базы данных, возможно, стоит задуматься о том, чтобы сделать его синглтоном, что позволит вам использовать его без объявления / создания, поскольку ...

global $db;
$db = new db;
$db->query ('... sql ...');

в некотором роде излишне, когда вы можете сделать

db::query ('... sql ...');

У меня есть набор функций SQL, которые я использую почти регулярно, чтобы свести то, что раньше было многострочным экранированным партией SQL до одного вызова, например:

get_element ($table, $element, $value, $column='id');
get_row ($table, $value, $column='id');

Итак, если вы просто хотите получить имя из таблицы «клиенты», где идентификатор равен 4 вам:

$name = db::get_element ('customers', 'name', 4);

Также существуют сопутствующие функции query_element и query_row, где вы просто передаете ему строку SQL, и она возвращает один элемент / строку.

Наряду с функциями для вставки / обновления, например

$array = array (
    'name' => 'bob jones',
    'age' => 28
);
$insert_id = db::insert_array ('customers', $array);

$customer_details = db::get_row ('customers', $insert_id);

$customer_details['age'] = 30;

db:update_array ('customers, $customer_details);

Создает новую строку, извлекает детали, обновляет возраст, а затем повторно записывает их в базу данных.

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

Если вам все же нужно использовать что-либо со сложными объединениями, то всегда лучше создать для этого функцию, например, getCustomerInfo (), но если вам просто нужен общий поиск значений таблицы, создание множества пользовательских методов просто увеличивает вероятность ошибок в одном из них. Кроме того, очень важно экранирование данных - если вы можете использовать как можно больше не-sql и направить его через несколько основных функций, вы можете довольно легко убедиться, что все правильно экранировано.

Если вы хотите взглянуть на мой собственный класс базы данных, дайте мне знать.

-4
ответ дан 3 December 2019 в 08:03
поделиться

Вы похожи на меня. Вы видели http://github.com/Xeoncross/micromvc и один файл ORM в http://github.com/Xeoncross/database ? Покопайтесь в моем коде, и я думаю, вы найдете то, что ищете.

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

Оба хороши.

1
ответ дан 3 December 2019 в 08:03
поделиться

Не то чтобы я знаю окончательный ответ (и не думаю, что он существует), но я подумал, что могу просто поделиться тем, что у меня есть здесь. Я использую свою собственную базу данных, легкую (~ 1000 строк в настоящее время) и простую в использовании. Моей главной целью было упростить использование sql, а не «скрыть» его от программиста (меня :). Некоторые примеры:

 // row() is 'query' + 'fetch' in one
 $user = $db->row("select * from users where id=25");

 // the same, injection safe
 $user = $db->row("select * from users where id=?", $_GET['id']);

 // ? placeholders are smart
 $someUsers = $db->rows("select * from users where id IN(?)", array(1, 2, 10));

 // ...and even smarter
 $data = array('name' => 'Joe', 'age' => 50);
 $id = 222;
 $db->exec("update users set ?a where id=?", $data, $id);

 // 'advanced' fetch functions
 $topNames   = $db->vlist("select name from users order by name limit 10");
 $arrayOfIds = $db->nlist("select id from users where age > 90");

 // table() returns a Table Gateway
 $db->table('users')->delete('where id=?', 25);

 // yes, this is safe
 $db->table('users')->insert($_POST);

 // find() returns a Row Gateway object
 $db->table('users')
     ->find('where name=?', 'Joe')
     ->set('status', 'confirmed')
     ->save();
1
ответ дан 3 December 2019 в 08:03
поделиться

Я только что отказался от пути "вспомогательных функций", и меня беспокоило то, что я продолжал добавлять функции в один файл, который все увеличивался и увеличивался. с идентичными, похожими или несуществующими функциями. Я думаю, что количество строк было 600, и, на мой взгляд, это много для одного файла. Это не оттолкнуло меня от этой идеи, но я буду более организован к следующему походу. Я, вероятно, разделю функции db на несколько файлов в соответствии с операцией db (выберите, вставьте и т. Д.).

Так что мой совет - попробовать «вспомогательные функции» и быть как можно более организованным.

Кроме того, я впервые использовал PDO, и он мне очень понравился. Это не такая низкотехнологичная, как функции mysql (), или такая раздутая технология, как некоторые, о которых мы могли бы упомянуть, но не будем. Я снова буду использовать PDO.

0
ответ дан 3 December 2019 в 08:03
поделиться

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

Я использую синглтон Класс MySQL для обработки соединения и самых простых запросов, а также возможных ошибок.

Отдельные страницы, такие как / users / show / 1 (с использованием mod_rewrite), не используют необработанный SQL, а используют какой-то легкий ORM, который работает как в следующем примере:

$user = $this->db
             ->users
             ->getBy( 'id', $id );

$ this-> db - это экземпляр класса Database Abstraction с методом __ get ($ tableName) . Затем доступ к неопределенному свойству users запускает его.Остальное объясняется само собой; Запрос формируется из аргументов, переданных в getBy () (им также обрабатывается экранирование SQL), и его результаты возвращаются в виде массива.

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

$user = $this->db
             ->users
             ->new;
$user->id = 2;
$user->name = 'Joe';
$user->save( );

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

Я знаю, что это не может конкурировать с уже существующими чрезвычайно мощными ORM и фреймворками, но я все еще создаю его по некоторым причинам, упомянутым в одном из моих комментариев выше.

0
ответ дан 3 December 2019 в 08:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: