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

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

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

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

PHP

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

MAMP

Mac 上で WordPress などの動的ページのサイトが作れるように環境を構築するフリーソフト

Q&A

解決済

2回答

1072閲覧

MAMP内MySQLのクエリログを出力したい

okame

総合スコア54

MySQL

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

PHP

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

MAMP

Mac 上で WordPress などの動的ページのサイトが作れるように環境を構築するフリーソフト

0グッド

0クリップ

投稿2017/11/10 09:22

編集2017/11/11 07:57

###前提・実現したいこと

  • MacBook Pro (Retina, 13-inch, Mid 2014) macOS Sierra
  • MAMP4.1.2
  • MySQL5.6.35

実現したいことはタイトルの通りです。PHPにてMySQLにクエリを投げているのですが、
正しい実行結果が得られず(UPDATEクエリ投げてるのにUPDATEされない)、かつPHP上で追えるコード上は問題が無いように見えます。

そのため直接クエリログを見ようとしているのですが、
MySQLの起動スクリプトにクエリを出力するオプションを記述し再起動しようとすると
MySQL起動せずといった状況です。

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

MySQLの起動シェルスクリプトのファイルは
/Applications/MAMP/bin/startMySQL.sh です。

変更前のファイルは

bash

1#!/bin/sh 2 3/Applications/MAMP/Library/bin/mysqld_safe --port=8889 --socket=/Applications/MAMP/tmp/mysql/mysql.sock --pid-file=/Applications/MAMP/tmp/mysql/mysql.pid --log-error=/Applications/MAMP/logs/mysql_error_log &

で、ここにクエリログ出力のオプション「 --log=/Applications/MAMP/logs/mysql_query.log」を以下のように末尾に追記します。

bash

1#!/bin/sh 2 3/Applications/MAMP/Library/bin/mysqld_safe --port=8889 --socket=/Applications/MAMP/tmp/mysql/mysql.sock --pid-file=/Applications/MAMP/tmp/mysql/mysql.pid --log-error=/Applications/MAMP/logs/mysql_error_log --log=/Applications/MAMP/logs/mysql_query.log &

これを追記してからMySQLを再起動しようとすると、起動しない状態となっています。
Apacheサーバーのエラーログにも特に何も出力はされていません。

###追記:PHPのソースコード

まずは以下の登録した管理者の情報を編集する完了画面のコードです。
26行目の$managerRepository->execute('UPDATE'); で更新処理を実行します。

php

1<?php 2 3require_once $_SERVER['DOCUMENT_ROOT'] . '/vendor/autoload.php'; 4 5use AppBundle\Entity\ManagerRepository; 6 7$loader = new Twig_Loader_Filesystem($_SERVER['DOCUMENT_ROOT'] . '/app/resources/views/'); 8$twig = new Twig_Environment($loader); 9 10// このページに直接アクセスしてきた場合はエラー画面遷移 11if (count($_POST) == 0) { 12 echo $twig->render('admin/error.html.twig', [ 13 'error' => '操作に誤りがありました。初めからやり直してください。', 14 ]); 15 exit(); 16} 17 18$managerRepository = new ManagerRepository(); 19$managerRepository->setAllProperties('UPDATE'); 20$managerRepository->execute('UPDATE'); 21 22echo $twig->render('admin/staff/editComplete.html.twig', [ 23 'username' => $managerRepository->getUsername(), 24]); 25 26?>

上記26行目のメソッドのコードは以下です。
下の方のコード$dbObject->run('UPDATE', $sql, $values); に続きます。
$sqlに格納しているクエリは直接DBツール上で実行しましたが、正常に実行できます。

php

