現在の位置: ホーム> 最新記事一覧> PDOのDSN文字列形式の詳細な説明:: __コンストラクトとライティング仕様は、迅速かつ正確に構成するのに役立ちます

PDOのDSN文字列形式の詳細な説明:: __コンストラクトとライティング仕様は、迅速かつ正確に構成するのに役立ちます

gitbox 2025-09-19

PDOを使用する必要がある場合、最初のステップはDSN(データソース名)を正しく記述することです。この記事では、DSN構文、ミスポイント、一般的なデータベースのベストプラクティスを体系的に整理し、直接適用できるコードと検証のサンプルのリストを提供します。

DSNとは何ですか?

  • DSN :PDOに、どのドライバー(MySQL、PGSQL、SQLite…)を伝えます。

  • 場所new PDO($ DSN、$ username、$ password、$ options)

  • 構造<driver>:<key> = <value>; [<key> = <value>;…]

  • ケースの感度:ドライバー名とキー名は通常、ケースに敏感ではありませんが、は異なります(ファイルパスなど)。


一般的なドライバーDSN書き込み方法

1)mysql( mysql

ベース:

 <span><span><span class="hljs-variable">$dsn</span></span><span> = </span><span><span class="hljs-string">'mysql:host=127.0.0.1;port=3306;dbname=app;charset=utf8mb4'</span></span><span>;
</span><span><span class="hljs-variable">$pdo</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">PDO</span></span><span>(</span><span><span class="hljs-variable">$dsn</span></span><span>, </span><span><span class="hljs-string">'user'</span></span><span>, </span><span><span class="hljs-string">'pass'</span></span><span>, [
    PDO::</span><span><span class="hljs-variable constant_">ATTR_ERRMODE</span></span><span> =&gt; PDO::</span><span><span class="hljs-variable constant_">ERRMODE_EXCEPTION</span></span><span>,
]);
</span></span>

重要なポイントとオプション:

  • ホスト:ドメイン名/IPが利用可能です。 UNIXソケットに移動する場合は、 UNIX_SOCKET =/PATH/MYSQL.SOCKを使用して、ホスト/ポートを再度書き込まないでください

  • DBNAME :ターゲットデータベース名。

  • CharsetUTF8MB4に設定することを強くお勧めします。

  • ポート:省略できます。デフォルトは3306です。

  • SSL :MySQL/ドライバーの新しいバージョンは、 PDO :: MySQL_ATTR_SSL_*オプションと組み合わせることができます(記事の最後にある「安全性とパフォーマンスオプション」を参照)。

UNIXソケットの例:

 <span><span><span class="hljs-variable">$dsn</span></span><span> = </span><span><span class="hljs-string">'mysql:unix_socket=/var/run/mysqld/mysqld.sock;dbname=app;charset=utf8mb4'</span></span><span>;
</span></span>

マルチパラメータースプライシングの安全なライティング方法(反ゼミコロン/特殊文字):

 <span><span><span class="hljs-variable">$params</span></span><span> = [
    </span><span><span class="hljs-string">'host'</span></span><span>    =&gt; </span><span><span class="hljs-string">'db.internal'</span></span><span>,
    </span><span><span class="hljs-string">'port'</span></span><span>    =&gt; </span><span><span class="hljs-number">3306</span></span><span>,
    </span><span><span class="hljs-string">'dbname'</span></span><span>  =&gt; </span><span><span class="hljs-string">'app'</span></span><span>,
    </span><span><span class="hljs-string">'charset'</span></span><span> =&gt; </span><span><span class="hljs-string">'utf8mb4'</span></span><span>,
];
</span><span><span class="hljs-variable">$dsn</span></span><span> = </span><span><span class="hljs-string">'mysql:'</span></span><span> . </span><span><span class="hljs-title function_ invoke__">implode</span></span><span>(</span><span><span class="hljs-string">';'</span></span><span>, </span><span><span class="hljs-title function_ invoke__">array_map</span></span><span>(
    fn(</span><span><span class="hljs-variable">$k</span></span><span>,</span><span><span class="hljs-variable">$v</span></span><span>) =&gt; </span><span><span class="hljs-variable">$k</span></span><span> . </span><span><span class="hljs-string">'='</span></span><span> . </span><span><span class="hljs-title function_ invoke__">str_replace</span></span><span>(</span><span><span class="hljs-string">';'</span></span><span>, </span><span><span class="hljs-string">'\;'</span></span><span>, (</span><span><span class="hljs-keyword">string</span></span><span>)</span><span><span class="hljs-variable">$v</span></span><span>),
    </span><span><span class="hljs-title function_ invoke__">array_keys</span></span><span>(</span><span><span class="hljs-variable">$params</span></span><span>),
    </span><span><span class="hljs-variable">$params</span></span><span>
));
</span></span>

