【PHP】フレームワーク CakePHP 17ホール目【v3α】
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2014/08/02(土) 21:57:41.01ID:LI0DdohH質問するときはCakePHPのバージョンを書きましょう
※他フレームワークとの比較等はスレ違いです
■本家
http://www.cakephp.org/
APIドキュメント
http://api.cakephp.org/
github - cakephp
http://github.com/cakephp
the Bakery
http://bakery.cakephp.org/
cookbook(マニュアル)
[3.x] http://book.cakephp.org/3.0/
[2.x] http://book.cakephp.org/2.0/ja/
[1.3] http://book.cakephp.org/1.3/ja/
https://twitter.com/cakephp
https://www.facebook.com/CakePHP
■日本語公式
http://cakephp.jp/
フォーラム
http://cakephp.jp/modules/newbb/
※前スレ
http://kanae.2ch.net/test/read.cgi/php/1393661004/
0237nobodyさん
2015/02/05(木) 00:10:53.62ID:kXXlZufE皆さん詳しくどうもありがとうございます。
入力 > 確認 > 登録 or 戻る
の処理の一連の流を作っているのですがユーザが 「"」を入力した場合に
文字列が途中で端折られる為に、どうしようか悩んでいました。
0238nobodyさん
2015/02/05(木) 00:11:24.20ID:???htmlspecialchars()のラッパーがあるから楽でいいね
http://book.cakephp.org/2.0/ja/getting-started.html#id7
0239nobodyさん
2015/02/05(木) 00:13:20.68ID:???$thisを使うためにコンストラクタで$validate定義したら一応うまくいったとだけ言っておく
てきとーに回答のなかったものにも答えておく
>>225
記事内容はMySQLだけど参考になると思う
http://blog.xole.net/article.php?id=711
>>227
正解も間違いもないような話題はリアルのチームメンバーと話し合ったほうがいいと思うよ
>>228
SQLServerは環境がないから試せないけどDBのデフォルト値を設定したくなければ
create()の代わりにclear()を使うといいかも
バージョンが古くてメソッドがない場合はcreate(false)で
0240nobodyさん
2015/02/05(木) 00:52:32.89ID:mACTgUNt「彼は"おはよう"と言った」
という文字列が含まれていたとして
確認画面で<span></span>の中に確認メッセージを表示させて
「戻る」が押された場合に、最初の画面のメッセージ入力エリア(textarea)に
ままの「"」が表示された形で
「彼は"おはよう"と言った」
を出すには、�Aを使う事によりうまくいきました。
ここで疑問なのですがそもそも�@と�Aの違いは何なのでしょうか?
�@ Sanitize::clean($message_hoge);
�A h($message_hoge);
うーん、文字列で事象の説明が難しいです。。。
0241nobodyさん
2015/02/05(木) 01:06:39.73ID:???h()の実体はhtmlspecialchars()
http://php.net/manual/ja/function.htmlspecialchars.php
https://github.com/cakephp/cakephp/blob/master/lib/Cake/basics.php#L202-L234
Sanitize:クラスはCookbookに説明あり
http://book.cakephp.org/2.0/ja/core-utility-libraries/sanitize.html#Sanitize::clean
0242nobodyさん
2015/02/05(木) 01:12:45.87ID:???Sanitize::clean()は全く用途が違うメソッドでしょう
http://book.cakephp.org/2.0/ja/core-utility-libraries/sanitize.html#Sanitize::html
>このメソッドは、ユーザが送信したデータをHTMLの中に表示する準備をします。
>これは、ユーザがレイアウトを壊したり画像やスクリプトを挿入することを防ぐ上で特に便利な機能です。
>もし「$remove」オプションを true にセットした場合、データに含まれるHTMLのタグ等は全て削除されます。
>false にセットした場合は HTML エンティティとして表示されます。:
>文字をエスケープすることはエラーの可能性が低く、知られていない新しいタイプの攻撃に対して強いので、文字を取り除くよりもよい方法です。
0243nobodyさん
2015/02/05(木) 01:26:53.54ID:???echoするときにh()も書くなら、いっその事、DBに保存する前にサニタイズした方が良いと思うんだが。
beforeSave()で一括サニタイズできるし。それにエスケープさせたくない場合は復元すればいいだけだし。
0244nobodyさん
2015/02/05(木) 01:30:01.34ID:???0245nobodyさん
2015/02/05(木) 01:34:06.94ID:???0246nobodyさん
2015/02/05(木) 01:34:15.37ID:???0247nobodyさん
2015/02/05(木) 01:54:17.98ID:???0248nobodyさん
2015/02/05(木) 10:48:48.93ID:???DBのデータをCSV出力したいとき、逆変換するのか
DBに入れないデータを表示するときは、表示のときにエスケープするのか
デートの前、家から出るときにコンドームしてるようなもんだぞ
途中でトイレいくときどうするんだ
やる前にまたゴムするのか、2重になっちゃうぞ
ってこと
0249nobodyさん
2015/02/05(木) 11:04:33.13ID:MaFLMZhc分かり易い!サンキュー
取り敢えず、 h() で要件を満たせました。
anonymosuに狙われたら一発アウトそうなセキュリティだけどw
0250nobodyさん
2015/02/05(木) 17:00:36.25ID:???0251nobodyさん
2015/02/05(木) 18:27:25.06ID:???いつ生でしても良いようにピル飲んだらいいじゃない。
ってな感覚で事前エスケープしておくのは駄目ですか?
0252nobodyさん
2015/02/05(木) 19:14:43.36ID:???その辺は過去にさんざん議論されてて、結局アウトプットのときに
対処するのがベストプラクティスだねって結論が出てるんだよ。
0254nobodyさん
2015/02/06(金) 00:02:00.29ID:???挿入直前自動コンドーム装着機能を持つ
テンプレートエンジンを使えばいいだろ
0255nobodyさん
2015/02/06(金) 02:02:30.97ID:???0256nobodyさん
2015/02/06(金) 09:13:12.13ID:???0257nobodyさん
2015/02/06(金) 21:09:55.08ID:XFfNnVZS0258nobodyさん
2015/02/07(土) 06:03:05.10ID:???0259nobodyさん
2015/02/07(土) 14:20:33.66ID:???0260nobodyさん
2015/02/12(木) 19:19:14.90ID:+z/qvGfu自動で or and 検索する事は出来ますか?
参考になるサイトがあれば教えてください。
name = 'A' or name = 'B'
name = 'A' and name = 'B'
0263nobodyさん
2015/02/13(金) 12:47:36.01ID:trE+wwbVcakePHPオリジナルでは出来ないですか?
0264nobodyさん
2015/02/13(金) 13:27:08.47ID:???http://book.cakephp.org/2.0/ja/models/retrieving-your-data.html#id5
あと、
name = 'A' and name = 'B'
は常にfalse
0266nobodyさん
2015/02/13(金) 20:17:11.72ID:hnonnNdgOK
0267nobodyさん
2015/02/14(土) 12:22:29.76ID:riWWWAwOログインする時、「ユーザー名+パスワード」と「メールアドレス+パスワード」の2パターンが主に使われると思います。
管理人は前者の方法でログインし、一般ユーザーは後者でログインします。
usersテーブルが
id|username|password|email|role|created|modified
だとして、ユーザー名を使わないログインの場合は単純にusernameをNULLにして登録すれば良いんですかね?
それか、usernameにemailの値を代入するべきですかね?
でもその場合、文字数制限のバリデーションエラーが起きる気がします。
(それはroleの分類で回避すればいいことですが)
それか、usersテーブルひとつにまとめるのではなく、分けるべきでしょうか。
どのようにするのが良いかご意見お願いします。
0270nobodyさん
2015/02/14(土) 17:22:20.07ID:???俺ならメールアドレスパスワードに統一。
別に管理人ログインフォーム作成。
管理人フォームにはユーザー名とパスワード。
って感じにする。
0271267
2015/02/14(土) 17:33:06.70ID:???はい。自分もそのような画面設計なのですが、>>267でも質問しました通り、
テーブルをどういう構造にしたらいいか教えてほしいと思いまして・・。
0272nobodyさん
2015/02/14(土) 18:20:44.22ID:???ヌルでいいよ。
名前のところにメールアドレスなんて入ってたら
次触る人がナンジャコリヤァアってなる。
0274nobodyさん
2015/02/14(土) 21:07:46.13ID:???0275nobodyさん
2015/02/14(土) 21:59:10.14ID:???0276nobodyさん
2015/02/15(日) 00:53:41.16ID:???0277nobodyさん
2015/02/15(日) 14:50:48.71ID:1brRf+Ilヘルパーを使ってボタンを出力しようと以下のコードを書いたところ
なぜかエラーが出てしまいます。
array() の部分を省いてボタン名だけの指定であれば動きます。
cakePHP2ではボタンにID、NAME属性を付ける事が出来ないのでしょうか?
[コード]
echo $this->Form->button("Edit",
array(
"id" => "id_hoge",
"name" => "name_hoge",
),
);
[エラー内容]
Parse error: syntax error, unexpected ')'
0278nobodyさん
2015/02/15(日) 16:24:05.11ID:???例えばモデル的には日付がdateカラムに入ってるんだけど
ユーザーが検索するときはyear:2014とか年号だけ指定して検索できなくて
yearが1970から2015までの値以外ならバリデーションエラーをだしたい時とか
ルールが同じならコントローラー側で動的にバリデーター呼び出すだけで楽なんだけど
>>277
配列なら最後に余計なカンマ入れられるけど
引数は最後に余計なカンマ入れるとエラーになる
0279277
2015/02/16(月) 02:27:00.96ID:vJjLQ3Jtありがとうございます!出来ました!!
0280nobodyさん
2015/02/18(水) 19:23:06.50ID:4aEt4KO0// src/Controller/RecipesController.php
class RecipesController extends AppController
{
public function popular()
{
$popular = $this->Recipes->find('popular');
if (!$this->request->is('requested')) {
$this->response->body(json_encode($popular));
return $this->response;
}
$this->set('popular', $popular);
}
}
の、if (!$this->request->is('requested'))って条件の「!」いらなくない?動かしてみたらやっぱりない方がちゃんと動くし。
ここで言ってもしょうがないんだろうけど、自分の考え方が正しいのか不安だから聞きたかった
0281nobodyさん
2015/02/18(水) 22:49:27.06ID:???0282nobodyさん
2015/02/19(木) 00:34:03.06ID:???0283nobodyさん
2015/02/19(木) 01:12:24.31ID:???0285nobodyさん
2015/02/19(木) 17:29:51.85ID:???コントローラでpaginateを使いたいのですが、
ビューに引き継ぐと、なぜか「order」が効いていません…SQLにも「ORDER BY」が出ていません
インターネットでいろいろ調べて試してみたのですが、結局うまく動かなかったです…
下記名前はダミーですが、こんな感じで書いているのですが、どこがおかしいのでしょうか?
どなたかおわかりの人教えてください><
もし下記だけじゃ情報が足りなかったらご指摘ください
≪コントローラ部分≫
$this->employee->virtualFields['group_age'] = 0;
$this->paginate = array('employee' => array(
'group' => array('employee_age','gender'),
'fields' => array('employee_name','gender','count(employee_name) as employee__group_age'),
'order' => array('employee__name' => 'desc'),
'limit' => 20 ,
));
$data = array('paginate' => $this->paginate('employee') );
$this->set("data",$data);
0286nobodyさん
2015/02/19(木) 20:21:28.79ID:???ごめんなさい
'order' => array('employee__name' => 'desc'),
この部分が、
'order' => array('employee__group_age' => 'desc'),
でした
よろしくお願いします
0287nobodyさん
2015/02/19(木) 22:14:32.35ID:???原因を断定はできないがとりあえず目についたところとしてはバーチャルフィールドの名前あってなくね?
1行目group_age、4,5行目がemployee__group_ageで揺れてんじゃん
あとこの4行目の配列の一要素目 'employee_age'じゃねーの?
Group Byに指定してない列は集計関数かませずにSELECT句にそのまま使えないでしょう
名前ダミーにすんのはいいけど正確に変換してくれよ
0289nobodyさん
2015/02/20(金) 19:16:31.11ID:mKx/fp25生成したHTMLのコード上ではしっかりと
【test.html】
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
と記述しているのですが、ローカルにダウンロードして
サクラエディタで test.html を開くと右下に「SJIS」と表示されてしまいます。
【php側】
$html = {htmlコード;
file_put_contents("test.html", $html);
HTMLを生成しているPHP自体の文字コードも UTF-8 です。
なぜSJISになるのでしょうか?
0290nobodyさん
2015/02/20(金) 22:35:03.17ID:???readmeに従ってつくったけど検索が機能しないです
parsedParams()をvar_dumpしてみると空だし
urlの引数が/id:10/user:hoge/とかの形式じゃなくて
?id=10&user=hogeとかになっちゃってるみたい
バグかなぁ… 英語でググったり何度かソース見返すけどわからないです…
この現象の原因わかる方いますか?
0293289
2015/02/21(土) 14:53:33.16ID:gR4qq4TK0294nobodyさん
2015/02/21(土) 15:38:23.20ID:???0295289
2015/02/21(土) 15:44:22.51ID:gR4qq4TKありがとうございます。
解決しました。
0296nobodyさん
2015/02/22(日) 17:44:38.17ID:???下手にバージョン上げてもバグる原因増えるだけだと思いやってないんだけど。
0297nobodyさん
2015/02/22(日) 19:27:47.08ID:???0298nobodyさん
2015/02/22(日) 21:39:50.80ID:???入力欄が問題なく埋められていた場合、投稿フォームの「投稿」ボタンを押すと、コントローラーのaddが呼ばれてその投稿が追加されindexにリダイレクト、という動きはなんとかできたのですが、
入力欄の入力をバリデーションして不正なものがあった際に、indexのページ内の投稿欄にそのことを示すメッセージを表示するようにする方法がわかりません。
唯一思いついたのは、addのビューを投稿欄のみにしておいて、indexのビュー内からiframeで呼ぶことくらいです。
どなたかご教示頂けると幸いです。
0300nobodyさん
2015/02/23(月) 01:14:35.54ID:???ありがとうございます。調べるうちに、バリデーションエラーの内容をセッションに書き込んでリダイレクト先でセッションから読み出して代入、という方法も見かけたんですがこっちの方がずっとスマートですね。
というか結果的にcakephp関係ない質問になってしまって申し訳ないです。
0302nobodyさん
2015/02/23(月) 12:35:39.33ID:???実は今回やってるものが非常に特殊なケースで、IE6対応も切り捨てられないため、ajaxでやろうとして困っているところでした。
0303nobodyさん
2015/02/23(月) 13:57:46.86ID:qtvdKJqN馬鹿
0304nobodyさん
2015/02/23(月) 14:33:46.89ID:3dGVU3d0以下コードを実行すると、なぜか取得した文字コードが空文字に
なってしまいます。何が原因なのでしょうか?
【コード】
//文字を設定
$search_word = "ドラクエ";
//デフォルト
$char_code = mb_detect_encoding($search_word);
echo "char code:[{$char_code}]<br>";
//文字コードを変換 UTF-8 ⇒ SJIS
$search_word = mb_convert_encoding($search_word,"SJIS","auto");
$char_code = mb_detect_encoding($search_word);
echo "char code:[{$char_code}]<br>";
【実行結果】
char code:[UTF-8]
char code:[]
0305nobodyさん
2015/02/23(月) 14:59:54.92ID:???autoじゃなくてUTF8を指定すべきじゃないかな。
あとはphp.iniで指定してる内部文字エンコーディングとかでも変わってるくるからね。
0306nobodyさん
2015/02/23(月) 15:07:53.87ID:3dGVU3d0UTF-8 を指定してもダメでした。
0307nobodyさん
2015/02/24(火) 21:03:39.17ID:???hoge/fuga/hoge2
まで指定したい場合はどうしたらいいんでしょう?
controller=>hoge,action=>fuga,のあと、hoge2にあたる部分の指定の仕方がどうにも見当たりません。
0308nobodyさん
2015/02/24(火) 22:00:31.14ID:???最後のhoge2に当たるところで数字を使っていたのがどうもよくなかったみたいで、文字列に変えたところ、actionを指定した後にカンマを打ってそのまま書くだけでうまく行きました。
でもコントローラからstrvalしてビューに渡してもなぜかビューではint扱いされるんですね。
0309nobodyさん
2015/02/26(木) 17:58:39.07ID:36YMsn8X/app/View → /app/webroot/templates
みたいに、Viewファイルが存在するディレクトリを変えたいです。
0311nobodyさん
2015/02/26(木) 23:30:44.40ID:36YMsn8Xbootstrap.phpにあった
App::build(array('View' => WWW_ROOT . 'templates/'));
を、コントローラーのbeforeFilter()に追加したら出来ました。
ありがとうございました。
0312nobodyさん
2015/02/27(金) 01:42:29.56ID:YC5Ps1qe$str_output = mb_convert_encoding($str_output,"UTF-8","ASCII");
echo mb_detect_encoding($str_output); ・・・�A
文字列をUTF-8にコンバートしているのですが
上記コードを実行しても一向にutf-8になりません。
常にASCII が返ってきます。
何が原因なのでしょうか?
0313nobodyさん
2015/02/27(金) 01:59:37.38ID:???0314nobodyさん
2015/02/27(金) 05:01:23.09ID:YC5Ps1qe半角英数字です。
0315nobodyさん
2015/02/28(土) 14:46:39.93ID:IfvfAmZV以下の様なエラーが出ます。
何が原因なのでしょうか?
UID of script is smaller than min_uid
0316nobodyさん
2015/02/28(土) 14:56:54.33ID:IfvfAmZV自己解決しました。
0317nobodyさん
2015/03/02(月) 20:14:31.17ID:/EFmk8QSvalue serverが糞過ぎです。
cronを設定しても動きません!!もしvalue serverで正常に動作させる方法が載っているHPを
ご存知の方がいらっしゃいましたら教えてください。
0318nobodyさん
2015/03/02(月) 22:25:23.88ID:???0319nobodyさん
2015/03/03(火) 07:45:40.08ID:???どうせ設定ミスだからまず最初にローカルで動作確認してから
同じ設定をvalueserverに張り付けた方がいい
レンタルサーバーでいきなりcron動かすのは問題点特定しにくいから鬼門
0320nobodyさん
2015/03/03(火) 09:37:28.36ID:???今ならビルトインサーバで一発だし今回みたいなケースもxampp使えばすぐなのに
0321nobodyさん
2015/03/06(金) 00:22:12.48ID:???saveallがやってた動きがどうにも再現できん、難しいこと全然やってないのになあ
0322nobodyさん
2015/03/06(金) 01:05:40.10ID:???3ヶ月かけて作ったサイトなんだけど
2でリニューアルすべき?
みんなならどうする?
0323nobodyさん
2015/03/06(金) 07:38:23.90ID:???CakePHP以外にもPHPのバージョンを5.x系の最新にする手間もあるし
バージョン上げるなら、3がRC版がリリースされたので3に上げたい、
だけど上げるとしても機能追加とバージョンアップ作業は別々にした方が安心、
同時だとCakePHP、PHPのバージョンアップ、機能追加とやる事多過ぎで混乱すると思う
0325nobodyさん
2015/03/07(土) 00:01:00.07ID:4wJwCx0Bhttp://fox.2ch.net/test/read.cgi/poverty/1425651890/
0326nobodyさん
2015/03/12(木) 11:53:15.78ID:???セッション使うから嫌って変数を作ってたんだが、setFlashだけで良いことに気づいた。
elementも指定できるから、処理が成功/失敗のHTMLを出力することも出来るし、ビューに無駄な箇所が減る。
0327nobodyさん
2015/03/12(木) 14:39:44.54ID:???0328nobodyさん
2015/03/13(金) 13:31:35.39ID:qp4/hKaLFooControllerのAuthでは'FooCookie', BarControllerのAuthでは'BarCookie'のように
クッキーの名前だけ分けたいのですがどこで指定すればよいのでしょうか。
お願い致します。
0329nobodyさん
2015/03/13(金) 20:39:40.33ID:???あえてやるなら各コントローラーのbeforefilterかな
0330nobodyさん
2015/03/14(土) 12:38:08.43ID:???3使うのってまだ早いですかね?
公式ドキュメントも日本語訳まだ整備されてないですよね
0331nobodyさん
2015/03/14(土) 15:21:12.60ID:???使ってみたいわ
0332nobodyさん
2015/03/14(土) 17:04:29.47ID:???ドキュメントに書いてないことが多いのはいつものことなんだけども
0333nobodyさん
2015/03/14(土) 18:33:04.60ID:FIB+Mu1Tアソシエーション構成について悩んでいます。
テーブルは以下になります(重要な箇所以外省いています)
■ユーザーテーブル(users)
id|username|password|email
■プロフィールテーブル(profiles)
id|user_id|name|gender|comment
■店舗情報テーブル(shops)
id|user_id|name|address|tel
■広告主のテーブル(clients)
id|user_id|company|tantou|tel
■アソシエーションのパターン
一般会員の場合は、ユーザー+プロフィール
店舗会員の場合は、ユーザー+店舗情報
クライアント会員の場合は、ユーザー+広告主
となります。
それぞれ会員登録するページでは上記の組み合わせで登録します。
ユーザーに3つのテーブルをhasOneしてContainで
どのテーブルを取得するか選ぶ方法も考えたのですが、
その設計が正しいのか否か分かりません。
どういうモデル構成でどうアソシエーションを組めば良いか
アドバイスください。お願いします。
0334nobodyさん
2015/03/15(日) 22:01:54.15ID:???自分ならusersに会員タイプ判断用のtypeフィールド追加して、その値によって動的にcontainさせる
hasoneアソシエーション自体は三つとも設定しておく
あと実際の運用でこの程度のフィールド数なら
タイプごとにテーブル分けなくてもいい気がするけど
省略してるフィールドが多いならこのテーブル構成でいいと思う
0335nobodyさん
2015/03/16(月) 08:32:28.20ID:???newEntities()で一発変換できるって書いてたんだが、それだとformのcreateには何渡せばいいんだ?まずnewEntityしたのを渡してからpostが飛んできたらpatchEntitiesって感じにすると返り値が変な配列になるし
0336333
2015/03/16(月) 10:52:24.28ID:???やっぱりContainする方法がベストですかね。ありがとうございます。
あと、省略しているフィールドは多いですね。
1テーブル20ぐらいありますし、後に増える可能性もあります。
パスワード再設定用のテーブルや退会した理由をを保存するテーブルなど
ユーザー+共通テーブルがいくつかあるため、分ける形を採用しました。
■ このスレッドは過去ログ倉庫に格納されています