Является эта обертка для PDO 'хорошим кодом'? Есть ли какие-либо потенциальные проблемы?

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

public static List<String> getPaths(Node root) {
    List<String> paths = new LinkedList<>();
    if(root == null)
        return paths;
    Stack<Pair<Node, String>> stack = new Stack<>();
    stack.push(new Pair<>(root, ""));
    while(!stack.isEmpty()) {
        Pair<Node, String> cur = stack.pop();
        Node node = cur.getKey();
        String prefix = cur.getValue() + node.name;
        if(node.childs == null || node.childs.isEmpty())
            paths.add(prefix);
        for(Node child: node.childs)
            stack.push(new Pair<>(child, prefix + "/"));
    }
    return paths;
}
5
задан alex 6 March 2009 в 03:55
поделиться

5 ответов

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

Что-то Вы могли бы хотеть рассмотреть среди других вещей:

  • Поскольку это - код PHP5, используйте исключения вместо trigger_error и set_exception_handler при необходимости, пока исключения не более широко распространены, но это - определенно инструмент для очистки и более соответствующий требованиям завтрашнего дня.
  • Вы используете одиночный элемент, это не плохая вещь обязательно, но в этом случае, например, один недостаток будет то, что Вы только сможете обработать одно соединение с одной базой данных.
  • Я не знаю, используете ли Вы хранимые процедуры, но хранимая процедура могла бы возвратить набор результатов через query() метод также.
  • У Вас есть две точки с запятой (;;) в конце Вашего new PDO строка.

Однако я не думаю, что Ваш метод запроса является слишком большим и нет очень, который можно было вспомнить откуда-либо там в данный момент. Хотя, как только Вы видите две или три строки, которые можно было назвать от другой функции, разделял его. Это - хороший путь к DRY.

5
ответ дан 13 December 2019 в 22:17
поделиться

Да и нет.

Это - хороший код для простого быстрого и грязного приложения.

Проблема возникает при использовании этого в более сложном структурированном приложении. Где обработка ошибок будет варьироваться, в зависимости от которого sql Вы выполняетесь.

Также любые серьезные ошибки разоблачат как "проблема в строке 999" ошибок типа, где 999 находится в Вашей супер duper стандартной программе, и Вы испытаете затруднения при прослеживании ее до конкретного запроса SQL.

Сказав, что я делаю этот вид вещи сам все время на маленьких проектах.

2
ответ дан 13 December 2019 в 22:17
поделиться

Вот то, что я использовал (просто заменяют ссылки на Zzz_Config с $GLOBALS ['db_conf'] или что-то):

/**
 * Extended PDO with databse connection (instance) storage by name.
 */
class Zzz_Db extends PDO
{
    /**
     * Named connection instances.
     *
     * @var array
     */
    static private $_instances;

    /**
     * Retrieves (or instantiates) a connection by name.
     *
     * @param  string $name  Connection name (config item key).
     * @return Zzz_Db        Named connection.
     */
    static public function getInstance($name = null)
    {
        $name = $name === null ? 'db' : "db.$name";
        if (!isset(self::$_instances[$name])) {
            if (!$config = Zzz_Config::get($name)) {
                throw new RuntimeException("No such database config item: $name");
            }
            if (!isset($config['dsn'])) {
                if (!isset($config['database'])) {
                    throw new RuntimeException('Invalid db config');
                }
                $config['dsn'] = sprintf('%s:host=%s;dbname=%s',
                    isset($config['adapter']) ? $config['adapter'] : 'mysql',
                    isset($config['host']) ? $config['host'] : 'localhost',
                    $config['database']);
            }

            $db = self::$_instances[$name] = new self(
                $config['dsn'],
                isset($config['username']) ? $config['username'] : null,
                isset($config['password']) ? $config['password'] : null);
            $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            //$db->setAttribute(PDO::ATTR_STATEMENT_CLASS, 'Zzz_Db_Statement');

            if ($db->getAttribute(PDO::ATTR_DRIVER_NAME) == 'mysql') {
                $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
                $db->exec('SET CHARACTER SET utf8');
            }
        }

        return self::$_instances[$name];
    }
}

Использование было бы:

$db = Zzz_Db::getInstance(); // or Zzz_Db::getInstance('some_named_db')
$stmt = $db->prepare('SELECT ...

Цель состоит в том, чтобы сохранить конфигурацию дб в *.ini файле (доступной для редактирования некодером).

2
ответ дан 13 December 2019 в 22:17
поделиться

Для ответа на вопрос, если это - хороший код или нет, спрашиваете, себя:
Какова добавленная стоимость моего кода по сравнению с использованием PDO непосредственно?

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

Также попытайтесь считать Платформу Зенда реализации классом DB, который работает самостоятельно и поддерживает PDO.

0
ответ дан 13 December 2019 в 22:17
поделиться

Я пошел другим путем и сделал класс, который расширяет PDO с помощью набора функций обертки вокруг prepare()/execute(), и это намного более хорошо, чем созданный в функциях (хотя это немного субъективно...).

Еще одна вещь: необходимо установить PDO::ATTR_EMULATE_PREPARES кому: false если Вы не используете действительно старую версию mysql (<=4.0). Это принимает значение по умолчанию к true, то, которое является огромной головной болью и вызывает вещи прервать неясные пути..., которые я предполагаю, является причиной, у Вас есть огромная обертка вокруг bindParam() во-первых.

1
ответ дан 13 December 2019 в 22:17
поделиться
Другие вопросы по тегам:

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