2)postgreSQL( PGSQL

ベース:

 <span><span><span class="hljs-variable">$dsn</span></span><span> = </span><span><span class="hljs-string">'pgsql:host=127.0.0.1;port=5432;dbname=app'</span></span><span>;
</span><span><span class="hljs-variable">$pdo</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">PDO</span></span><span>(</span><span><span class="hljs-variable">$dsn</span></span><span>, </span><span><span class="hljs-string">'user'</span></span><span>, </span><span><span class="hljs-string">'pass'</span></span><span>);
</span></span>

キーポイント:

  • ホストはパス(UNIXドメインソケットディレクトリ、通常/var/run/postgreSql )であり、この時点でポートを省略できます。

  • 文字セットは、オプションまたは接続後にセット名を実行するか、 Options = '-Client_Encoding = utf8'を使用することをお勧めします。

  • 一部のシナリオは、host =/var/run/postgresqlの作成方法を好みます。

UNIXソケットの例:

 <span><span><span class="hljs-variable">$dsn</span></span><span> = </span><span><span class="hljs-string">"pgsql:host=/var/run/postgresql;dbname=app"</span></span><span>;
</span></span>

3)sqlite( sqlite

ファイルデータベース:

 <span><span><span class="hljs-variable">$dsn</span></span><span> = </span><span><span class="hljs-string">'sqlite:/path/to/database.sqlite'</span></span><span>;
</span><span><span class="hljs-variable">$pdo</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">PDO</span></span><span>(</span><span><span class="hljs-variable">$dsn</span></span><span>);
</span></span>

インメモリデータベース:

 <span><span><span class="hljs-variable">$dsn</span></span><span> = </span><span><span class="hljs-string">'sqlite::memory:'</span></span><span>;
</span><span><span class="hljs-variable">$pdo</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">PDO</span></span><span>(</span><span><span class="hljs-variable">$dsn</span></span><span>);
</span></span>

キーポイント:

  • パスにスペースまたはセミコロンが含まれている場合は、実際のファイルパスの特殊文字を避けることをお勧めします。 Windowsの下のダブルバックスラッシュまたはスラッシュパスを使用します: c:\\ data \\ db.sqliteまたはc:/data/db.sqlite


4)SQL SERVER( SQLSRVドライバー)

ベース:

 <span><span><span class="hljs-variable">$dsn</span></span><span> = </span><span><span class="hljs-string">'sqlsrv:Server=127.0.0.1,1433;Database=app'</span></span><span>;
</span><span><span class="hljs-variable">$pdo</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">PDO</span></span><span>(</span><span><span class="hljs-variable">$dsn</span></span><span>, </span><span><span class="hljs-string">'user'</span></span><span>, </span><span><span class="hljs-string">'pass'</span></span><span>);
</span></span>

キーポイント:

  • サーバーは、ホスト、ポート、またはホスト名\インスタンスを書き込むことができます。

  • オプションを介してエンコードを設定することをお勧めします: pdo :: sqlsrv_attr_encoding

  • TLS/暗号化は通常、ドライバーオプションを通過します(記事の最後を参照)。

名前付き例:

 <span><span><span class="hljs-variable">$dsn</span></span><span> = </span><span><span class="hljs-string">'sqlsrv:Server=WIN-SRV\\SQLEXPRESS;Database=app'</span></span><span>;