1<?php 2 3namespace AppBundle\Entity; 4 5use AppBundle\Common\DatabaseAccessObject; 6 7 8class ManagerRepository extends Manager 9{ 10 ... 11 public function execute($type) 12 { 13 $dbObject = new DatabaseAccessObject(); 14 15 $sql = ''; 16 $values = []; 17 18 switch ($type) { 19 ... 20 case 'UPDATE': 21 $sql = 'UPDATE manager SET 22 user_name = ?, 23 password = ?, 24 password_updated_at = ?, 25 last_name = ?, 26 first_name = ?, 27 remarks = ?, 28 updated_at = ?, 29 updated_manager_id = 0 WHERE id = ?'; 30 31 $values = [ 32 $this->getUsername(), 33 $this->getPassword(), 34 $this->getPasswordUpdatedAt(), 35 $this->getLastName(), 36 $this->getFirstName(), 37 $this->getRemarks(), 38 $this->getUpdatedAt(), 39 $this->getId(), 40 ]; 41 42 $dbObject->run('UPDATE', $sql, $values); 43 break; 44 ... 45 } 46 }

上記$dbObject->run('UPDATE', $sql, $values); のコードは以下です。

php

1<?php 2 3namespace AppBundle\Common; 4 5use AppBundle\Common\Config; 6 7/** 8 * データベースへの接続情報をセット 9 */ 10Config::set('dsn', 'mysql:host=localhost;dbname=***;charset=utf8'); 11Config::set('user', '***'); 12Config::set('password', 'ad***'); 13 14/** 15 * Class DatabaseAccessObject データベースへの接続、リクエストを管理 16 */ 17class DatabaseAccessObject 18{ 19 /** 20 * @var \PDO $dbh データベースハンドラ 21 */ 22 private $dbh; 23 24 /** 25 * データベースへ接続する 26 * 27 * @throws \PDOException 28 */ 29 public function __construct() 30 { 31 // データベース情報 32 $dsn = Config::get('dsn'); 33 $user = Config::get('user'); 34 $password = Config::get('password'); 35 36 // DB接続とエラー発生時のエラーモード設定 37 $this->dbh = new \PDO($dsn, $user, $password); 38 $this->dbh->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); 39 } 40 41 /** 42 * セットしたクエリを実行する 43 * 44 * @paramsh array $params 45 * @return array $stmt 46 * @throws \PDOException 47 */ 48 public function run($type, $query, $params = []) 49 { 50 $this->dbh->beginTransaction(); 51 52 try { 53 $stmt = $this->dbh->prepare($query); 54 55 if (count($params)) { 56 $stmt->execute($params); 57 58 } else { 59 $stmt->execute(); 60 } 61 62 63 } catch (\Exception $e) { 64 // トランザクションが失敗した際のロールバック処理 65 $this->dbh->rollBack(); 66 throw $e; 67 } 68 69 $this->dbh->commit(); 70 71 if ($type == 'SELECT') { 72 return $stmt->fetchAll(); 73 74 } elseif ($type == 'SELECT_BY_ONE') { 75 return $stmt->fetch(); 76 } 77 } 78 79 /** 80 * 接続を閉じる 81 */ 82 public function __destruct() 83 { 84 $this->dbh = null; 85 } 86}

最終的にPDOStatement::execute()メソッドでクエリを投げているわけですが、
これの返り値は「true」となり、エラーは発生していません。

###以上です

皆様のお知恵を拝借できれば幸いです。宜しくお願い致します。

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

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

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

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

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

guest

回答2

0

ベストアンサー

startMySQL.sh を次のように書いて実行してみてはどうでしょうか。

Bash

1#!/bin/sh 2 3/Applications/MAMP/Library/bin/mysqld_safe --port=8889 --socket=/Applications/MAMP/tmp/mysql/mysql.sock --pid-file=/Applications/MAMP/tmp/mysql/mysql.pid --log-error=/Applications/MAMP/logs/mysql_error_log --general_log=1 --general-log-file=/Applications/MAMP/logs/mysql_general_log &

デフォルトの状態に--general_log=1 --general-log-file=/Applications/MAMP/logs/mysql_general_logと追記しています。
私の環境では上記の変更でmysql_general_logが生成されログが記録されています。

参考:Activating MAMP's General Query Log

投稿2017/11/11 09:52

編集2017/11/11 10:09
fiwa

総合スコア1192

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

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

okame

2017/11/11 10:48

回答ありがとうございます! そしてご教示頂いた方法で無事にクエリログ出力されましたー!! 本当に助かりました☆
guest

0

公式マニュアルによると、--logは5.6.1で削除されているとのこと。
代りに--general_log_fileを使ってくれと書いてありました。

https://dev.mysql.com/doc/refman/5.6/ja/server-options.html

起動オプションを指定するよりmy.conf(/Applications/MAMP/Conf/my.conf)を書き換えた方がいいでしょう。

[mysqld] general_log general_log_file=/Applications/MAMP/logs/mysql_query.log

そもそもクエリを確認したいだけなら、SQLとバインドするパラメタをログに出力するだけで充分だと思います。
で、直接SQLを叩けば(phpmyadminのSQLタブなどから)だいたい原因は分かるんじゃないでしょうか。

投稿2017/11/11 01:27

ooeok

総合スコア469

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

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

okame

2017/11/11 01:41

回答ありがとうございます!ログ出力の方法、試してみます。 既に直接SQLを叩いてみたのですが、正しく実行されるんですよね。。。
okame

2017/11/11 01:55

--general_log_file オプションですが、/Applications/MAMP/Conf/my.confファイルが存在しないため、/Applications/MAMP/bin/startMySQL.sh に以下のように追記しました。 /Applications/MAMP/Library/bin/mysqld_safe --port=8889 --socket=/Applications/MAMP/tmp/mysql/mysql.sock --pid-file=/Applications/MAMP/tmp/mysql/mysql.pid --log-error=/Applications/MAMP/logs/mysql_error_log --general_log_file=/Applications/MAMP/logs/mysql_query.log & そして再起動すると... やはりこの方法でもMySQLサーバー自体が起動しなくなるという同じ結果でした。 何故でしょう。。。
ooeok

2017/11/11 02:16

my.confは新規で作って下さい。 --general_log_fileの前に全角空白が入ってます。
okame

2017/11/11 03:48

凡ミス失礼しましたm(_ _)m 新規でmy.confを作成し再起動できました。が、PHP上からSQL実行しても、phpmyadminから直接実行してもクエリログが出力されない状態です。 どこか調査した方が良いところありますでしょうか?
ooeok

2017/11/11 05:14

ログやコンフィグ見ないと分からないです。 クエリログにこだわるより本来の問題解決する方が早いと思いますよ。 phpのソースコードを載せてもらえませんか。
okame

2017/11/11 07:58

PHPコードを記載してみました! いかがでしょうか?追加情報必要であればコメントください。
ooeok

2017/11/11 11:04

fiwaさんの回答を見て気づいたんですが、general_logに「=1」が抜けてましたね。 失礼しました。 ざっとソースコードを見てみましたが、ManagerRepositoryクラス(Managerクラス)のgetId()メソッドがマズそうですね。 たぶんIDがちゃんと取れていないのでしょう。 理由が解明したら、今後の参考までにぜひ教えて下さい。
okame

2017/11/11 11:49

ご名答です。IDがnullでした。 セットする値はチェックしたつもりだったのですが、とんだ凡ミスでした。 クエリログをチェックするまでも無かったですね。 ooeok様にはお時間だいぶ取ってしまいました。すみません。 やり取り長くなってしまい恐縮ですが、ご協力いただきありがとうございました!m(_ _)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問