programing

PHP PDO DSN이 MySQL과 PostgreSQL의 다른 형식인 이유는 무엇입니까?

yellowcard 2023. 10. 7. 09:46
반응형

PHP PDO DSN이 MySQL과 PostgreSQL의 다른 형식인 이유는 무엇입니까?

PDO를 사용하여 MySQL 데이터베이스에 연결할 때 연결해야 하는 방법은 다음과 같습니다.

$pdoConnection = new PDO("mysql:host=hostname;dbname=databasename",user,password);

그러나 Postgre의 경우SQL, DSN이 더 표준(IMO)임:

$pdoConnection = new PDO("pgsql:host=hostname;dbname=databasename;user=username;password=thepassword");

MySQL에서 문자열을 하나도 사용할 수 없는 이유가 있습니까?아니면 제가 사용하고 있는 버전(PHP 5.2, MySQL 5.0, Postgre) 때문인가요?SQL 8.1)?

이 두 가지를 모두 구현한 사용자로서 문자열을 그대로 전달하여 포스트그레스(그리고 ODBC)를 생성하면 기본 라이브러리에 새로운 기능이 추가되므로 데이터베이스의 PDO 드라이버 코드를 업데이트할 필요가 없기 때문이라고 말씀드릴 수 있습니다.

MySQL은 고유의 연결 문자열 파싱 코드가 없기 때문에, 우리는 고정된 매개 변수를 가진 매우 특정한 API를 가진 기본적인 MySQL 함수 호출에 데이터를 전달하는 메커니즘을 발명했습니다.

사고는 없습니다. 아주 고의적입니다.

이것은 새로운 기능에서 볼 수 있듯이 PHP 7.4에서 해결되었습니다.

현지에서 다음과 같이 쓸 수 있음을 확인했습니다.

$dbh = new PDO('mysql:host=localhost;dbname=my_db;charset=utf8mb4;user=root;password=')

네, 이 API 불일치가 큰 골칫거리입니다.

이를 해결하기 위해 쿼리 문자열 구문을 사용하여 실제 DSN 문자열을 선택적 사용자 이름과 암호로 팩한 다음 다음 다음과 같이 구문 분석 및 구성합니다.

parse_str($connection_string, $params);

$pdo = new PDO($params['dsn'], @$params['username'], @$params['password']);

그래서 Postgre의 경우SQL, a를 사용합니다.$connection_string예:

dsn=pgsql:host=localhost;dbname=test;user=root;password=root

MySQL의 경우 다음과 같은 문자열을 사용합니다.

dsn=mysql:host=localhost;dbname=testdb&username=root&password=root

좀 어설프긴 하지만, 간단하면서도 효과가 있습니다.

이 질문은 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);
    }
}

언급URL : https://stackoverflow.com/questions/237367/why-is-php-pdo-dsn-a-different-format-for-mysql-versus-postgresql

반응형