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

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

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

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

2回答

2455閲覧

PHPUnitテストの後処理でオートインクリメントをリセットする

zbymfw

総合スコア15

PHP

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2017/07/28 08:01

Laravelでテストをしています。

use DatabaseTransactions;のtraitを使用しているため、トランザクションがはられて、tearDown時にロールバックが走ります。

その後にオートインクリメントをリセットしようとしていますが、リセットされません。

php

1 2class MyTest extends TestCase 3{ 4 use DatabaseTransactions; 5 6 public function setUp() 7 { 8 parent::setUp(); 9 10 $this->beforeApplicationDestroyed(function () { 11 // ロールバック実行後 12 // オートインクリメントリセット実行するが、リセットされない 13 $sql = "ALTER TABLE my_table auto_increment = ?;"; 14 // インサート文に変更した場合、クエリは実行される 15 // $sql = "INSERT INTO my_table (id, name) VALUES (?,'test');"; 16 $stmt = $this->pdo->prepare($sql); 17 $stmt->execute([1]); 18 }); 19});

方法を知ってる方がいらっしゃれば教えていただきたいです。
また、おかしな点があれば、指摘ください。
よろしくお願いします!

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

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

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

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

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

guest

回答2

0

自己解決

mysqlでshow processlist;してみた所、
該当クエリのALTER TABLE my_table auto_increment = 1
Waiting for table metadata lockになっていた。

PHP

1public function tearDown() 2{ 3 parent::tearDown(); 4 5 // ここで、オートインクリメントリセットを実行し成功 6 try { 7 $sql = "ALTER TABLE my_table auto_increment = 1;"; 8 $pdo = $this->getPdo(); 9 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 10 $stmt = $pdo->prepare($sql); 11 $stmt->execute(); 12 } catch (Exception $e) { 13 var_dump($e); 14 } 15}

PHP

1$this->beforeApplicationDestroyed(function() { 2 // ここで、ALTER TABLEを実行すると、応答がなくなる 3});

@fagaiさん
ありがとうございました!

投稿2017/07/28 14:57

zbymfw

総合スコア15

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

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

0

execute後に$stmt->errorInfo()を実行してエラーが起きてた場合の内容を取得してみてはどうでしょうか?

投稿2017/07/28 08:12

fagai

総合スコア2158

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

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

zbymfw

2017/07/28 09:06

エラーが出ました。 array(3) { [0] => string(5) "42000" [1] => int(1064) [2] => string(149) "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1'' at line 1" } 権限を変更しました。 GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'localhost'; FLUSH PRIVILEGES; そうしたら、$stmt->execute();の部分で、DBから応答がなくなってしまいました。 コードを下記に変更してみましたが、変わらず応答が無いです。。 $sql = "ALTER TABLE my_table auto_increment = :num;"; $num = 1; $stmt->bindParam(':num', $num, PDO::PARAM_INT); $stmt = $this->pdo->prepare($sql); $stmt->execute();
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問