</span></span>

5)Oracle( OCI / OCI8

ベース:

 <span><span><span class="hljs-variable">$dsn</span></span><span> = </span><span><span class="hljs-string">'oci:dbname=//127.0.0.1:1521/ORCL;charset=AL32UTF8'</span></span><span>;
</span><span><span class="hljs-variable">$pdo</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">PDO</span></span><span>(</span><span><span class="hljs-variable">$dsn</span></span><span>, </span><span><span class="hljs-string">'user'</span></span><span>, </span><span><span class="hljs-string">'pass'</span></span><span>);
</span></span>

キーポイント:

  • DBNAMEは// host:port/service_nameまたはlocal tnsnames.oraのエイリアスをサポートしています。

  • 推奨されるAL32UTF8エンコーディング。


6)IBM DB2( IBM

 <span><span><span class="hljs-variable">$dsn</span></span><span> = </span><span><span class="hljs-string">'ibm:DRIVER={IBM DB2 ODBC DRIVER};DATABASE=APP;HOSTNAME=127.0.0.1;PORT=50000;PROTOCOL=TCPIP;'</span></span><span>;
</span><span><span class="hljs-variable">$pdo</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">PDO</span></span><span>(</span><span><span class="hljs-variable">$dsn</span></span><span>, </span><span><span class="hljs-string">'user'</span></span><span>, </span><span><span class="hljs-string">'pass'</span></span><span>);
</span></span>

7)Firebird( Firebird

 <span><span><span class="hljs-variable">$dsn</span></span><span> = </span><span><span class="hljs-string">'firebird:dbname=localhost:/path/to/db.fdb;charset=UTF8'</span></span><span>;
</span><span><span class="hljs-variable">$pdo</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">PDO</span></span><span>(</span><span><span class="hljs-variable">$dsn</span></span><span>, </span><span><span class="hljs-string">'user'</span></span><span>, </span><span><span class="hljs-string">'pass'</span></span><span>);
</span></span>

実用的な規範と間違いを犯しやすい

1)キーと値は、セミコロンによって分離されます。セミコロンが値に表示された場合はどうすればよいですか?

  • 仕様: <driver>:key = value; key = value 、semicolonはセパレーターです。

  • 値にセミコロン(非常にまれな)が含まれている場合は、DSNに詰めるのではなく4番目のパラメーター$オプションに変更するか、セミコロン(環境変数分布、スペルDSNなど)のない構成方法に置き換えることをお勧めします。

2)コーディング設定

  • MySQL :DSNにcharset = utf8mb4を追加することは最も直感的です。複製を避けるために接続後に名前を設定しないでください

  • PostgreSQLオプション-Client_Encoding = utf8を設定するか、接続後にclient_encodingを 'utf8'に設定することをお勧めします。

  • SQL Server :オプションPDO :: SQLSRV_ATTR_ENCODINGSQLSRV_ENCODING_UTF8など)を設定します。

3)ホスト、ポート、ソケットの相互除外

  • mysqlでunix_socketホスト/ポートを使用しないでください

  • PostgreSQLのソケットは、ホストをディレクトリに向けることにより実装されます。

4)Windows PathとBackslash

  • SQLiteなどのファイルパスは Windowsでダブルバックスラッシュまたはフォワードスラッシュ使用することをお勧めします。

5)環境変数と構成センター

  • アカウントのパスワードをウェアハウスにハードコードしないでください:

    • .envdb_dsn = mysql:host =…; dbname =…; charset = utf8mb4

    • ランタイム: $ pdo = new PDO(getEnv( 'db_dsn')、getEnv( 'db_user')、getenv( 'db_pass'));


