Что такое хорошая оболочка / каркас / библиотеки для работы с интерфейсом PHP-приложений к базе данных SQL? - PullRequest
2 голосов
/ 16 июля 2010

У меня есть таблица

$query=
"CREATE TABLE screenshot ".
"(screenshot_id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, ".
"source_video_id INT UNSIGNED NOT NULL, ".
"screenshot_file_name VARCHAR(128), ".
"x_res INT, ".
"y_res INT, ".
"time INT UNSIGNED);";
mysql_query($query);

Затем я вставляю вещи в эту таблицу.

Я часто хочу выполнить SQL-запрос и выполнить итерацию по результату запроса, но в итоге получаюделать это.

//select all screenshots from video, by video id
    $q0=
    "SELECT * FROM screenshot ".
    "WHERE source_video_id = '$source_video_id' ".
    "AND x_res = 120 ".
    "AND y_res = 90 ".
    "ORDER BY time ASC;";
    $r0 = mysql_query($q0);
    $n0_num = mysql_numrows($r0);

//for each result
for($n0=0;$n0<$n0_num;$n0++) {
    $source_video_id = mysql_result($r0,$n0,'source_video_id');
    $time = mysql_result($r0,$n0,'time');
    $screenshot_file_name = mysql_result($r0,$n0,'screenshot_file_name');

    //do stuff for each returned result!
}

Это просто безобразно.Чтобы получить результаты SQL-запроса, я должен написать это для каждого столбца!$ source_video_id = mysql_result ($ r0, $ n0, 'source_video_id');

Я должен написать уродливый цикл, получить результаты для каждой возвращенной строки и сделать что-то для каждого результата.В основном я хочу что-то вроде:

foreach($SQL_command) {
//Do for each result
}

Я хочу, чтобы переменные столбца для каждой строки уже были установлены, чтобы мне не приходилось делать

$source_video_id = mysql_result($r0,$n0,'source_video_id');

Для каждого столбцаЯ хочу получить доступ!

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

Ответы [ 4 ]

0 голосов
/ 25 декабря 2012

Я использую RedBean во всех своих проектах и ​​рекомендую его без колебаний.Основными причинами являются:

  • Требуется минимальная конфигурация.Мне не нужно отображать схему базы данных в файл YAML или JSON, просто введите параметры подключения и перейдите.
  • Элегантный и простой для понимания синтаксис использования.
  • Множество функций, таких каккак кеширование и древовидные отношения.
  • Довольно хорошая производительность.

А вот пример его использования:

$book = R::dispense('book');
$book->title = 'Gifted Programmers';
$book->author = 'Charles Xavier';
$id = R::store($book);
0 голосов
/ 16 июля 2010

Если у вас включены драйверы PDO (как следует), вы можете использовать один метод DB() как функцию из PHP-фреймворка phunction .Он был вдохновлен слоем абстракции базы данных DiBi .Документация еще продолжается, но Я отправил краткое резюме в этом ответе .

function DB($query)
{
    static $db = null;
    static $result = array();

    if (is_null($db) === true)
    {
        if (preg_match('~^(?:mysql|pgsql):~', $query) > 0)
        {
            $db = new PDO(preg_replace('~^(mysql|pgsql):(?:/{2})?([-.\w]+)(?::(\d+))?/(\w+)/?$~', '$1:host=$2;port=$3;dbname=$4', $query), func_get_arg(1), func_get_arg(2));

            if (preg_match('~^mysql:~', $query) > 0)
            {
                self::DB('SET time_zone = ?;', 'GMT');
                self::DB('SET NAMES ? COLLATE ?;', 'utf8', 'utf8_unicode_ci');
            }
        }

        else if (preg_match('~^(?:sqlite|firebird):~', $query) > 0)
        {
            $db = new PDO(preg_replace('~^(sqlite|firebird):(?:/{2})?(.+)$~', '$1:$2', $query));
        }
    }

    else if (is_a($db, 'PDO') === true)
    {
        if (isset($query) === true)
        {
            $hash = md5($query);

            if (empty($result[$hash]) === true)
            {
                $result[$hash] = $db->prepare($query);
            }

            if (is_a($result[$hash], 'PDOStatement') === true)
            {
                if ($result[$hash]->execute(array_slice(func_get_args(), 1)) === true)
                {
                    if (preg_match('~^(?:INSERT|REPLACE)~i', $query) > 0)
                    {
                        return $db->lastInsertId();
                    }

                    else if (preg_match('~^(?:UPDATE|DELETE)~i', $query) > 0)
                    {
                        return $result[$hash]->rowCount();
                    }

                    else if (preg_match('~^(?:SELECT|EXPLAIN)~i', $query) > 0)
                    {
                        return $result[$hash]->fetchAll(PDO::FETCH_ASSOC);
                    }

                    return true;
                }
            }

            return false;
        }
    }

    return $db;
}

Ваш пример запроса может быть записан как:

// connect to the MySQL server, do this on your config file or something
DB('mysql://host:port/database_name/', 'username', 'password');

// run the query!
$results = DB('SELECT * FROM screenshot WHERE source_video_id = ? AND x_res = ? AND y_res = ? ORDER BY time ASC;', $source_video_id, 120, 90);

foreach ($results as $result)
{
    print_r($result);
}

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

PS : здесь я предвзят, посколькуразработчик фреймворка.Если у вас возникнут проблемы, дайте мне знать.

0 голосов
/ 16 июля 2010

Можно предположить, что я фанат Kohana, но мне это очень нравится.Возьмите Kohana 3 и положите туда Sprig ORM (это вилка из оригинальной Sprig ORM, но с дополнительным «сахаром» :) вместо родной Kohana.Вы поймете, как они прекрасны вместе.Вы можете получить доступ к своим таблицам, как показано в этом коде:

//just the basics, updating existing record
$screenshot = Sprig::factory('Screenshot', $id)->load();
$screenshot->x_res = 240;
$screenshot->y_res = 260;
$screenshot->update();

//creating new one
$screenshot = Sprig::factory('Screenshot');
$screenshot->x_res = 300;
$screenshot->y_res = 250;
$screenshot->create();

Дополнительная ссылка на обсуждение Sprig fork: http://forum.kohanaframework.org/comments.php?DiscussionID=4368

Надеюсь, это вам поможет.

0 голосов
/ 16 июля 2010

Это основы уровня абстракции базы данных .Не сложно программировать самостоятельно, или вы можете использовать универсальную библиотеку, такую ​​как Doctrine или Propel . Каждая заметная PHP framework также включает некоторую форму абстракции базы данных, вам действительно нужно просто начать использовать ее.

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