###前提・実現したいこと
- 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」となり、エラーは発生していません。
###以上です
皆様のお知恵を拝借できれば幸いです。宜しくお願い致します。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/11/11 10:48