安全性とパフォーマンスオプション(4番目のパラメーター$オプション

 <span><span><span class="hljs-variable">$opts</span></span><span> = [
    PDO::</span><span><span class="hljs-variable constant_">ATTR_ERRMODE</span></span><span>            =&gt; PDO::</span><span><span class="hljs-variable constant_">ERRMODE_EXCEPTION</span></span><span>, </span><span><span class="hljs-comment">// 例外を投げます,見つけやすい</span></span><span>
    PDO::</span><span><span class="hljs-variable constant_">ATTR_DEFAULT_FETCH_MODE</span></span><span> =&gt; PDO::</span><span><span class="hljs-variable constant_">FETCH_ASSOC</span></span><span>,       </span><span><span class="hljs-comment">// デフォルトで連想配列を返します</span></span><span>
    PDO::</span><span><span class="hljs-variable constant_">ATTR_EMULATE_PREPARES</span></span><span>   =&gt; </span><span><span class="hljs-literal">false</span></span><span>,                  </span><span><span class="hljs-comment">// ドライバーにネイティブの前処理を使用させます(安全性/より安定したパフォーマンス)</span></span><span>
];

</span><span><span class="hljs-comment">// MySQL SSL 例(ドライバーがサポートするとき):</span></span><span>
</span><span><span class="hljs-variable">$opts</span></span><span>[PDO::</span><span><span class="hljs-variable constant_">MYSQL_ATTR_SSL_CA</span></span><span>]   = </span><span><span class="hljs-string">'/etc/ssl/certs/ca.pem'</span></span><span>;
</span><span><span class="hljs-comment">// $opts[PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT] = false; // 検証をスキップする必要がある場合(お勧めしません)</span></span><span>

</span><span><span class="hljs-variable">$pdo</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">PDO</span></span><span>(</span><span><span class="hljs-variable">$dsn</span></span><span>, </span><span><span class="hljs-variable">$user</span></span><span>, </span><span><span class="hljs-variable">$pass</span></span><span>, </span><span><span class="hljs-variable">$opts</span></span><span>);
</span></span>

ヒント:

  • 前処理ステートメントは組み合わせることができますかまたは、SQLインジェクションを回避するためにプレースホルダーに指名されました。

  • 生産環境では、TLS/SSLを有効にする必要があります(サーバーとドライバーの間の共同サポートが必要です)。


構成配列からDSNを安全に構築する(再利用可能な機能)

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">build_mysql_dsn</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-keyword">array</span></span></span><span> </span><span><span class="hljs-variable">$cfg</span></span><span>): </span><span><span class="hljs-title">string</span></span><span> {
    </span><span><span class="hljs-comment">// サポート host/port または unix_socket,空の値を自動的にフィルタリングします</span></span><span>
    </span><span><span class="hljs-variable">$parts</span></span><span> = [];
    </span><span><span class="hljs-variable">$parts</span></span><span>[] = </span><span><span class="hljs-keyword">isset</span></span><span>(</span><span><span class="hljs-variable">$cfg</span></span><span>[</span><span><span class="hljs-string">'unix_socket'</span></span><span>])
        ? </span><span><span class="hljs-string">'unix_socket='</span></span><span> . </span><span><span class="hljs-variable">$cfg</span></span><span>[</span><span><span class="hljs-string">'unix_socket'</span></span><span>]
        : </span><span><span class="hljs-string">'host='</span></span><span> . (</span><span><span class="hljs-variable">$cfg</span></span><span>[</span><span><span class="hljs-string">'host'</span></span><span>] ?? </span><span><span class="hljs-string">'127.0.0.1'</span></span><span>);

    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-keyword">empty</span></span><span>(</span><span><span class="hljs-variable">$cfg</span></span><span>[</span><span><span class="hljs-string">'unix_socket'</span></span><span>]) &amp;&amp; !</span><span><span class="hljs-keyword">empty</span></span><span>(</span><span><span class="hljs-variable">$cfg</span></span><span>[</span><span><span class="hljs-string">'port'</span></span><span>])) {
        </span><span><span class="hljs-variable">$parts</span></span><span>[] = </span><span><span class="hljs-string">'port='</span></span><span> . (</span><span><span class="hljs-keyword">int</span></span><span>)</span><span><span class="hljs-variable">$cfg</span></span><span>[</span><span><span class="hljs-string">'port'</span></span><span>];
    }
    </span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-keyword">empty</span></span><span>(</span><span><span class="hljs-variable">$cfg</span></span><span>[</span><span><span class="hljs-string">'dbname'</span></span><span>])) {
        </span><span><span class="hljs-variable">$parts</span></span><span>[] = </span><span><span class="hljs-string">'dbname='</span></span><span> . </span><span><span class="hljs-variable">$cfg</span></span><span>[</span><span><span class="hljs-string">'dbname'</span></span><span>];
    }
    </span><span><span class="hljs-variable">$parts</span></span><span>[] = </span><span><span class="hljs-string">'charset='</span></span><span> . (</span><span><span class="hljs-variable">$cfg</span></span><span>[</span><span><span class="hljs-string">'charset'</span></span><span>] ?? </span><span><span class="hljs-string">'utf8mb4'</span></span><span>);

    </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-string">'mysql:'</span></span><span> . </span><span><span class="hljs-title function_ invoke__">implode</span></span><span>(</span><span><span class="hljs-string">';'</span></span><span>, </span><span><span class="hljs-variable">$parts</span></span><span>);
}

