14/01/20 06:23:11.66
質問者はまず>>1を良く読むこと(必須!)
過去スレ、関連スレ、FAQなどは>>2-10辺り
次スレは>>980が立てる。10分以内に立たない場合、宣言してから立てたい人が立てること。
◆前スレ
【PHP】下らねぇ質問はID出して書き込みやがれ 131
スレリンク(php板)
◆質問用テンプレ
【OS名】CentOS
【PHPのバージョン】5.5
【連携ソフトウェア】MySQL ImageMagick
【質問内容】
◆質問する時の注意
・ スレを上げて自分のIDを表示させること。(メール欄に何も記述しない。専ブラのsageチェックを外す)
・ 己の行った操作、変更などを詳しく明記すること。
・ エラーメッセージはそのまま表記すること。「エラーが出ます」だけでは回答不可。
・ 質問者として、態度をわきまえること。
・ 事前に関連リンクの公式マニュアル、リファレンス本くらいはちゃんと目を通しておくこと。
(PHPで最良の教本はこの公式マニュアル。市販の書籍は嘘が多いので鵜呑みにしない。)
◆質問後の注意
・2回目以降は最初に質問した際のレス番号を入れて、偽者防止に必ずIDを表示させること。
・解決しなくても回答をもらった場合はお礼を言うこと。
(荒らし、煽りは除く。煽られたときも、無闇に反論せずスルーすること。)
◆回答者への注意
・誰にレスしているのか分からないと困るので、>>(アンカー)をつけて回答すること。
【その他諸注意】
・SQL・正規表現・PEAR・テンプレート(Smarty等)・フレームワークは各該当スレへ
2:nobodyさん
14/01/20 06:23:56.77
関連リンク
■本家マニュアル URLリンク(www.php.net)
■日本PHPユーザ会 URLリンク(www.php.gr.jp)
■PEARマニュアル URLリンク(pear.php.net)
■メーリングリスト URLリンク(ml.php.gr.jp)
■ZFマニュアル URLリンク(framework.zend.com)
■Smartyマニュアル URLリンク(www.smarty.net)
(以下英語)
■Zend本家 URLリンク(www.zend.com)
■Zend Framework URLリンク(framework.zend.com)
■php | architect URLリンク(www.phparch.com)
■Smarty URLリンク(www.smarty.net)<)
■PECL本家(英語) URLリンク(pecl.php.net)
3:nobodyさん
14/01/20 06:24:29.22
【簡易FAQ】
1.文字コードは何を使えばいいの?
→1.UTF-8 2.EUC-JP のどちらか。迷うようなやつはShift_JISは使っちゃダメ。
2. このスレに書き込むときに自分のサイト名を晒したくない
→ URLリンク(example.com)が例文などのために予約されている。hogehoge.comは使っちゃダメ。
3. ブラウザに何も表示されないんだけど・・・
→ Apacheの設定を見直せ。ファイルの拡張子は何にしてて、その拡張子でPHPを呼ぶようになっているか?
4. 記号の意味がわからないけどググりようがない
→ 「@」 エラー表示を抑制、「->」 オブジェクトのメンバにアクセス、「::」 静的なメソッド呼び出し、
「==」は暗黙の型変換をしてゆるい比較、「===」は型情報も含めた厳密な比較
5. echo "$arr['hoge']['fuga']"; と書いたらエラーになった
→ {おっぱい括弧}でくくって"{$arr['hoge']['fuga']}"にする
6. 一定時間ごとに自動的に何かしたいんだけど
→ cronかタスクスケジューラを使え。
7.extractって危険なの?
→変数上書き&初期化忘れなどで危険。楽だからという理由だけで安易に使わない。
8. include/requireに「~.php?a=b&c=d」のようなパラメータをつけたい
→ URL呼び出しなら可能だけど、普通のファイル呼び出しではできません
9.include/requireでURLを指定しても何も起きない
→ .phpの拡張子のファイルをURLで呼び出すと、1度PHPプログラムとして実行された結果になる。
10. そもそもインストールの時点でうまくいかない
→ 確認すべきはPHPのconfigureの引数、php.iniの内容と置き場所、
Webサーバの設定(Apacheならhttpd.conf)、起動&再起動あたり
4:nobodyさん
14/01/20 06:25:02.44
11. SQLの質問はどこで?
→ データベース板に誘導されるのが嫌ならPHPにうまく関連させて質問する
12. 文字列のなかに、英字のみとか数字のみとか記号が入っちゃいやんとかはどうしたらいいの?
→ ctype_~()が手軽。複雑なパターンはpreg_~()あたりで正規表現を使う。
13. $a1, $a2, $a3 ... のような変数名をうまく扱いたい
→ 可変変数で実現できるけど、むしろ配列を使って$a[1], $a[2], $a[3]等とするのがベター
14. echoとprintってどう違うの?
→ よく議論される話題であるが基本的に両者とも同じ。 以下ちょっとした議論。
URLリンク(www.faqts.com)
15. クッキーの情報をユーザから隠したい
→ セッション使え。ただしクッキーとセッションは仕組みが違うから同じように扱うな
16. strip_tags()で削除しないタグを複数指定したい
→ strip_tags($html, '<a><p><font>'); // htmlspecialchars()も検討すべし
17. CSVやTSVのファイルをスマートに扱いたい
→ まずはfgetcsv()。ただし日本語を含むと正常に動作しない場合があるので注意だ。
18. 値渡しと参照渡し(「&」を使う)のパフォーマンスの違い
→ C言語じゃないので、パフォーマンス目的で使いわけたらダメ。参照渡しにすると逆に遅くなったりする
参照渡しは引数に戻り値を設定したり引数を関数内で変更するなど、正しい目的に使うこと
19. ファイル入出力関数(fopen等)でリモートファイル(http://~とか)を扱う際の限界
→ fsockopen()でソケット通信 or PEARのHTTP系 or CURLで解決
必要ならHTTPをはじめとする各種プロトコル(どんなデータを送受信するか)はRFCなどで調べる
20. PHPからPOSTリクエストしたい
→19.を参照
21. 画像処理一般 or GDの限界
→ ImageMagick(PECLのやつ or シェルから実行)
22. 画像・音・動画はファイルで保存?DBに保存?
→ 好きにしてください
5:nobodyさん
14/01/20 10:36:50.40
>>1 乙
6:nobodyさん
14/01/20 16:32:43.48
ファイル扱う関数以外はほとんどバイナリセーフって認識ぐらいでいいんじゃね?
7:nobodyさん
14/01/20 20:25:13.22 /QxzPvCb
PHP5.4を使っています。
値渡しと参照渡しがいつどのタイミングで発生するかわからないので教えてください。
$arr1 = array('aaa'=>1, 'bbb'=>2, 'ccc'=>3);
$arr2 = $arr1; // ※1
function hoge($arr3) {}
hoge($arr1); // ※2
このような時、
※1は値渡しでしょうか?参照渡しでしょうか?
※2は値渡しでしょうか?参照渡しでしょうか?
また、
何か見分けの付きやすいルールがあればそれも教えてください。
8:nobodyさん
14/01/20 21:16:56.92 pZcSGmVQ
馬鹿には無理
9:nobodyさん
14/01/20 22:08:40.13
どっかにPHPの参照カウントを図解してるスライドあったよ
10:nobodyさん
14/01/20 22:48:16.64
>>7
URLリンク(www.php.net)
hoge($arr3)は値渡し(コピーオンライト)になります
PHPでは連想配列はオブジェクトではないので
破壊的関数は hoge(&$arr3) と書きます
11:10
14/01/20 22:53:25.36
すみません宣言時です
function hoge(& $arr3) {}
12:nobodyさん
14/01/20 22:55:09.61 /QxzPvCb
>>10
ありがとうございます!
13:nobodyさん
14/01/20 23:02:17.58
>>7
※1も※2も値渡しだよ。
PHPでは、基本的にみんな値渡しになる。
例外的に、オブジェクトにオブジェクトを代入すると参照渡しになる。
オブジェクト以外で参照渡しにしたい場合には、&を変数等の前につける。
もっとも、通常は参照渡しにする必要はほとんど無いはず。
14:nobodyさん
14/01/21 11:04:34.04
これ読むといいよ。
『PHPが糞言語なのはどう考えても参照をポインタだと思っているお前らが悪い』
URLリンク(tanakahisateru.hatenablog.jp)
15:nobodyさん
14/01/21 22:58:26.87 DnPfDE6k
PHPでGDライブラリを勉強中なのですが、
ピクセルのRGB値を取得する以下のサンプルで、
$im = imagecreatefrompng("php.png");
$rgb = imagecolorat($im, 10, 15);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
var_dump($r, $g, $b);
このようなやり方でRGB値を取得できることはわかったのですが、
このなかの「$r = ($rgb >> 16) & 0xFF;」の部分はどういう処理を
行っているのでしょうか?
「>>」という記号と、「&」の部分がどういう意味なのか教えてください。
どうぞよろしくお願いします。
16:nobodyさん
14/01/21 23:10:12.38
>>15
関連リンク
■本家マニュアル URLリンク(www.php.net)
演算子の項を参照
17:nobodyさん
14/01/22 00:12:36.65
>>15
>>はビットシフト
RGBは24bitなので、右に16bitシフトすればGとBのビットは捨てられてRだけになります
& 0xff はビットマスク
ここでは下位8bitはそのまま、それ以外のビットがあれば0にする意味で使われています
18:15
14/01/22 08:39:19.31
>>16
>>17
ありがとうございました!
19:nobodyさん
14/01/22 14:46:32.76 aoIHocMl
組み込み関数の「trim」について質問です。
フォームからの投稿文字列の最後に、「改行」がある場合、削除したいのですが、
うまく効かないです。何が原因でしょうか?
$val = isset($val) ? trim($val) : '';
マニュアルを見ると、改行を除く場合、第二パラメーターは不要とのことです。
URLリンク(jp1.php.net)
原因がわからず困ってます。よろしくお願いします。
20:nobodyさん
14/01/22 14:53:14.65
$val の内容ダンプしてみては
21:19
14/01/22 14:58:11.25 aoIHocMl
>>20
大変、失礼しました。自己解決です。
trimが効いていないと思ったら、効いていました。
投稿後、セッションの元データをフォームに反映させていたため
効いていないと、勘違いしていたみたいです。
お騒がせして済みませんでした。
22:nobodyさん
14/01/22 18:04:34.87
ム板のPerlスレもだいぶPHPの良さが分かってきたみたいだな
23:nobodyさん
14/01/22 19:04:29.09
でもまだ抵抗してる馬鹿がいるだろ。
継続的に啓蒙していくことが重要。
24:nobodyさん
14/01/22 22:36:56.70 FG8ViAIJ
一行もPHPのコードが書けないバカはここに来るな
25:nobodyさん
14/01/23 00:06:20.34
>>23
啓蒙つーか
perl使ってる奴は底辺だって事実を
認知させるところからだろ
26:nobodyさん
14/01/23 02:52:37.95 df5KuOGo
PHP使ってる奴は底辺だって事実を
認知させるところからだろ
27:nobodyさん
14/01/23 03:35:34.87
perlじゃお金にならないよ
28:nobodyさん
14/01/23 03:37:23.28
いやいやこいつはどの言語も使えない馬鹿チョンだろ
29:nobodyさん
14/01/23 10:31:13.88
スレ違いです
質問書いてください。
30:nobodyさん
14/01/23 10:46:43.24
>>27
Perl厨はPerlそのものを使って仕事を見つけるつもりはないと苦しい言い訳をしているよ。
31:nobodyさん
14/01/23 18:25:39.43
俺も見かけたときは加勢してやってるんだから
お前らもがんがれ
32:nobodyさん
14/01/23 19:49:26.64
>>30,>>31
>>24
33:nobodyさん
14/01/23 20:04:29.62
Perlで質問してるところにPHPで解答コード書いてやればいいんじゃね?
そうすればPHPユーザーのスキルレベルとPHPの有用性を同時に示すことができる
34:nobodyさん
14/01/23 21:17:36.49
そしてPHPerは空気も読めないのかと言われる
35:nobodyさん
14/01/23 21:47:21.78 df5KuOGo
ぺちぱーにそれが果たしてできるのかな
36:nobodyさん
14/01/23 23:37:54.85 7YymRraU
【OS名】RedHat
【PHPのバージョン】5.3
【連携ソフトウェア】MySQL CodeIgniter
【質問内容】
セッションに大量に突っ込むと中身が消えます。
具体的にはセッションに3000文字とかいれると消えます。
1000文字とかであればちゃんと入っているんですがセッションの容量には上限があるんでしょうか?
以前にちょっとしたファイルをやり取りしたことがあるので3000文字程度では大丈夫と思っていたのですが設定など見ても上限に該当するものがみあたりませんでした。
37:nobodyさん
14/01/24 00:07:02.91
保存先がCookieになっていないか確認したか?
38:nobodyさん
14/01/24 00:07:11.60
とくに制約を受けるサイズないと思うよ
デバッガで追ってみたら
39:nobodyさん
14/01/24 00:11:01.69
中身が消えるっていうのは、Session自体は生きてるけど特定のパラメータだけNULLか何かになるってこと?
その辺どうやって確認してんの
40:nobodyさん
14/01/24 10:09:16.59 d/hHeezf
みなさん回答ありがとうございます。
単純にsessionの関数使っているだけなのでsessionがどこに保存されているのか?
というのを意識していませんでした。
特に何もしていませんがブラウザーのデバッガーで見たらcookieにそれらしき文字列があったのでcookieだと思います。
中身が消えるかどうかの確認は1000文字いれても取り出せるけど
3000文字だとnullになっているという形です。
保存先を変えることができるのであればやってみたいと思います。
41:nobodyさん
14/01/24 14:46:22.36
セッションの内容をクッキーに保存したら、それは、クッキーでありセッションではないと思うのだが。
セッションとクッキーを混同してるんじゃないの。
それと、クッキーは、たしか4kbyteとかの上限があるからそれが原因だと思う。
42:nobodyさん
14/01/24 15:15:41.95 UatxQsqL
getで送信とかしてないよね
43:40
14/01/24 15:44:15.53 d/hHeezf
みなさんありがとうございます。
単純にCodeigniterのセッションを使って入れておりました。
$this->session->set_userdata($newdata);
こんな感じです。
44:nobodyさん
14/01/24 16:00:50.28
Codeigniterのスレで聞いた方が良いかもしれない。
スレリンク(php板)
45:nobodyさん
14/01/24 16:18:59.36
横レスだけどCookieにSessionデータ詰めるなんて話初めて聞いたわ
46:40
14/01/24 16:29:54.30 d/hHeezf
スレを移ったほうがよさそうですね
私もsessionと書いてあったのでてっきり実データはサーバー側とおもっていたのですが
cookieの中になにやらはいっておりました。
文字数からして4kの上限にあたっているようなのでsessionとなっていますが
cookieの中にいれていたということでしょうか。
ちょっとよくわからなくなってきました。
47:nobodyさん
14/01/24 16:42:11.39
いずれにしても、セッションのデータがクッキーに入ってしまうのは、
セキュリティ上も良くないと思うよ。
48:nobodyさん
14/01/24 17:25:34.78
CIのマニュアルにCookie使うから4kbまでってはっきり書いてあったわ
マニュアルも読まずに質問するとは乳首1000クリックの刑
49:40
14/01/24 17:36:06.47 d/hHeezf
みなさん申し訳ありません。
確かにマニュアルにクッキー使うよと書いてありますね。
sessionってあったからてっきりそうなのかと思ってましたがCIのsessionはcookie保存のようです。
別の手段で回避することにしました。
お騒がせしました。
50:nobodyさん
14/01/24 19:56:24.36
>>45
Codeigniterでは、セッション情報を暗号化してクッキーに保存するらしい。
あと、DBにも保存することが可能だとか。普通にファイルとして保存すればいいのに。
URLリンク(codeigniter.jp)
51:nobodyさん
14/01/25 00:34:33.81
そういう発想なかったけど、セッションサーバいらないってのは魅力かもね
Hmac付けてHiddenを引き回してたのに近い感じやな
52:nobodyさん
14/01/25 01:31:58.66
最近じゃhtml5のlocal strageが5MBytesある。
http2.0なぞ普及するとサーバ側が非同期にpullするサービスも増えてくるのかしらん。
53:nobodyさん
14/01/25 07:04:11.94 HM5WIj95
ログイン実装をFWに頼らず自力でやろうと思ってます
cookieの存在・仕様については無知なので以下の流れで本当に大丈夫なのか心配です
1.パスワード等でログインが成功したらcookie["token"]にランダム文字列を格納(Aとする)
2.Aをデータベースの個別のUser情報にも記録(Bとする)
3.毎回ユーザーがアクセスする度にA(cookie側)とB(DB側)が一致するかチェック
一致すればログインされてる 一致しなければ未ログイン
4.もしtokenが作られて24時間経てばtokenを一度破棄してログアウトさせる
これで十分にセキュアなログイン仕様となるでしょうか?
54:nobodyさん
14/01/25 10:14:52.55
>>53
>>cookie["token"]にランダム文字列を格納
これがセキュリティ的にまずいかも。
通常は、トークンを自前で作ることはせず、セッションIDの自動発行にまかせる。
また、ログイン機能自体もセッションをメインで作るのが普通だと思うけどね。
そうすれば、DBへの問い合わせとか不要だし。
55:nobodyさん
14/01/25 10:48:20.53
セッションにログインフラグ立てればいいんじゃね
56:nobodyさん
14/01/25 11:48:58.68
>>53
まずはここの「安全なウェブサイトの作り方」を見る。
URLリンク(www.ipa.go.jp)
>>53が書いている処理は、PHP標準のセッション処理を使ったほうが良い。
57:nobodyさん
14/01/25 17:25:45.84
>>53
親父がログインしたエロサイト息子が見放題のまき~
58:nobodyさん
14/01/25 18:06:32.82
>>57
それは、クッキーでもセッションでも変わらないんじゃない。
ログアウトの実装次第であって。
59:nobodyさん
14/01/25 18:24:43.55
通販サイトの、「チェックした商品の履歴」辺りってヤバイよね?
60:nobodyさん
14/01/26 01:40:38.55 tfpbRtMA
自分もログイン機能を作りたいんですけど
セッションにユーザーid、ユーザー名を保存して
ログインが必要なページではセッションに
ユーザーidがあるか確認するというやり方で実装しました。
これだとセッションが切れると一緒にログインも切れてしまいます。
ブラウザを閉じるまでログインを維持するにはどうしたらいいでしょうか?
61:nobodyさん
14/01/26 04:26:44.36
PHPで回答してやろうと思ってチェックしてるけどなんか歌の話しててチャンスがないんだがあいつら馬鹿か
62:nobodyさん
14/01/26 07:45:41.36
>>61
>>24
63:nobodyさん
14/01/26 09:51:54.84
>>60
セッションが切れるとログインも切れるってのは正常な動作なんだが
セッションのタイムアウトを伸ばせばいい
64:53
14/01/26 10:59:50.06 LLTt79Q+
皆さんありがとうございます
いまいちセッションが何なのかよくわかっていませんでした(cookieの別名ぐらいの認識)
よくサンプルコードでsession["user_id"] = hogehoge みたいなのを見かけて、
これだとクッキーにuser_idが書き込まれちゃうからありえない実装だ!と勘違いしてました
この場合["user_id"] = hogehogeはPHPのsession内部で管理していいて、
ユーザー側のcookieにはsession_idしか残らないんですね
一瞬で理解が深まりました本当にありがとうございます
65:nobodyさん
14/01/26 11:51:46.45
>>60
デフォルトでは、1/100の確率で、24分より古いセッションファイルが消える。
設定を変更するには、gc_maxlifetime の設定値を伸ばせばいいよ。
たとえば、こんな感じだと3時間はセッションが切れない。
ini_set('session.gc_probability', 1);
ini_set('session.gc_divisor', 100);
ini_set('session.gc_maxlifetime', 3 * 60 * 60);
session_start();
>>ブラウザを閉じるまでログインを維持するにはどうしたらいいでしょうか?
これは、わからない。
ただ、あまり長い時間セッションを有効にするとセキュリティ上まずいと思う。
66:60
14/01/26 13:15:54.64 tfpbRtMA
>>63 >>65
ありがとうございます。
>>65のやり方でやってみようと思います。
67:nobodyさん
14/01/26 13:36:49.78
>>80
URLリンク(www.tohoho-web.com)
Cookieの書き込みのパラメータのところ参照
URLリンク(ja.wikipedia.org)
クッキーの適用範囲と有効期限参照
68:67
14/01/26 13:37:35.48
>>80じゃなくて>>60
69:nobodyさん
14/01/26 15:52:13.03
延々とセッションの話してるこっちも似たようなもんでしょ。
70:nobodyさん
14/01/26 20:16:47.31
>>61
引き続き監視頼む。
71:nobodyさん
14/01/26 20:34:26.69
>>70
自演ウザい
72:nobodyさん
14/01/26 22:49:38.34
妄想で書き込んでる>>71がちょっとかわいそう
脳の病気かな、それとも心の病気かな
73:nobodyさん
14/01/26 22:55:32.47
3Dの話出てるぞ。
74:nobodyさん
14/01/26 22:56:21.12
監視スレでも立てて向うでやってれば?
75:nobodyさん
14/01/26 23:02:50.28
>>71
妄想の垂れ流しは他所でどうぞ。
76:nobodyさん
14/01/26 23:11:10.98
3DグラフィックはPHPの専門外だろw
行ける猛者は行ってこいw
77:nobodyさん
14/01/27 03:04:42.97
漠然と3Dって言われてもな
DirectXの3Dモデルに独自フォーマットのXファイルってやつがあって
Xファイルにはバイナリとテキストと2種類あるが
テキストのほうならPHPでも出力できる
テンプレートと頂点情報を文字列として出力するだけだからな
そういう話?
78:nobodyさん
14/01/27 16:05:44.71 YzEqdDGf
PHPで作成したWEBアプリの決済システムについて質問です。
無料サービスに、特典を上乗せした有料会員を募集しようと思っています。
そこで、PHPと連携できる決済システムなどはありますでしょうか?
たとえば、決済が済むと、無料会員から有料会員へ自動で変更できるような
APIを提供している決済システムなどです。
現在、paypalなどを考えているのですが、こうしたAPIが無いようでいまだ検討中です。
よろしくお願いします。
79:nobodyさん
14/01/27 18:11:35.27
>>78
PHPと連携できる決済システムならググれば見つかる。
会員のグレードは決済システムとは無関係のビジネスロジックなのだから、自動で連携できる決済システムはないんじゃないかな。
80:nobodyさん
14/01/27 19:57:51.65 bUMgBNWh
perlなら宮川達彦が何か作ってただろうな
81:78
14/01/27 20:26:35.59 VwC5UIRJ
>>79
実は、検索はしたのですが、これといったものが見つからなかったのです。
そこでPHP使いの皆さんはどうしているのかと思い質問させて頂きました。
決済システムの利用は、個人だとハードルが高いのかもしれませんね。
それか調べ方が悪かったのかな。もう少し調べてみます。
ありがとうございました。
82:nobodyさん
14/01/27 20:37:46.66
>>79も言ってるけど会員のグレードを自動で移行できるロジックは自作するしかないよ
決済システム自体は別に個人でも普通に導入できる
83:78
14/01/27 21:15:11.18 VwC5UIRJ
>>82
レスありがとうございます。
「決済システムの導入」と「会員のグレードの変更」は別物と考えた方がいいのですね。
そうであるなら、まずは、「決済システムの導入」に注力したいと思います。
結構、難しそうですが、PayPalを候補に考えてます。
それで上手くいったら、次に、「会員のグレードの変更」にもチャレンジしたいと思います。
この2つを一度で済ませられると考えたのが良くなかったみたいですね。
ありがとうございました。
84:nobodyさん
14/01/30 06:30:49.21 M3G3bQxX
HTTPレスポンスヘッダーを明示的に記述したい場合に
①ini_set('default_charset', 'UTF-8');
②header("Content-type: text/html; charset=utf-8");
はどう違うのですか?
①はスクリプト終了時に元の値に戻されるとのことですが……
使い分けの方法などあれば教えていただきたいです。
85:nobodyさん
14/01/30 10:23:27.80
default_charset は
Content-Type: text/html; charset=UTF-8 の後半部分だけ
86:nobodyさん
14/01/30 12:37:38.81 M3G3bQxX
①ini_set('default_charset', 'UTF-8'); ini_set('default_mimetype', 'text/html');
②header("Content-type: text/html; charset=utf-8");
の違いはないという認識でいいんですかね?
header()はLocationとかヘッダーのiniでいじれない部分を変更できるということですかね
87:nobodyさん
14/01/30 12:41:30.94
マニュアル読め
88:nobodyさん
14/01/30 21:56:15.59
>>84
ini_setで指定しているのはあくまでデフォルトの設定。
headerのほうを指定するとそれが上書きされる。
89:nobodyさん
14/02/02 00:03:04.56 6TG0eOwN
ActiveRecordを継承するModelモデルがあったとして
テーブルにinsertするaddメソッドを作るとき
staticメソッドにすべきかどうかを教えていただきたいです。
以下の2つで迷ってるんですが正解ってあるんでしょうか。
public function add($hoge) {
$this->hoge = $hoge;
return $this->save();
}
$model = new Model;
$model->add($hoge);
----------
public static function add($hoge) {
$model = new static;
$model->hoge = $hoge;
return $model->save();
}
Model::add($hoge);
90:nobodyさん
14/02/02 02:48:14.87
議論のあるところですが、Frameworkの流儀に倣うのがよいでしょうね
元々はテーブルがクラスでインスタンスが行になる感じですね
クラスの得意メソッドが、PHPだとStaticという表現になります
91:nobodyさん
14/02/02 03:55:43.87
>>89
ARでは、クラス -> テーブル、インスタンス -> 行、プロパティ -> カラム、という表現
insertはテーブルに対する操作なので、インスタンスではなくクラスに対するメッセージ==クラスメソッドで表す
RailsのARだとまさにClassMethodsつー思い切ったモジュールがあって、このcreate()がinsertに対応しているので
お宅の求めているものにかなり近いだろう
URLリンク(github.com)
92:nobodyさん
14/02/02 07:28:04.31
出番だぞ
724:デフォルトの名無しさん :2014/02/02(日) 04:29:49.87 [sage]
1000日後の日付をYYYY-MM-DD形式で取得するのに簡単な方法はありますか?
前提条件はできるだけ少ないほうがうれしいです
93:nobodyさん
14/02/02 09:49:34.74
いつから1000日後よ
94:nobodyさん
14/02/02 12:30:52.38
DateTimeクラスのaddメソッド
95:nobodyさん
14/02/02 12:44:47.02 XaYZuhBO
function view() {
extract([ "v1" = > "aaa" ]);
require("test.php");
}
test.php
<?
function func() {
echo $v1; // ここで$v1を表示するにはどうしたらいいですか
}
global $v1 と $GLOBALS['v1'] でも表示されません
96:nobodyさん
14/02/02 14:59:01.63
requireの場所違くね
97:nobodyさん
14/02/02 15:25:36.73
func(extract([ "v1" = > "aaa" ]))じゃダメなの?
98:nobodyさん
14/02/02 15:26:50.98
突っ込みどころが多すぎる
99:nobodyさん
14/02/02 15:34:01.86
一番手っ取り早い方法
function~ {と } の行を全てコメントアウト
= > を => に
<? を <?php に
view()のあるファイルの先頭に <?php 追加
これでいけると思うが
100:nobodyさん
14/02/02 16:00:51.61
>>97は無視してくれ extractという関数を理解していなかった
extractってのはシンボルテーブルに変数をインポートする関数なんだが
別のphpファイルだとシンボルテーブルを共有してないっぽい
101:nobodyさん
14/02/02 16:07:28.45
関数ごとにシンボルテーブル違うっぽいな
102:95
14/02/02 16:13:00.92
無理ぽいのでとりあえず引数で渡すことにします。
皆さんありがとうこざいました。
103:nobodyさん
14/02/02 16:13:21.82
質問者は関数定義だけしてその関数を呼んでない、というのもあるw
104:95
14/02/02 16:13:50.74 XaYZuhBO
ID出し忘れました
105:nobodyさん
14/02/02 16:20:08.31
1 <?
2 $a = "aaaaaaaaaaaaaaaaaaaaa";
3 echo "in global\n";
4 print_r(get_defined_vars());
5 function bbb(){
6 $b = array("bbbbbbbbb" => "bbbbbbbbbbbbbbbbbb");
7 extract($b);
8 echo "in function\n";
9 print_r(get_defined_vars());
10 }
11 bbb();
12 echo "in global\n";
13 print_r(get_defined_vars());
106:nobodyさん
14/02/02 16:20:50.71
test.phpの実行結果
in global
//大量に変数が表示される
[a] => aaaaaaaaaaaaaaaaaaaaa
in function
Array
(
[b] => Array
(
[bbbbbbbbb] => bbbbbbbbbbbbbbbbbb
)
[bbbbbbbbb] => bbbbbbbbbbbbbbbbbb
)
in global
//大量に変数が表示される
[a] => aaaaaaaaaaaaaaaaaaaaa
どうやらextract($b)によって変化するのはbbb()のシンボルテーブルのみ
107:nobodyさん
14/02/02 16:28:01.37
あと面倒くさいから確かめてないけど
func()でglobalをつかってもtest.phpのシンボルテーブルが参照されるだけで
requireされた場所(views)のシンボルテーブルが参照されるわけではないんじゃないの
108:nobodyさん
14/02/02 16:39:41.69
<?
$v1 = '';
function view() {
global $v1;
extract(array( "v1" => "aaa" ));
require("test.php");
}
view();
testfunc();
--------------------
<?
function testfunc() {
global $v1;
echo $v1; // ここで$v1を表示するにはどうしたらいいですか
}
--------------------
109:nobodyさん
14/02/02 16:44:10.62
test.php
<?
require('test2.php');
function view(){
extract(array("v1"=>"aaa"));;
func(get_defined_vars());
}
view();
test2.php<?
function func($hoge){
echo $hoge["v1"];
}
これじゃダメ?
110:108
14/02/02 16:46:04.11
上が適当なファイルで下がtest.php
extract(array( "v1" => "aaa" ));
は動かしたphpのバージョンが古いので変更している。
requireはあくまでファイルを読み込むためのもの。例え関数内で読まれたとしてもその意味は変わらない。
view関数の中でrequireしても、view関数内の変数がglobalの対象にならないよってことで。
111:nobodyさん
14/02/02 16:47:28.98
個人的に関数を呼び出すごとにrequireっておぞましいんだが普通なんか?
112:nobodyさん
14/02/02 16:56:25.03
>>111
あまりrequireすることがなくてサイズが大きいやつだとオーバーヘッドになるから、その関数内でやる場合もあるかも。
ただ効果があるかどうかは知らない。
113:nobodyさん
14/02/02 17:16:05.52
自分は主な関数ごとにファイルを作成しているから、使う関数の数だけrequireするよ。
たいていは、多くても10ファイル前後におさまる。
速度も別に遅くならないし、気にならない。
まあ、auto_loadが関数の読み込みにも使えたら便利なんだけど。
114:nobodyさん
14/02/02 17:38:45.22 UuBd4EHo
質問と言って良いかわからんが
curl_multi_exec を使うと「エラー時のエラー番号が0」になる人いない?
バージョンは最新のどれでも。
curl_exec だとしっかりエラー番号も取れるんだけどねー。
115:nobodyさん
14/02/02 17:42:38.20
仕様見てみりゃわかる。
multi は個別にエラーチェックしないと
116:89
14/02/02 17:53:21.79 6TG0eOwN
>>91
ありがとうございます。クラスメソッドにすることにしました。
クラスメソッドの使いどころについてもうちょっとお聞きしたいです。
オブジェクト指向の勉強にとデザインパターンの入門サイトを見ていたのですが
factoryメソッドの紹介でこんなコードが載ってました。
URLリンク(codepad.org)
このReaderFacotoryクラスのメソッド2つをクラスメソッドにしない理由がよくわかりません。
$factory = new ReaderFactory(); // このnewが無駄に見えて仕方ないです
$data = $factory->create($filename);
単に $data = ReaderFactory::createReader($filename);
とせずインスタンスを作る利点は何なのでしょう?
117:nobodyさん
14/02/02 18:13:08.61
>>116
載ってるコードだけで完結させるならどっちでもいい。public staticにする必要はあるけど。
addとかdeleteとかメソッド作ったりしてクラスを改造していくならインスタンス作るほうが便利。
118:nobodyさん
14/02/02 19:09:25.78
95 はテンプレートエンジンじゃないの
119:114
14/02/02 19:34:26.88
>115
>multi は個別にエラーチェックしないと
エラーメッセージは正確に出るのに
番号は出ない仕様なの?
よければ、マニュアルに書いてあったら教えてください。
120:nobodyさん
14/02/02 21:36:29.16
>>166
create
121:nobodyさん
14/02/02 21:37:01.14
ぉん?
122:nobodyさん
14/02/02 23:19:31.40
>>166
依存性を小さくできる、パターンに従っていれば伝わりやすい、OO的に自然で理解に手間がかからない
上のファクトリは単純にStaticにしても動かない
ファクトリはサブクラスにオブジェクト生成の詳細を任せるパターンだから、createReaderはオーバーライド前提になっている
ReaderFactory::create()からサブクラスのcreateReader()を呼ぶのは、親にとって未知の子孫固有のメソッドを呼ぶこと
そのためget_called_class()なり遅延束縛なりして実行時にstaticメソッドのバインド先を決定してやる必要があるという
謎設計に帰結する。遅延束縛がなかったころはさらに不自然だった。
OOPではクラスメソッドは(各インスタンスではなく)クラス自身の振る舞いを記述するものだと言っていいだろう
コード上でメッセージをやりとりしてシステムを形成しているオブジェクト==インスタンスだとすれば、クラス自身は何か?
この設定いかんによって、クラス固有のメソッドとして自然なものと不恰好なものを区別できる
static張りまくって関数ポインタのかたまりを作る人もいし、それがよいケースもある
しかし手続きからOOに入ってやりがちな、よくないstaticについてはstatic evilとかでぐぐれば情報はある
123:122
14/02/02 23:24:15.85
つられたw
>>122は>>116へ
124:nobodyさん
14/02/03 03:26:24.18
遅延束縛なかったら静的メソッドのユニットテスト糞になるからな
125:nobodyさん
14/02/09 11:25:27.29
php関数名って一貫性なさすぎだろ
一旦全部エイリアスにして新しいの付けるべき
126:nobodyさん
14/02/10 01:52:41.55
isset は is_set で有るべきだと思うんだ
127:nobodyさん
14/02/10 03:44:49.98
alias.phpでも作ってろ
128:nobodyさん
14/02/10 09:41:58.22
>>125
正しい名前でラップするには都合がいいだろう?
129:nobodyさん
14/02/11 22:13:31.86 ak6dJouy
OS XP
php ver 4
適切なスレが見つからなかったのですが、
phpでmysqlのテーブルから文字列を取ってきて表示させようとしたのですが、
半角パーセント記号を含む文字列において、パーセント記号が消え、次の文字が変な記号になってしまいます。
文字列中の%を\%などとしてみてもダメでした。
解決法を教えてください。
130:「ガスライティング 集団ストーカー カルト」で検索を!
14/02/11 23:02:18.69 lii3ZN0H
★マインドコントロールの手法★
・沢山の人が偏った意見を一貫して支持する
偏った意見でも、集団の中でその意見が信じられていれば、自分の考え方は間違っているのか、等と思わせる手法
・不利な質問をさせなくしたり、不利な質問には答えない、スルーする
誰にも質問や反論をさせないことにより、誰もが皆、疑いなど無いんだと信じ込ませる手法
↑マスコミや、カルトのネット工作員がやっていること
TVなどが、偏った思想や考え方に染まっているフリや常識が通じないフリをする人間をよく出演させるのは、
カルトよりキチガイに見える人たちを作ることで批判の矛先をカルトから逸らすことが目的。
リアルでもネットでも、偽装左翼は自分たちの主張に理がないことをわかっているのでまともに議論をしようとしないのが特徴。
,.,.,,
131:nobodyさん
14/02/12 09:15:48.34
>>129
php4か…
新規で学習中なら現在主流のphp5をおすすめします。
(できればOSも来年度以降サポートがあるものが(winでもLinでも)望ましい)
mysqlではパーセント記号がワイルドカードとして扱われるからそれが影響してるのかも。
phpmyadminとかで取り出す前のデータが化けてないか確認してみるといいかも。
化けてるならinsertに問題あり。
化けてないならselectに問題あり。
132:nobodyさん
14/02/12 10:53:26.54
>>129
表示はどうやってるの?
printf 使ってるなら、1番目は%sにして文字列は2番目で
133:nobodyさん
14/02/12 11:57:19.74
>>129
どの文字がどう変わるのか、もう少し具体的に言った方がアドバイスを
貰いやすいよ。
134:nobodyさん
14/02/12 13:37:43.31
>>129
base64というものがありまして。
抽出、表示を一気にやる前に、抽出したものをそのままログファイルなどに出力して確認してはどうだろう。
135:nobodyさん
14/02/12 19:37:08.84
ceil(7000*1.08)が7561になるのは仕様?
どうすれば7560って出せるの?
切り上げでね。
136:nobodyさん
14/02/12 19:55:29.57
>>135
>>1
137:nobodyさん
14/02/12 21:41:24.51
>>135
PHPのせいといいたいかもしれないけれど、小数がどう扱われるかを勉強したほうがいい。
何かと付きまとう問題なので。
138:nobodyさん
14/02/12 21:51:04.93
>>135
仕様
ceil(7000*108/100)とすればよい
消費税だろうけど、浮動小数点数型の丸め誤差は勉強した方がよいと思うよ
139:nobodyさん
14/02/12 21:53:28.41 rdsqA60A
この程度で丸め誤差とか致命的に腐ってるだろ
140:nobodyさん
14/02/12 22:24:47.86
>>139
腐ってない言語ってなにかあるのか?
141:129
14/02/12 22:44:26.79 J2CtCpwd
具体的には下の通りです。
ちなみに出力はflashでしています。
(flashが原因でないことは確認しています)
【テーブルの文字列】
フィールドdata2 「ダメージを50%カット。」
【php】
if(!$mysql->query("SELECT * from table")){
}else{
while($row=$mysql->fetch()){ $data=$data.$row["data1"].",".$row["data2"].",";
}
echo "data=".$data;
【出力結果】
ダメージを50?≪ット。
142:nobodyさん
14/02/12 22:46:17.19
すみません。phpの方コピペミスで"}"足りないです。
143:nobodyさん
14/02/12 22:47:07.64
>>139
Perl、Python、Ruby すべて 7561 になる。
これは1.08が2進数では循環小数になることが影響している。
144:nobodyさん
14/02/12 22:54:42.67
>>139はCOBOL以外は全部腐ってるって言いたいんだろ。
145:nobodyさん
14/02/12 22:59:09.78
>>129
insert時にミスってるように見える。
コマンドラインのmysqlで直接データ見たほうが良いと思う。
146:nobodyさん
14/02/12 23:02:39.00
Pythonならdecimal、RubyならBigDecimalがあるけど、PHPの場合は…gmp_*ぐらいしかないか
147:nobodyさん
14/02/12 23:06:27.54
>>145
テーブルの文字列は、phpmyadmin上で直接手打ちしました。
phpmyadmin上では正常に入力されているように見えます。
148:nobodyさん
14/02/12 23:12:22.34
>>146
文字列を使って小数点を扱うクラスとしてはdecimal便利だよね
PHPは利用用途が多くないから実装されてないな
149:nobodyさん
14/02/12 23:41:18.22
>>139
レス乞食おつ。
150:nobodyさん
14/02/12 23:45:37.82
>>141
化けるのと同じくらい深刻なトラブルがあるんだけど、
data= が出力されてないよ。大丈夫なのかな。心配だよ。
151:nobodyさん
14/02/12 23:59:12.57
>>141
すみません。一応通常の動作は確認済みです。
ここに要点だけ書くためにいじったら変になってしまい。。
解決策が無いようであればおとなしく全角%にします。。。
152:nobodyさん
14/02/13 00:47:36.04
%がおかしなるのはエスケープ周りじゃないかなあ
文字コードも分からんし
153:nobodyさん
14/02/13 00:57:57.07
要点だけ書くなら検証方法も要点にまとめてほしいもんだわ。