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

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

ただいまの
回答率

90.75%

  • PHP

    19162questions

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

  • MySQL

    5504questions

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

  • MAMP

    197questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 357

okame

score 48

前提・実現したいこと

  • 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 です。

変更前のファイルは

#!/bin/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 &

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

#!/bin/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 --log=/Applications/MAMP/logs/mysql_query.log &

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

追記:PHPのソースコード

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

<?php

require_once $_SERVER['DOCUMENT_ROOT'] . '/vendor/autoload.php';

use AppBundle\Entity\ManagerRepository;

$loader = new Twig_Loader_Filesystem($_SERVER['DOCUMENT_ROOT'] . '/app/resources/views/');
$twig   = new Twig_Environment($loader);

// このページに直接アクセスしてきた場合はエラー画面遷移
if (count($_POST) == 0) {
    echo $twig->render('admin/error.html.twig', [
        'error' => '操作に誤りがありました。初めからやり直してください。',
    ]);
    exit();
}

$managerRepository = new ManagerRepository();
$managerRepository->setAllProperties('UPDATE');
$managerRepository->execute('UPDATE');

echo $twig->render('admin/staff/editComplete.html.twig', [
    'username' => $managerRepository->getUsername(),
]);

?>

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

<?php

namespace AppBundle\Entity;

use AppBundle\Common\DatabaseAccessObject;


class ManagerRepository extends Manager
{
    ...
    public function execute($type)
    {
        $dbObject = new DatabaseAccessObject();

        $sql = '';
        $values = [];

        switch ($type) {
        ...
            case 'UPDATE':
                $sql = 'UPDATE manager SET
                          user_name = ?,
                          password = ?,
                          password_updated_at = ?,
                          last_name = ?,
                          first_name = ?,
                          remarks = ?,
                          updated_at = ?,
                          updated_manager_id = 0 WHERE id = ?';

                $values = [
                    $this->getUsername(),
                    $this->getPassword(),
                    $this->getPasswordUpdatedAt(),
                    $this->getLastName(),
                    $this->getFirstName(),
                    $this->getRemarks(),
                    $this->getUpdatedAt(),
                    $this->getId(),
                ];

                $dbObject->run('UPDATE', $sql, $values);
                break;
                ...
        }
    }

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

<?php

namespace AppBundle\Common;

use AppBundle\Common\Config;

/**
 * データベースへの接続情報をセット
 */
Config::set('dsn', 'mysql:host=localhost;dbname=***;charset=utf8');
Config::set('user', '***');
Config::set('password', 'ad***');

/**
 * Class DatabaseAccessObject データベースへの接続、リクエストを管理
 */
class DatabaseAccessObject
{
    /**
     * @var \PDO $dbh データベースハンドラ
     */
    private $dbh;

    /**
     * データベースへ接続する
     *
     * @throws \PDOException
     */
    public function __construct()
    {
        // データベース情報
        $dsn        = Config::get('dsn');
        $user       = Config::get('user');
        $password   = Config::get('password');

        // DB接続とエラー発生時のエラーモード設定
        $this->dbh = new \PDO($dsn, $user, $password);
        $this->dbh->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
    }

    /**
     * セットしたクエリを実行する
     *
     * @paramsh array $params
     * @return array $stmt
     * @throws \PDOException
     */
    public function run($type, $query, $params = [])
    {
        $this->dbh->beginTransaction();

        try {
            $stmt = $this->dbh->prepare($query);

            if (count($params)) {
                $stmt->execute($params);

            } else {
                $stmt->execute();
            }


        } catch (\Exception $e) {
            // トランザクションが失敗した際のロールバック処理
            $this->dbh->rollBack();
            throw $e;
        }

        $this->dbh->commit();

        if ($type == 'SELECT') {
            return $stmt->fetchAll();

        } elseif ($type == 'SELECT_BY_ONE') {
            return $stmt->fetch();
        }
    }

    /**
     * 接続を閉じる
     */
    public function __destruct()
    {
        $this->dbh = null;
    }
}

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

以上です

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

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

#!/bin/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=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 19:48

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

    キャンセル

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 10:41

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

    キャンセル

  • 2017/11/11 10: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サーバー自体が起動しなくなるという同じ結果でした。
    何故でしょう。。。

    キャンセル

  • 2017/11/11 11:16

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

    キャンセル

  • 2017/11/11 12:48

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

    キャンセル

  • 2017/11/11 14:14

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

    キャンセル

  • 2017/11/11 16:58

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

    キャンセル

  • 2017/11/11 20:04

    fiwaさんの回答を見て気づいたんですが、general_logに「=1」が抜けてましたね。
    失礼しました。

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

    キャンセル

  • 2017/11/11 20:49

    ご名答です。IDがnullでした。
    セットする値はチェックしたつもりだったのですが、とんだ凡ミスでした。

    クエリログをチェックするまでも無かったですね。
    ooeok様にはお時間だいぶ取ってしまいました。すみません。

    やり取り長くなってしまい恐縮ですが、ご協力いただきありがとうございました!m(_ _)m

    キャンセル

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

  • ただいまの回答率 90.75%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • PHP

    19162questions

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

  • MySQL

    5504questions

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

  • MAMP

    197questions

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