現在、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〜」が出なくなりました。
情報をくださった方、ありがとうございます。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。