トラブル対応集
XAMPPが起動できなくなった場合の対処方法:
xampp-controlでWebとDBのサービスを停止してPCをシャットダウンしていても障害が発生するようです。
原因は不明。
こちらのBlogの掲載内容で復旧できました。必ずしも復旧できるとは限りませんが試す価値はあります。
phpMyAdminの挙動不審:
設定内容を正しく入力していてもエラーが出て設定が進まない障害が出た受講生がいます。
原因は不明。推測:ブラウザの戻る(矢印ボタン)を使用するとバグる
ブラウザをすべて閉じてphpMyAdminを開きなおすと障害が出ないようになる場合があります。試してください。
日本語化対応の資料を見直し。要修正。
数値フォーマッタの解除方法。学籍番号が3桁コンマ区切りになる。フィールドの型がINTの場合にフォーマッタが自動適用される。templatesのindex.php などからフォーマッタのコードを削除して対応。
PHPMyAdminではフィールド名の修正は画面から操作できるがテーブル名やデータベース名の修正はできない。
設定ミス(日本語で名前をつけた・入力ミス)で名前を修正するにはSQLのコマンドで修正する必要がある。
例) テーブル名の変更
ALTER TABLE `変更前テーブル名` RENAME TO 変更後テーブル名
例) データベース名の変更
http://itmemo.net-luck.com/mysql-database-change/
データベース名の変更は、PHPMyAdminからは、prefixをつけるなど、バックアップ目的の名前変更にしか対応していない。
そこで↑のリンクにあるように、データベースをエクスポートし、別の名前の空のデータベースを作成した後、インポートすることで対応する。
http://blog.doli.jp/blog/2012/post509/ 参照
ALTER TABLE rentals CHANGE id id int AUTO_INCREMENT;
SQLコマンドでテーブルを作成した後でデザイナ画面を利用して外部キー制約を設定する際の追加操作について。
外部キー参照制約をphpMyAdminのデザイナ画面の操作でコネクターで作成する際に「indexが作成されていない」ので作成できないというエラーがでる。
index を作成するには、
テーブル → 構造 → indexを作成するフィールド名にチェックを入れる → インデックス クリック
bake コマンドの実行でエラーが出る
CakePHPのインストールに失敗している。フォルダ数やファイル数を確認する。
データベースに接続出来ない
データベースへの接続設定を確認する
config/app_local.phpは編集済み → そのapp_local.phpはこの課題のプロジェクトのものか確認する。vs codeのフォルダ設定は合っているか?
フィールド名やテーブル名、データベース名に 空白 . - などが含まれている → _ など別の記号に直す
テーブル名を確認する。特に複数形で末尾に s が有るか無いか等を確認する
bake コマンドでエラーは出ないがWebが修正されない
Debug がfalseになってて本番環境になっている。デバッグモードに戻す
CakePHPのキャッシュが使われている。bin/cake cache clear_all をコマンドプロンプトで実行する
Modelの設定ファイルの○○Entity.phpや○○Table.phpを削除してから bake し直す
Webのメニューで複数のテーブルがリンクしない →
テーブルの設計を確認する:
テーブルに 外部キーの設定があるか
外部キーの参照方向が逆になっていないか
fieldname_id の命名規約に従っているか
レコードの新規追加ができない
テーブルの id フィールドにauto_increment設定が有るか確認する
レコードを追加するテーブルのフィールドにインデックスが重複して設定いないか確認する
入力項目がid表示のままなので名前などの見出し表示に変更したい
Modelのコードを修正する Model/〇〇Table.php の setDisplayField を修正する
表示したい項目のフィールド名がtitleまたはnameならばモデルファイルを削除してから bakeし直す
bakeでscaffoldがうまく自動生成できないテーブル構造について
あるテーブルに複数の外部参照のあるフィールドがあり、その外部参照先が同じテーブルの場合にbakeで生成したページに不具合が出る。
不具合についての記事 不具合の解消法についての記事 この解決法以外でも、テーブルの設計を修正して対応する方策も有る。
集計クエリ
table points ( id , game_id, player_id, score ) に対して、game_id 毎に max(score)を表示し、さらにplayer_id も表示したい。
group by game_id とすると、各ゲームごとの最高点を導出できるがplayer_idはグループ化対象でないので出力できない。
そこで、サブクエリによる最高点集計テーブルを points テーブルと結合し、最高点=個人得点のレコードを抽出することになる。
MariaDB 10.2からは、サブクエリをビューのFromに指定できる。また、Partition by によりサブクエリを使用せずに上記の処理を記述できる。
bake しなおす場合bake で生成したファイルを削除してから bake しなおす。
テーブル名が規約に従っていない、テーブルにidフィールドがない、エディタでbakeする対象のファイルを開いたまま、などを確認してみよう。
テーブルを修正してbake しなおしても MVC の PHP コードに変化がない場合、キャッシュをクリアして、再度 bake してみる。
bin\cake cache clear_all
cakephpをインストールしたフォルダのコピーに失敗している場合がある。レポートフォルダから元ファイルコピーしなおして解決する。
キャッシュやtmp フォルダの bake 以下のファイルを削除する
例)
bin\cake cache clear_all
bin\cake orm_cache clear_all
cd tmp\bake; del *.*
phpMyAdminのテーブルのリレーションの設定に不要な設定が残っている場合がある。
CakePHPの命名規約に「一部」従っている場合+MySQLに外部キー制約が設定要る場合 一部エラーになる状態で scaffoldが作成される。
例)
game_id フィールドが usersテーブルにある場合、 games テーブルが存在する前提のコードが生成される。
このとき、gameテーブルが存在してもusersからのリンクは機能しない(gamesテーブルが存在しないというエラーになる)
結論:規約通りに命名すれば失敗しない。
cake bake all テーブル名 でエラーが出る
cake bake model テーブル名
cake bake controller テーブル名
cake bake template テーブル名
の順にbakeするとエラーを回避できる場合がる。
・中間テーブルではないテーブルに中間テーブルの命名規則の名前を付けている
→ テーブル名の変更
・SQL予約語とテーブル名やフィールド名が衝突してエラーになる。(エラーのタイミングはScaffoldからレコード書込みの時点など)
→ テーブル名やフィールド名を変更する
例)
Model -> Models
Release -> Release_date
フィールド名の変更は外部キー制約を外さないとできないかもしれない(できるかも)
テーブル名の変更は SQL alter tabel xxx rename zzz で行う。外部キーがあると変更できないかもしれない(できるかも)
・日付を日本風にする app.phpで言語設定を ja_JPに変更
・数値や日付の入力範囲をチェックする
5段階評価のように選択肢から選ぶ場合は評価値テーブルを作成して外部キー制約で制御する
CakePHP の validator で制御する。 Model の Entity か Table あたりに追加で。
・複合キーが主キーの対応作業ができていないケース
cake bake model aaaa --primary-key xxx,yyy
・Model で フィールドへのアクセスが許可されていない →フィールド名やテーブル名の変更で発生。再bakeで直らないことがある
・再bake で直らない場合
デバッグモードに戻す app.php
bin¥cake cache clear_all
を試し
src 以下の bake で作成された全てのコードを削除する
再bakeする
・テーブルが使用中で戻らない
テールブルの修復をphpMyAdminから試みる
mysqlを止める
mysql¥data¥databaseaaaa 以下の該当テーブルの frm や ibd ファイルを削除する
mysqlを起動
データベースをエクスポート
エクスポートできないようならデータベースを削除
データベースが削除できなかったら
データベースを停止
databaseaaaaに残ったファイルを削除
データベースを削除
mysqlを停止して起動
データベースを作り直すところからやりなおす。
・テーブルが再作成できない
テーブルが破損→削除 または 消えてしまう
の後に発生
データベースをエクスポートしてデータベースを削除後、サーバ再起動して、データベース作り直してインポートする。
・scaffold のメニューで他のページへリンクしない
users_id と users
のように規約に従った名前になっていない(正解は user_id)、外部キー制約の設定も必要。
直してbakeし直す。
またはtemplatesの該当ページ add.php などの左サイドメニューの位置に必要なコントローラーへのリンクを作成する。
・ webroot/css のcssが読み込めなくなるトラブル
ブラウザのキャッシュを消去する
google chrome ならShiftキー+リロードボタン クリック
・CakePHPのハマり所
テーブル名(モデル名)に「_」が含まれていた場合、CONTROLLERの呼び出し用URLでは「-」に自動修正される。
・CakePHP用のフォルダを作成せずに htdocs の階層に直接インストールする
→ .htaccess が書き換わって 他のシステム(wordpressなど) の挙動に影響を与える。