質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

2回答

3342閲覧

DB接続においてFatal error: Uncaught ArgumentCountError: PDO::__construct() expects at most 4 parameters,

Wingmacbook

総合スコア17

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2021/07/14 13:55

編集2021/07/18 03:27

現在、PHPでDB接続関連のコード実装をしているのですが、以下のエラーが解決できず先へ進めません。

Fatal error: Uncaught ArgumentCountError: PDO::__construct() expects at most 4 parameters, 5 given in /var/www/html/index.php:42 Stack trace: #0 /var/www/html/index.php(42): PDO->__construct('mysql:dbname=%s...', 'mzn', 'mzn_db', 'user', 'pass') #1 {main} thrown in /var/www/html/index.php on line 42

はき出されたエラー文が言う該当箇所が以下の「$dbh = 〜」になります。

$user = 'user'; $pass = 'pass'; $db = 'mzn'; $host = 'mzn_db'; try { $dbh = new PDO('mysql:dbname=%s;mydb=%s;charset=utf8/tmp/mysql.sock', $db, $host, $user, $pass); } catch (PDOException $e) { print "エラー:" . $e->getMessage() . "<br/gt;"; die(); $dbh = null; }

試したこと

エラー文からして、パラメーターの数が違うというまでは予測ができました。
そのため、「$dbh = 〜」のパラメーターの数を変えて試してみました。

$user = 'user'; $pass = 'pass'; $db = 'mzn'; try { $dbh = new PDO('mysql:dbname=%s;mydb=%s;charset=utf8/tmp/mysql.sock', $db, $user, $pass); }
$user = 'user'; $pass = 'pass'; $db = 'mzn'; $host = 'mzn_db'; try { $dbh = new PDO($db, $host, $user, $pass); }

しかし、いずれもエラー解消はされませんでした。

「Fatal error〜」で検索して似たような記事も探しましたが、記事も少なく有益な情報を得られずにいます。
どなたか、解決策を教えてください。

追記

回答者の方の情報を元にsprintf~を加えて以下のようにしてみました。

$dbh = new PDO(sprintf('mysql:host=localhost,dbname=%s test;charset=utf8/tmp/mysql.sock', $db), $user, $pass);

すると、「Fatal error:~」は解消されましたが、以下のようなエラーが返ってきました。

エラー:SQLSTATE[HY000] [2019] Unknown character set

「character setを知らない」ということなので「charset=utf8/tmp/mysql.sock」のところがいけないのかと思い調べてみたところ、
「utf-8のハイフンはいらない」という答えばかりで「charset=utf8」としていてハイフンのないので違う、いくつかのブログ記事や知り合いの見せてもらったコードには「/tmp/mysql.sock」の部分がないことが多かったので「/tmp/mysql.sock」をなくしてみましたが、

エラー:SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name or service not known

と返ってきたのでこれも違う。「charset=utf8」をどうにかするまでは予測ができましたが、解消の方法がわかりません。
加えてのような形になりますが、「エラー:SQLSTATE[HY000] [2019] Unknown character set」の解消方法について、どなたか情報いただけないでしょうか?
よろしくお願いします。

追記2

上に追記した
「エラー:SQLSTATE[HY000] [2019] Unknown character set」
のエラーですが、今回の質問の内容から大きく逸脱するので改めて質問を投げようと思います。
今回の「Fatal error〜」ですがsprintf~を加えて、

$dbh = new PDO(sprintf('mysql:host=localhost,dbname=%s test;charset=utf8/tmp/mysql.sock', $db), $user, $pass);

とすることで「Fatal error〜」が出なくなりました。

情報をくださった方、ありがとうございます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

new PDOするところのDSN文字列の書き方がおかしいので、PHPマニュアルの該当ページをみて点検してほしい。

DSN文字列、MySQL向けの説明はPHP: PDO_MYSQL DSN - Manualにあります。
PHPでデータベースに接続するときのまとめ - Qiitaの「データベースに接続」のあたりもセットで見ると良いです。

「mysql:dbname=test;host=localhost;port=3306;charset=utf8mb4」みたいになります。
dbnameとhostとcharsetは必要だと思ったほうがいいです。
portはデフォルトの3306と違う場合には指定が必要になります。3306で良ければ指定を省けます。
hostとportの指定の代わりにunix_socketを使うこともできます。
決して、%sのまま放置しないように。おそらくsprintf()するのを忘れているんだろうと思いますが。

投稿2021/07/14 14:29

編集2021/07/15 00:11
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

起きている現象の理由についてはエラーの通り

PDO::__construct() expects at most 4 parameters, 5 given

PDO::__construct()は最大で4つのパラメーターを期待している。(が、)5つが与えられた

仕様なので既存回答通りPHPマニュアルを確認すること。

PDO

public __construct(
string $dsn,
string|null $username = null,
string|null $password = null,
array|null $options = null
)

まずは第一引数DSNについてまず知った方が良いと思います。
DSN【DB】とは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

大抵は接続先のDB情報が入ります。

  1. DBはmysqlですよ
  2. 接続先hostはlocalhostですよ(IPやサーバー固有名が入ることもある)
  3. その中のhogeというDBに繋ぎますよ
  4. 文字コードはUTF8ですよ

のように。

MySQLで使えるDSN設定は下記
PDO_MYSQL DSN
設定例もあります。
※つまり使うDBによって必要な設定が違うということ。他のDBもMySQLと同じでいけるとは限らないので注意。

接続先DBまで書きますし、PHPマニュアルの通り、第2引数、第3引数がユーザー・パスワードなので、DB名はDSNに含むので不要です。

%sを利用したいのでしたらsprintf()などを使う必要があります。

php

1 $dbh = new PDO(sprintf('mysql:host=localhost,dbname=%s;charset=utf8/tmp/mysql.sock', $db), $user, $pass); 2

蛇足ですが、DSN文字列に変なところに空白を入れて失敗する人も多いので、下記参考
[PHP+MySQL]DSNの駄目なスペースはどれか
※「大丈夫なスペースを覚える」のではなく「スペースを入れない」が正解

投稿2021/07/14 20:33

編集2021/07/14 20:34
m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問