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

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

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

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

PHP

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

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

解決済

1回答

3572閲覧

CakePHPでマイグレーションを実行したら、DBに繋がらない

inko

総合スコア18

MySQL

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

PHP

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

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

1クリップ

投稿2019/01/08 06:51

編集2019/01/08 12:07

前提・実現したいこと

『CakePHP超入門』の本でPHPを勉強中ですが、マイクレーションを使う章で、マイグレーションファイルは作成できていますが、その後のマイグレーションを実行しようとするとエラーになってしまいます(5章276P)。

エラー内容としては、DBに繋がらないようなものだと思うのですが、現在5章で、その章までは問題なく、localhostで繋がってサンプルなども確認できていました。

具体的に書けていないかも知れませんが、助けて下さい。お願いします。

発生している問題・エラーメッセージ

Exception: There was a problem connecting to the database: SQLSTATE[HY000] [2002] No such file or directory in [/Applications/MAMP/htdocs/mycakeapp/vendor/robmorgan/phinx/src/Phinx/Db/Adapter/MysqlAdapter.php, line 121] 2019-01-07 16:19:18 Error: [InvalidArgumentException] There was a problem connecting to the database: SQLSTATE[HY000] [2002] No such file or directory in /Applications/MAMP/htdocs/mycakeapp/vendor/robmorgan/phinx/src/Phinx/Db/Adapter/MysqlAdapter.php on line 121 Stack Trace: #0 /Applications/MAMP/htdocs/mycakeapp/vendor/robmorgan/phinx/src/Phinx/Db/Adapter/PdoAdapter.php(136): Phinx\Db\Adapter\MysqlAdapter->connect() #1 /Applications/MAMP/htdocs/mycakeapp/vendor/robmorgan/phinx/src/Phinx/Db/Adapter/AdapterWrapper.php(469): Phinx\Db\Adapter\PdoAdapter->getConnection() #2 /Applications/MAMP/htdocs/mycakeapp/vendor/cakephp/migrations/src/CakeAdapter.php(56): Phinx\Db\Adapter\AdapterWrapper->getConnection() #3 /Applications/MAMP/htdocs/mycakeapp/vendor/cakephp/migrations/src/Command/CommandTrait.php(78): Migrations\CakeAdapter->__construct(Object(Phinx\Db\Adapter\TimedOutputAdapter), Object(Cake\Database\Connection)) #4 /Applications/MAMP/htdocs/mycakeapp/vendor/robmorgan/phinx/src/Phinx/Console/Command/Migrate.php(74): Migrations\Command\Migrate->bootstrap(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput)) #5 /Applications/MAMP/htdocs/mycakeapp/vendor/cakephp/migrations/src/Command/CommandTrait.php(35): Phinx\Console\Command\Migrate->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput)) #6 /Applications/MAMP/htdocs/mycakeapp/vendor/cakephp/migrations/src/Command/Migrate.php(67): Migrations\Command\Migrate->parentExecute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput)) #7 /Applications/MAMP/htdocs/mycakeapp/vendor/symfony/console/Command/Command.php(255): Migrations\Command\Migrate->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput)) #8 /Applications/MAMP/htdocs/mycakeapp/vendor/symfony/console/Application.php(901): Symfony\Component\Console\Command\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput)) #9 /Applications/MAMP/htdocs/mycakeapp/vendor/symfony/console/Application.php(262): Symfony\Component\Console\Application->doRunCommand(Object(Migrations\Command\Migrate), Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput)) #10 /Applications/MAMP/htdocs/mycakeapp/vendor/symfony/console/Application.php(145): Symfony\Component\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput)) #11 /Applications/MAMP/htdocs/mycakeapp/vendor/cakephp/migrations/src/Shell/MigrationsShell.php(108): Symfony\Component\Console\Application->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput)) #12 /Applications/MAMP/htdocs/mycakeapp/vendor/cakephp/cakephp/src/Console/Shell.php(532): Migrations\Shell\MigrationsShell->main('migrations', 'migrate') #13 /Applications/MAMP/htdocs/mycakeapp/vendor/cakephp/migrations/src/Shell/MigrationsShell.php(164): Cake\Console\Shell->runCommand(Array, true, Array) #14 /Applications/MAMP/htdocs/mycakeapp/vendor/cakephp/cakephp/src/Console/CommandRunner.php(342): Migrations\Shell\MigrationsShell->runCommand(Array, true) #15 /Applications/MAMP/htdocs/mycakeapp/vendor/cakephp/cakephp/src/Console/CommandRunner.php(164): Cake\Console\CommandRunner->runShell(Object(Migrations\Shell\MigrationsShell), Array) #16 /Applications/MAMP/htdocs/mycakeapp/bin/cake.php(12): Cake\Console\CommandRunner->run(Array) #17 {main}

