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

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

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

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

Q&A

解決済

2回答

3084閲覧

PDOを使ってMYSQLに接続する際に出てしまうエラーの対処法について。またエラーログを日本語で表示する方法とは

tomoko100

総合スコア4

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

0グッド

0クリップ

投稿2021/05/02 12:30

現在、YoutubeでPDOの勉強・練習をしております。
動画の通りに記述したはずなのですが、どういう訳かエラーが出てしまいます。
これは何が原因なのでしょうか。また、その解決するにはどのようにすればよいのでしょうか。
それとエラーログを日本語で表示する方法があればぜひご教示頂きたく存じます。

ぜひ、皆様のお知恵をお貸しいただけないでしょうか。
何卒よろしくお願い申し上げます。

以下がコードとエラーログでございます。

エラーログ
Fatal error: Uncaught TypeError: PDO::__construct() expects parameter 4 to be array, string given in /home//www/test2.php:18 Stack trace: #0 /home//www/test2.php(18): PDO->__construct() #1 {main} thrown in /home/*******/www/test2.php on line 18

PHP

1コード 2<?php 3ini_set("display_errors",1); 4?> 5<!DOCTYPE html> 6<html> 7<head> 8 <title>練習</title> 9 <meta charset="UTF-8"> 10</head> 11<body> 12 13<?php 14$dsh = "mysql:host=mysql.*******.sakura.ne.jp;dbname=test:charset=utf8"; 15$user= "*****"; 16$pass= "*****"; 17 18 19$dbh = new PDO($dsn, $user, $pass, opt); 20 21var_dump($dsh); 22 23?> 24</body> 25</html> 26

Youtube動画URL
https://youtu.be/zz7KzILdBpU

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

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

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

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

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

guest

回答2

0

ベストアンサー

回答

動画の通りに記述したはずなのですが、どういう訳かエラーが出てしまいます。
これは何が原因なのでしょうか。また、その解決するにはどのようにすればよいのでしょうか。
それとエラーログを日本語で表示する方法がどうがにかぎったことで存じます。

まずは、デバッグの方法まできちんと説明している教材を探すこと or わからなくなったらわかるまで繰り返し端から端まで動画を見直すことをお勧めします。

  • Teratail等の質問掲示板で動画を見てまで回答をしようとする人はほぼ居ないので、動画で学習するのであれば投稿者に質問をしてみるなどのアプローチがお勧めです。今回は動画を見てみましたが、今後は見ないと思います。

と言いつつ、すこし気になったので該当の部分と思われるところを見たところ
optについて、スライドでは質問中の記述をしていますが、
イメージ説明

実際のコードを記述している部分では記述が異なっています
イメージ説明

のでその辺を見直してみてください。
この前後や別の動画でこの辺りの表記の意図について説明があるのかもしれませんね。
この動画シリーズの場合、一部分を摘まんで書いてみるというのは想定していない構成に見えます。

エラーログについて

エラーログ
Fatal error: Uncaught TypeError: PDO::construct() expects parameter 4 to be array, string given in /home//www/test2.php:18 Stack trace: #0 /home//www/test2.php(18): PDO->construct() #1 {main} thrown in /home/***/www/test2.php on line 18

直訳すると
PDOのコンストラクタの第四引数は配列である必要があるのに文字列が入っている
というエラーです。
今回のケースだと
$dbh = new PDO($dsn, $user, $pass, opt);optが配列ではないと言われています。
正しい記述は前述のあたりの動画を見てみてください。

それとエラーログを日本語で表示する方法があればぜひご教示頂きたく存じます。

あるのかもしれませんが、仮にあったとしても無意味かつ有害です。

  • 無意味な理由

というのも、プログラミング言語のエラーメッセージはほとんどの場合で機械翻訳による直訳で十分なくらいの情報しかもっていません。
仮に日本語で表示できたところで機械翻訳以上の情報が得られ無いのです。
今回のケースだと

Fatal error: Uncaught TypeError: PDO::construct() expects parameter 4 to be array, string given in

をgoogle翻訳しても

致命的なエラー:キャッチされていないTypeError:PDO :: construct()は、パラメーター4が配列であり、文字列がで指定されていることを想定しています。

となり、情報量は全く変わりません。
この直訳からそのあとの

今回のケースだと `$dbh = new PDO($dsn, $user, $pass, opt);`の`opt`が配列ではないと言われています。

を導き出しているのは英語能力に依るものではなく、PHPそのものに対する理解に依るものです。

  • 有害な理由