</span><span><span class="hljs-comment">// 使用法</span></span><span>
</span><span><span class="hljs-variable">$dsn</span></span><span> = </span><span><span class="hljs-title function_ invoke__">build_mysql_dsn</span></span><span>([
    </span><span><span class="hljs-string">'host'</span></span><span>    =&gt; </span><span><span class="hljs-string">'db.internal'</span></span><span>,
    </span><span><span class="hljs-string">'port'</span></span><span>    =&gt; </span><span><span class="hljs-number">3306</span></span><span>,
    </span><span><span class="hljs-string">'dbname'</span></span><span>  =&gt; </span><span><span class="hljs-string">'app'</span></span><span>,
    </span><span><span class="hljs-string">'charset'</span></span><span> =&gt; </span><span><span class="hljs-string">'utf8mb4'</span></span><span>,
]);
</span><span><span class="hljs-comment">// new PDO($dsn, $user, $pass, $opts);</span></span><span>
</span></span>

接続に失敗したトラブルシューティングクイックチェックテーブル

  1. ドライバーがインストールされていませんドライバーを見つけることができませんでし

  2. ホストまたはポートエラーSQLSTATE [HY000] [2002] (MySQL)→ホスト/ポートまたはUNIX_Socketの検証。

  3. データベースは存在しません未知のデータベース 'xxx'DBNAMEを修正するか、最初にライブラリを作成します。

  4. コーディングの問題:Garled Code表示されます

  5. TLS/証明書:SSLハンドシェイクが失敗しました→TLSがサーバーで有効になっているかどうか、証明書がドメイン名と一致するかどうかを確認します。

  6. 許可不足許可拒否またはアクセス拒否→ユーザー名/パスワード、ターゲットライブラリのユーザー許可を確認します。


一般的に使用されるDSNクイックレビュー(収集できます)

 <span><span>MySQL
mysql:host=HOST;port=3306;dbname=DB;charset=utf8mb4
mysql:unix_socket=/path/mysql.sock;dbname=DB;charset=utf8mb4

PostgreSQL
pgsql:host=HOST;port=5432;dbname=DB
pgsql:host=/var/run/postgresql;dbname=DB

SQLite
sqlite:/absolute/path/to/db.sqlite
sqlite::memory:

SQL Server
sqlsrv:Server=HOST,1433;Database=DB
sqlsrv:Server=HOST\INSTANCE;Database=DB

Oracle
oci:dbname=//HOST:1521/SERVICE;charset=AL32UTF8

Db2
ibm:DRIVER={IBM DB2 ODBC DRIVER};DATABASE=DB;HOSTNAME=HOST;PORT=50000;PROTOCOL=TCPIP;

Firebird
firebird:dbname=HOST:/path/to/db.fdb;charset=UTF8
</span></span>
  • 関連タグ:

    PDO