該当のソースコード

PHP

1//121 2try { 3 $db = new \PDO($dsn, $options['user'], $options['pass'], $driverOptions); 4 } catch (\PDOException $exception) { 5 throw new \InvalidArgumentException(sprintf( 6 'There was a problem connecting to the database: %s', 7 $exception->getMessage() 8 )); 9 }

試したこと

色々探しましたが、下のサイトが自分の状況に合ってたので試しましたが、解決できませんでした。
https://qiita.com/kzyamax/items/69641125798266502c7b

エラーの内容ラインを調べましたが、何がダメなのかもわかりません。

補足情報(FW/ツールのバージョンなど)

Mac ProでPHP7.2,CakePHP,MAMPでやっています。

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

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

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

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

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

guest

回答1

0

ベストアンサー

mysqlが起動してないと思われます。


追記: $dsn確認用のコード改変です。
エラー発生箇所である vendor/robmorgan/phinx/src/Phinx/Db/Adapter/MysqlAdapter.php の 121行目付近を次のように編集するとエラーメッセージに$dsnの内容が出力されるようになるので、そのエラーメッセージを教えてください。
vendor以下のファイルは通常編集しないので、あとで忘れずに元に戻しておいてください。

try { $db = new \PDO($dsn, $options['user'], $options['pass'], $driverOptions); } catch (\PDOException $exception) { throw new \InvalidArgumentException(sprintf( '($dsn = "%s") There was a problem connecting to the database: %s', // ここと $dsn, // ここを変えます $exception->getMessage() )); }

まとめ

  • mysqlは正常に起動してて、mysqlコマンドで接続可能
  • $dsnの値は"mysql:host=localhost;dbname=mydata"
  • 接続先を127.0.0.1に変更すると問題を回避できた

接続先がlocalhostのときはどこかにあるphp.iniに設定されているpdo_mysql.default_socketの値を用いてunix socket接続を行うらしく、この設定値が実環境と異なっていたものと考えられます。

投稿2019/01/08 06:59

編集2019/01/08 12:01
set0gut1

総合スコア2413

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

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

inko

2019/01/08 07:02

回答ありがとうございます。 MAMPを再起動してもう一度実行しましたが、同じエラーが出てしましました。 設定が悪いのでしょうか?
set0gut1

2019/01/08 07:08

mysqlが正常に起動していることを直接確認していただいたほうが確実かと思います。MAMP付属のmysqlクライアントで確認できるみたいなのでそれで繫いでみてください。参考→https://webkaru.net/mysql/mamp-command-line/
inko

2019/01/08 07:49

参考サイトまでありがとうございます。 サイトの通りにmysqlの接続はできましたが、その状態で他のターミナルで、もう一度実行しましたが、またエラーが出てしまいました。 mysqlに接続できた状態で放置したのがいけないのでしょうか?
set0gut1

2019/01/08 08:09

mysqlには繋がったんですね。すみません予想が外れましたmm mysqlには複数繋げられるので、別のターミナルで接続しても通常なら問題ないはずです。 PHP で new PDO に渡している $dsn の内容を教えていただければと思います。
inko

2019/01/08 08:32

いえいえ、こちらこそ、ここまでしていただきありがとうございます。 もしわけないのですが、cakephpでnew PDOに当たる部分は、どのファイルにあるのでしょうか?探してみたのですが、どれがそれに当たるのか分かりません。 本当にすいません、、
set0gut1

2019/01/08 08:37

該当のソースコードとして貼ってある122行目?の変数 $dsn の内容が見たいです。ここの設定値が怪しいんじゃないかなーと思っています。
inko

2019/01/08 08:46

本当にありがとうございます。近くにあったのもで探してみたら、下のようなものがあったので貼っておきます。これであってますか? $dsn = 'mysql:'; $dsn .= ';dbname=' . $options['name'];
set0gut1

2019/01/08 08:54

それです!その2行以外にどこかで設定値が追加されてる可能性があるので、念のため122行目(new PDOの行)の真上で出力して確認してみて欲しいです。
inko

2019/01/08 09:16

本当に申し訳ありませんが、確認方法が分かりません。 ですが、エラーコードと$dsnの間にコードがありましたので、載せておきます。役に立つかは分かりませんが、、 本当にすいません、 // charset support if (!empty($options['charset'])) { $dsn .= ';charset=' . $options['charset']; } $driverOptions = [\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION]; // support arbitrary \PDO::MYSQL_ATTR_* driver options and pass them to PDO // http://php.net/manual/en/ref.pdo-mysql.php#pdo-mysql.constants foreach ($options as $key => $option) { if (strpos($key, 'mysql_attr_') === 0) { $driverOptions[constant('\PDO::' . strtoupper($key))] = $option; } }
inko

2019/01/08 09:24

すいません、まだありました。 ''if (!empty($options['unix_socket'])) { // use socket connection $dsn .= 'unix_socket=' . $options['unix_socket']; } else { // use network connection $dsn .= 'host=' . $options['host']; if (!empty($options['port'])) { $dsn .= ';port=' . $options['port']; } } ''
set0gut1

2019/01/08 09:47

把握できました。 原因としては、設定ファイルに unix_socket が指定されていて、それが実環境のパスと違っているために No such file or directory というエラーが出ているのだろうと思われます。 unix socket で接続するっていうのは本質的な部分ではなく、TCPで接続できるのはすでに確認済みなので、TCP接続に切り替えると良いと思います。 データベースの接続情報の設定ファイルを編集し、 unix_socket の設定値を空文字列にし、代わりに host の設定値を 'localhost' (だめなら '127.0.0.1')に変更して試してみてください。
inko

2019/01/08 10:01

原因がわかる部分でよかったです。本当にありがとうございます。 データベースの接続情報の設定ファイルとありますが、今回載せているコードを編集するのでしょうか?それとも他のファイルのことでしょうか? 初歩的な質問ばかりですいません、、
set0gut1

2019/01/08 10:07

たぶん database.php っていう名前のファイルがあると思うのでそれを編集してください。 もしなければ、ソースコードのディレクトリの階層が浅い場所でコマンド「grep -rl unix_socket .」を実行して "unix_socket" という文字列を含むファイルを力技で探してください。
inko

2019/01/08 10:19

ありがとうございます。度々もしわけないのですが、力技で検索したのですが、database.phpがなくこの中のどれかだと思うのですが、違いますか? mbp:mycakeapp shu$ grep -rl unix_socket . ./vendor/cakephp/cakephp/src/Cache/Engine/RedisEngine.php ./vendor/cakephp/cakephp/src/Database/Driver/Mysql.php ./vendor/cakephp/cakephp/src/Database/Driver/Postgres.php ./vendor/cakephp/migrations/src/ConfigurationTrait.php ./vendor/robmorgan/phinx/src/Phinx/Db/Adapter/MysqlAdapter.php
inko

2019/01/08 10:50

マイグレーションの作業でエラーが起きたので、 ./vendor/cakephp/migrations/src/ConfigurationTrait.php を調べたのですが、下のようになっていて 'default' => [ 'adapter' => $adapterName, 'host' => isset($connectionConfig['host']) ? $connectionConfig['host'] : null, 'user' => isset($connectionConfig['username']) ? $connectionConfig['username'] : null, 'pass' => isset($connectionConfig['password']) ? $connectionConfig['password'] : null, 'port' => isset($connectionConfig['port']) ? $connectionConfig['port'] : null, 'name' => $connectionConfig['database'], 'charset' => isset($connectionConfig['encoding']) ? $connectionConfig['encoding'] : null, 'unix_socket' => isset($connectionConfig['unix_socket']) ? $connectionConfig['unix_socket'] : null, 'suffix' => '', ] 全部 null になっているのは関係あるのでしょうか?
inko

2019/01/08 11:14

わざわざありがとうございます。普通はいじらないのですね。 その箇所ですが、もともと localhost になっていていじれないのですが、他に要因などありますか?
退会済みユーザー

退会済みユーザー

2019/01/08 11:18

組み立て方より組上がったdsnを例外発生時にログしないのかと二人のやり取りみて思う
inko

2019/01/08 11:22

コメントありがとうございます。始めたてなので、理解がうまくできないのですが、どうゆうことですか?詳しくお願い致します!
set0gut1

2019/01/08 11:27

やっぱそれですよね。そんな気がしてきてました。$dsnをエラーメッセージに含める方法を回答に追記したのでそれお願いしたいです。
inko

2019/01/08 11:32

内容が出ました。 ($dsn = "mysql:host=localhost;dbname=mydata") この部分で合っていますか?
set0gut1

2019/01/08 11:47

あってます。ありがとうございます。 PDO で localhost に接続するとき、どこかにある php.ini ってファイルに書いてある pdo_mysql.default_socket っていう設定値が使われるらしく、その設定値が実環境のものと異なってるっていう状況みたいですね。 config/app.php の設定値 'host' => 'localhost' を 'host' => '127.0.0.1' に変更するとTCPで繋ぎに行くようなので、それでいけるかと思いました。
inko

2019/01/08 11:56

ありがとうございます!! できました!!エラーなく動きました!! set0gut1さん、本当に長い時間ありがとうございます! 他にコメントしてくれた皆さんも本当にありがとうございました。
set0gut1

2019/01/08 12:05

おめでとうございます!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問