エラーメッセージの意味がPHPの理解としてわからない場合、エラーメッセージで検索することが有効な手法ですが、日本語に訳されてしまったエラーメッセージで検索してもまともな情報は集まらないため、原文以外でエラーが表示されることは非常に大きな問題になります。

投稿2021/05/02 13:21

tanat

総合スコア18713

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

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

tomoko100

2021/05/02 13:39

ご丁寧かつ詳細なご回答ありがとうございました。 また、私の質問のためにお時間を頂戴してしまい、大変申し訳ございませんでした。 今後は動画は載せないよう気を付けます。 一日かけても解決しなかったことなので、ご教示頂けて本当に感謝いたしております。 動画をこれからご指摘いただいた部分をよく見直し、再チャレンジしてみます。 エラーログの読み方がよくわからない時は、Google翻訳でも大丈夫とのことをお教えいただけたので、今後は、直接理解できるようになるまでは、翻訳機能を活用していこうと思います。 改めて、ありがとうございました。
tanat

2021/05/02 14:08

> 今後は動画は載せないよう気を付けます。 難しいところですよね。 動画中で表示されているコード原文や表記も合わせた表記、具体的な時間を指定するなどの工夫があれば、教材が動画でも回答は付きやすくなると思います。 動画はクオリティの差も激しいので、 Progate等の有料コースで質問できるような教材を試してみるのもお勧めです。 個人的には(関係者では無いですが、実際に読んでみて良くできてると思った書籍です) https://www.amazon.co.jp/gp/product/B08X9XY72Z/ 等の書籍による学習か、基本的な開発方法に慣れるまではProgate等の有料コースで質問を出来る環境を用意されることをお勧めします。
guest

0

英語が苦手なようでしたら、エラーメッセージをGoogle翻訳やDeepLなどに突っ込んで見てください。以下の部分で「4番目のパラメーター(引数)を配列で指定してね」的なメッセージが出ていることがわかります。

PDO::construct() expects parameter 4 to be array

以下の箇所ですね。optが変数ではなく裸の文字列として指定されています。

php

1$dbh = new PDO($dsn, $user, $pass, opt);

特にオプションを指定しないのであれば第4引数は未指定でかまいません。

php

1$dbh = new PDO($dsn, $user, $pass);

PHPの場合エラーメッセージは原則として英語になりますが、翻訳サイトにコピペすれば比較的すぐにわかりますし、日常的に出会うパターンはそれほど多くないので回数をこなしているとそのうち身体が覚えますよw

またこの段階ではそこまで実行されていないのかエラーメッセージとして現れていないようですが、

  1. DSNを指定するところで変数名が$dshとなっていますが$dsnでは
  2. testのあとがセミコロンではなくコロンになっています

おそらく次はここでコケると思いますので合わせて修正されるとよろしいかと思います。

php

1$dsh = "mysql:host=mysql.*******.sakura.ne.jp;dbname=test:charset=utf8"; 2 ↓ 3$dsn = "mysql:host=mysql.*******.sakura.ne.jp;dbname=test;charset=utf8";

投稿2021/05/02 13:29

編集2021/05/02 13:38
katsubemakito

総合スコア72

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

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

tomoko100

2021/05/02 13:50

動画付きの面倒な質問にも関わらず、ご回答くださり、ありがとうございました。 エラーログを表示する方法は最近学んだのですが、今度はそれを理解するのに苦戦することとなってしまい、最近の悩みでもあったので、ひとまず翻訳機能で理解しながら慣れていくようにしたいと思います。 修正箇所をご指摘くださり、ありがとうございました。 間違いがないかチェックしたつもりだったのですが、全くザルでした、、、。 セミコロンとコロンの使い分けでミスがよくあるので、要勉強ですね。 本当にありがとうございました。
退会済みユーザー

退会済みユーザー

2021/05/02 14:04

ココ、間違ってますよ。 「optが変数ではなく裸の文字列として指定されています。」 エラー内容は、opt の中身が配列じゃないって言ってます。 Undefined constant "opt"~ にならないんですね。。。 ちょっと不思議です。
katsubemakito

2021/05/02 14:16

> te2jiさん エラー内容についての言及はその上の段落でしているので、ご指摘いただいた箇所はコード上で誤った箇所についての説明になります。
退会済みユーザー

退会済みユーザー

2021/05/02 21:30

opt は「裸の文字列」ではないです。「未定義の定数」です。 echo opt; でエラーを確認して define("opt", "hoge"); echo opt; で挙動を確認してみてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問