Почему PHP PDO DSN является другим форматом для MySQL по сравнению с PostgreSQL?

NullPointerException s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException. Они наиболее распространены, но другие способы перечислены на странице NullPointerException javadoc.

Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException, be:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

В первой строке внутри main я явно устанавливаю ссылку Object obj равной null. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.

(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

32
задан Vern Takebayashi 21 January 2012 в 23:33
поделиться

2 ответа

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

class MyPDO extends PDO {
    public function __construct($dsn, $options = null) {
        $user=null;
        $pass=null;

        if (preg_match("/user=([^;]*)/", $dsn, $matches)) {
            $user=$matches[1];
        }
        if (preg_match("/password=([^;]*)/", $dsn, $matches)) {
            $pass=$matches[1];
        }

        parent::__construct($dsn, $user, $pass, $options);
    }
}
0
ответ дан 27 November 2019 в 19:59
поделиться

Как человек, который реализовал и то, и другое, я могу сказать вам, что причина в том, что при передаче строки как есть в postgres (и ODBC) код драйвера PDO для этих баз данных не нужен будет обновляться по мере добавления новых функций в базовую библиотеку.

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

Не случайно; это очень преднамеренно.

89
ответ дан 27 November 2019 в 19:59
поделиться
Другие вопросы по тегам:

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