◎正当な理由による書き込みの削除について: 生島英之 とみられる方へ:【PHP】下らねぇ質問はここに 9 YouTube動画>1本 ->画像>1枚
動画、画像抽出 ||
この掲示板へ
類似スレ
掲示板一覧 人気スレ 動画人気順
このスレへの固定リンク: http://5chb.net/r/tech/1513760420/ ヒント: 5chスレのurlに http ://xxxx.5chb .net/xxxx のようにb を入れるだけでここでスレ保存、閲覧できます。
PHPに関する質問スレです
前スレ
【PHP】下らねぇ質問はここに書き込みやがれ 8
http://2chb.net/r/tech/1489506082/ 次スレは
>>980 以降
本文の1行目に以下を追加すること
!extend:on:vvvvv:1000:512
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
evernoteのENEXファイルをパースする処理を書いていますが $str = '<?xml version="1.0" encoding="UTF-8"?> <en-note><div>てすと</div><div>てすと</div></en-note>'; $xml = simplexml_load_string($str); var_dump($xml); とすると object(SimpleXMLElement)#1 (1) { ["div"]=> array(2) { [0]=> string(9) "てすと" [1]=> string(9) "てすと" } } となり、en-note要素がどこかにいってしまいます en-noteを取り出してasXML()したいのですが、 何故かsimplexmlオブジェクトの中にありません en-noteという名前が悪いのかと思ってdivとかhとかにしてみましたが それでも一番外側の要素はsimplexmlオブジェクトに入っていません 何故こうなるのでしょうか?
>>3 これ消えているのではなくて、
一番外側のオブジェクトがまさにそれですね?
xmlタグが一番外側の要素で、
その次のタグがその子要素になると思い込んでいました
shell_execなどは、mod_phpから実行した時には 何か制限を受けるのでしょうか? echo shell_exec('"C:/Program Files (x86)/Evernote/Evernote/ENScript.exe" exportNotes /q "ほにゃらら"'); これでevernoteのノートを出力出来るはずなのですが mod_phpから呼び出した時には何も表示されません コマンドラインから呼び出すと普通に表示されます echo shell_exec('cd') のように単純なコマンドで試すと、mod_phpでも問題なく実行されています メモリ制限の問題かと思ってmemory_limitを-1にしても何も変わりません
>>5 についてですが
外部実行ファイルはドキュメントルート下に置かないと実行できないみたいな情報があったので
ENScript.exeを呼び出すバッチファイルをドキュメントルートに置いて実行してみましたが駄目でした
mod_phpからwhoamiを実行すると
nt authority\systemという権限で動いていることが分かりました
この権限が制限を実現しているのでしょうか?
また、セーフモードではありません 外部プログラムの制限についてドキュメントに書いていないのが解せません… Windows版だけの現象なのでしょうか
Evernoteとか使ったことないから知らんけど, その実行者の権限で見える, 見えてよい或いは見えるべきものを扱ってんの?
Evernoteは非常に個人的なものなので、 確かにウェブサーバからデータが見えたらどうなのかっていうのはありますね 自分用アプリを作るためにApacheとブラウザを使っていましたが 本来ウェブサーバはネットに公開するためのものなので 権限が低くされるのも当然といえば当然。 そう考えるとウェブサーバを使ったアプリ構築を脱却して Electronとかを使って作った方がいいですね ありがとうございました
include先での$_POSTの参照について質問です。 index.html(httpd.confいじってhtmlファイルでもphp使えるようにしてる)からfile1.phpをincludeし、file1.phpの中でfile2.phpをincludeしています。(処理の関係上そうしたい) index.htmlにPOSTがあった場合に、file1.phpでは$_POSTを参照出来るのですが、file2.phpからは何故か出来ません。 index.htmlで直接file2.phpをincludeするとPOSTの参照は出来ます。 そこら辺のルールに詳しい方いましたら解説していただけないでしょうか。よろしくお願いします。
ドがつく素人です。
しょーもない質問ですいません。
【困りごと】
ドキュメントルートにphpinfo関数を実行するファイルを作成したが、
ブラウザ上でうまく表示されない。(スクリプトの記述のまま表示されてしまう)
【状況】
ApacheとPHPをインストールしたんですが、
以下URLのようにphpinfoコマンドで記述したphpを、
ドキュメントルートに入れて、
http://localhost/phpinfo.php で
実行したのですが、
<?php
phpinfo();
?>
と、スクリプトの記述そのまま表示されてしまいます。
何か設定ミスだとは思うのですが、なかなか原因が分からず・・・・
【URL】
https://i-bitzedge.com/php/how-to-use-phpinfo XAMPPじゃなくてApacheとPHPを個別に手でインストールしたのか?
手でインストールするならApache側の設定を修正してPHP用モジュールをロードする必要があるぞ
何か今になってもXAMPPやらApacheやらの導入を最初にやらせるサイト結構あるけど, きちんとしたWebサーバが本当に必要になるまではPHPのビルトインサーバが楽でいいよ
http://php.net/manual/ja/features.commandline.webserver.php >>5-9 その書き方で、notepad は、起動できるのか?
もし起動できるのなら、ENScript.exe に与える引数がおかしいのかも
>>12 ちな俺はXAMPP/Windowsで使っているけど、最初からPHPは使えた。
(もちろん13の言うとおり、最初から設定してあるという意味で)
一般論になるが、環境の立ち上げはずぶの素人だと辛い。
(はまった場合に回避できない)
だから13の言っていることは正しくて、知らないのならまずはお手軽環境でやったほうがいい。
XAMPPも十分お手軽だし俺はいいと思うけどね。
最初からガチ鯖で、というのも一理あるのだが、それは後付けの意見でしかないことも多い。
初めてc#でプログラミング始めたんですが、 Visual studioを使ってると頻繁に行末に移動する「end」やカーソルキーを使いたくなるけど、 ショートカットってないんでしょうか? nemacsとかだとctrl+eとかで行末に移動してくれたようなおぼろげな記憶があるんですけど。
ほんとくだらない質問ですいません。 ググったけどショートカット見つからなかったもので。
>>12 AddHandler とかFilesMatch とかが
コメントになってるだろう
AddHandlerはファイルを特定する方法が甘いから使い方注意だが
よくあるファイルアップロードフォームと受け取り側PHPの構成なんですが、 アップロードされたファイル名がマルチバイトだと文字化け・・・というより、「あ.txt」なら「あ.txt」 となってしまいます。 Windows + XAMPP 環境ですが、 mb_convert_encoding($uploadfile, "SJIS", "auto"); や mb_convert_encoding($uploadfile, "CP932", "auto"); を行っても結果は変わりません。 何かチェックすべき項目を見落としていると思うのですが、お助け下さい。
おうふ 「あ.txt」が「&#12354;.txt」(半角)となります。
自己解決しました。 これでいけますね。 mb_convert_encoding($uploadfile, "SJIS", "HTML-ENTITIES"); ところで、これって環境によって不要だったりするのですか?
$a = [ [1, 5], [9, 1], [8, 2], [1, 2], ]; みたいに宣言しているところがあって、これの2個目と3個目を変数で宣言したいわけよ $a = [ [1, 5], $b, [1, 2], ]; みたいに。 この時 $b にはどういう入れ方すれば最初の形を再現してくれます?
やはりか $b = [ [9, 1], [8, 2], ]; にしちゃうと形変わっちゃうよな?
Docコメントはツール使って書いてますか? それとも使わず書いてますか?(*´ڡ`●)
画像アップロードする時に、1つのフォルダにアップロードするのではなく、 /年/月/ファイル名 とわける方法があります。(WordPressとか) しかしこの場合、ファイルを編集(入れ替える)時に以下の処理が必要になります。 1:編集するファイルの登録日を取得 2:1のフォルダ内にファイルが存在するか確認 3:存在していたら削除する 4:更新日のフォルダを作成 5:4のフォルダにファイルをアップロード この処理を行うと「登録日のフォルダにファイルがひとつも存在しない」 と言った可能性があり、空フォルダになります。 空のままにしたくない場合は {他にファイルが存在しない場合はフォルダごと削除} と言った処理も必要になります。 ファイルをDBで管理している場合は、何度もクエリーを投げる必要があり、 無駄が多い気がするのですが、いかがでしょうか?
>>29 ファイル操作はDB更新とは別に出来るだろう
PHP単独でファイル存在チェック、削除、DIR操作、アップロードやって
DBは必要な事だけすれば良いんじゃないの?
Readに対してWriteの回数は極めて少ないと思えば大した問題ではないのでは
>>30-31 ご意見ありがとうございます。
WordPressとか他のCMSを見たのですが、
一度登録した画像を編集(作り直す)のは止めようと思います。
無駄が多いですし、ファイル操作で入れ替えるみたいな処理もおかしい気がして。
入れ替えるなら一旦削除してアップロードし直すのが通常だと思いますし
例えば↓みたいなループがあったとして、<br> error_logがなかったら0.001秒で処理が終わって、 ある場合は5秒くらいかかるんだけど、error_logって結構コストの掛かる処理なん? for ($i = 0; $i < 100000; $i++) { error_log("hoge"); } ちなみに手元の環境はPHP7.2.0
ログを実際にコンソールに出してるなら その分遅くなる、もし出してるならファイルにリダイレクトしてみ
すいません。 mysqliで接続されません。 dbサーバーとwebサーバーは同一です。 ワードプレスを導入しているのですが、そちらはインストールされて記事等もdbに入って更新も出来ます。 phpadminも入りました。 ただそれ以外のページからだと接続すらできてないです。(接続を行うとエラーも出ない上、phpが空白で表示される。echo等も死ぬ) 何か考えられる原因等ありますか?phpの権限とかですか?
質問させてください。 JWTを使いたいです。 HTTPでリクエストして、レスポンスとしてJSON形式のテキストを受け取る際の署名にJWTを用いたいです。 JSONに電子署名をして、URL-safeな文字列にする手順の規約、と言うのは分かりましたが具体的にはどうすればそうなるのか分かりません。 署名する処理は JwtHS256Encodeメソッド でやりたいです。 hash_hmac()は使ったことがあります。 具体的なソースコードなど提示してくれるとありがたいです。 とんちんかんなことを言っていたらすみません。 よろしくお願いします。
>>38 ありがとうございます!
まだ試してないんですが、軽く目を通したところdownloadの文字があるので何かしらのファイルをダウンロードしてどっかのディレクトリに置いておいてその都度呼び出して使う、みたいな感じのものなんですかね?
とりあえず一回色々やってみます!
簡単ではありますが報告を。
composer使ってphp-jwtインスコして
>>38 のサンプルにrequire_onceでjwt.php指定して
でecho $jwtしてやったら暗号的な英数字がだだーっと出たので使い方はわかった気がしてます。
composer使うならvendor/autoload.phpをrequireすればよかろう
☆ 日本の、改憲を行いましょう。現在、衆議員と参議院の 両院で、改憲議員が3分の2を超えております。 『憲法改正国民投票法』、でググってみてください。国会の発議は すでに可能です。平和は勝ち取るものです。お願い致します。☆☆
switch-case文について質問です。 通常こういった条件式は自分で書いていくと思うのですが、このcaseリストを ここより前に定義して動的にcaseを増やしていくことは可能でしょうか? switch ($i) { case "A"; break; case "B;" break; … }の caseを一か所に記述して(A,B,C,D,…)と後から編集したらcaseの部分も動的に記述されたことになる というのは可能ですか?ということです なんと表現したらいいかわからないのでわかりにくいと思うのですが、 わかるかたおられましたらご教授ください。
何でそんなことが可能だと思ったのかご説明頂けるかな? 何がしたいのか分からんけどエスパーするとそういうことはState/Strategyパターン使ったらええんちゃう
エディタなり開発するフレームワーク側で補完してくれるかと聞いているのかな
>>45 Java鹿は死ねよ。欠陥言語使っているからそんな発想しか出来なくなる。
>>44 それは関数ポインタをハッシュに入れてcaseのところで引くんだよ。
>>47 うまいことできましたありがとうございます!
>>45 なんでそんなことが不可能だと思ったのか
ご教授頂けるかな?
cakephp3.5を使ってるんですが、 フォルダ名はsrcなのに namespaceやuseの指定はappなのはなぜですか?
/zzz/a.php /xxx/b.php のように a.php , b.php を別々のフォルダに用意して b.phpでrequire (a.php)した時にb.phpのあるフォルダ名xxxを返すには a.phpになんと記述すればいいですか?
>>51 とりあえず
print_r(debug_backtrace());
って書いてみ
>b.phpでrequire (a.php)した時にb.phpのあるフォルダ名xxxを返す
この考え方自体が間違ってる気がするので
もっと前の段階の「結局何がしたいのか?」を書いた方がいいかもな
a は、b からrequire されるので、b はa の場所を知っているけど、 aは、どのファイルからrequireされるのか、あらかじめ分からないはずだから、 aからbの場所は、わからないはず
debug_backtrace()を勧めてるぐらいだから さすがそれぐらいは分かってるw aからbの場所が知りたい時(requireしたファイルのパスが知りたい時) ってじゃぁどんな時よ?って話を俺はしてる autoloadとか使えば済む話なんじゃないかと思ったもんでね
>>52-54 どんな時というかやりたい操作は、
b.phpがあるフォルダ名をDB名にしていて、
a.phpには接続先のDBに対する処理を書いていたので
b.phpがあるフォルダによって動的にa.phpの処理をする、です。
debug_backtrace()で値が返ってこず
色々試していたら
$watgame = $_SERVER['SCRIPT_NAME'];
$watgame = explode("/",$watgame,-1);
$watgame = $watgame[2];
で取得できました。お騒がせしてすいませんでした。
>>55 なるほど
dirname(__FILE__);
をオススメしとく
配列にしたhtmlを一つつなぎで 出力するのって $output= implode("", $html); ってするのが普通ですか? 他にいい方法ありますか?
出力したいだけなら普通にforeachでいいんじゃないの
>>58 ありがとうございます。
とりあえず変数に1つつなぎにしておいとく場合なら
上記のようにimplodeでつなぐという認識で間違いないでしょうか?
>>59 どんな感じでhtmlが入ってるかによるけど
出力するときに配列の中にあるやつをエスケープしたりhtmlspecialchars
したり変数を展開したりするんだったらforeachとかあたりの方がいいんじゃね?
テンプレートエンジン使ったほうがいいかもしらんが
配列を順に出力するだけならforeach 配列をくっつけて別の変数にしたいならimplode implodeしたあとに何かをするわけでないなら おとなしくforeachで出力すべき
phpを7から5にインストールしなおして php.info()を表示させようとしたんですが PHP Fatal error: Unknown: Failed opening required '/var/www/html/index.php' (include_path='.:/usr/share/php:/usr/share/pear') in Unknown on line 0 というエラーが出ます どこがまずいんでしょうか? OSはubuntu16です
>>63 'var/www/html/index.php'
をrequireしようとしたけど
そんなファイルはないぞというエラー
とりあえず
<php
書いてるまんまなので
これを読んで意味が理解できないようではこの先苦労するかも
変なタイミングで送信してすまない とりあえず <php phpinfo(); とだけ書いた適当なファイルを1個用意して それを表示してみればいい
>>65 ありがとうございます
やってみたけどブラウザが真っ白なままでした
permissionも755にしてます
PHP7で関数の戻り値を指定できるようになったので、 function test(int $i) :int { if ($i != 1) { return false; } return $i; } 上記のような関数の場合、戻り値の型が複数あるためfalseの際にエラーになるかと思います。 PHP5時代では上記のようなコードを書くことができましたが、 今後(PHP7以降)では推奨されないようになっていくのでしょうか? また今まではif文で判定してダメならfalseを返すという関数をよく書いていたのですが、 今後上記のようなコードは避けるべきなのでしょうか?
mixedを指定できるようにする案は提案されてるけど話し合いの段階に至ってない ビルトイン関数がmixed返すならしょうがないけど ユーザ定義関数なら7.1から使える?intでNULL許容してint or NULL返すのも考慮してみては 7.2からはobjectも返せるからオブジェクトで包めばどうにでもなるけど
>>69 ありがとうございます。
?intで実装してみます。
>>70 クソコードというのは返り値がint or booleanになっているからでしょうか?
>>71 >>70 ではないがいくら動的型付け言語とはいえ、戻り値の型が違うのはあまりお行儀がよろしくないと思う
完全に同意するんだけどPHPの標準関数がそうなってるから何も言えねぇ
phpでcookieみたいにlocalstorage扱うことできますか?
localStorageってクライアントサイド実装だと思ってたんだけど俺の理解が間違ってたかな
cookieもクライアントサイドだから 同じように扱えないかなと思ったのですが 違うのでしょうか? トンチンカンなこと言ってたらすいません
localStorageAPIをPHPで実装すれば可能だろうけど そのような実装があるかは知らないな Cookieのように仕様が単純なら簡単に実装できるだろうけど でもそれをPHPでやる意味は・・・? DB使ったりJSONやシリアライズ使ったり他の方法をとるべきだと思うね
jQueryやjavascriptが切り貼りで動かせる程度の知識しかなく PHPとmySQLなら色々と慣れていてやりやすいので なんとかならないかなと思った次第です 色々と調べて他の方法探してみます ありがとうございました
あ、Cookie要求ヘッダーを$_COOKIE['key']で扱えるという話かな? だとすると無理ですね Cookieのようにヘッダーに含めてやり取りするわけじゃないので そもそも小細工しなければlocalStorageからのデータかどうかも分からないし 小細工してls_keyとかの名前でpostすれば$_POST['ls_key']で取れるのでは
cron.phpを function Cron ($table) { require_once("./pdo.php"); //DB接続 $sql = "SELECT `feed` FROM `{$table}`"; $stmt = $pdo->query($sql); } として、他のrun.phpから require_once("./cron.php"); Cron("aclass"); としてもエラーはでないのですが require_once("./cron.php"); Cron("aclass"); Cron("bclass"); とするとFatal error: Uncaught Error: Call to a member function query() on null とエラーがでるのですがこれはどのように修正すればよいのでしょうか?
cron.phpを require_once("./pdo.php"); //DB接続 function Cron ($table) { $sql = "SELECT `feed` FROM `{$table}`"; $stmt = $pdo->query($sql); } こうしたらいいんじゃね?
そのようにしたら Cron(“aclass”)だけでも 同じエラーがでました
$pdoがpdo.phpでグローバルになっていない、とかのヲチでは?
>>80 function Cronの最後の所で
$pdoと$stmtにnullを代入してみたら?
どちらをやってもうまく動きませんでした 設計を大幅に変えて他のやり方で試して見ます ありがとうございました
>>74-79 Node.js では、
cookie はクライアントから、
HTTP request headers の、cookie に入れられて、サーバーへ送られる
一方、LocalStorage は、Form のhidden などに自分で詰めて、
サーバーへ送るように書く
結局、こういうSQL文になるのだろ。 だから、aclass, bclass のテーブルが無ければ、エラーになる SELECT feed FROM aclass; SELECT feed FROM bclass;
設計がキモいからアレだけど require_once("./pdo.php"); //DB接続 function Cron ($table) { global $pdo; $sql = "SELECT `feed` FROM `{$table}`"; $stmt = $pdo->query($sql); } じゃね
いや設計からやり直すで正解 requireやらglobalやら何年前の話だw
それはそうだけど、globalに限らず、PHPの悪いところを知ることはとても重要だ。
phpで他のサイトのhtmlを読み込む方法を教えて。
組み込み関数使う一番簡単な方法は
$html = file_get_contents('
http://' );
guzzleとかスクレイピングしたいならGouttteとか
何らかのライブラリを使った方がいいとは思うが
たぶんそういうレベルじゃないよね
>>89 こういった操作をするにはどう設計するのが
いいんでしょうか?
>>93 Magento最新版のソース辺りでも見てみれば?
>>80 のソースコードはPHP4時代を彷彿とさせるし
10年は古いと思っておいて間違いない
Call to a member function query() on null これは2回目のquery()を呼びだせていないエラーじゃないの? require_once("./pdo.php");してるから1回目は呼び出せる。 だけど、2回目は読み込まれないから呼び出せない。 require_onceだから。
PHP質問スレ無能さ自慢大会開催してるのに 本質ついてくるのやめろ
英語が出来るかどうかってプログラミングの習得効率をだいぶ変えるよな
PHPみたいなスクリプト言語のエラーメッセージって 中学レベルの英語力で理解できると思うけど 英語アレルギーな人はちょっとエラーが出ただけで もうダメだ〜おしまいだ〜ってなるっぽい ソースはプログラミング言語の講師経験がある俺 英語力以前に問題解決能力の問題
下らない質問します PHP でフォルダのファイルを監視することは出来ますか? 初心なので、どういう仕組みにすれば良いのか、よくわかりません。 まず、各種センサーデバイスから、任意のフォルダにデータがUSB やLAN で放り込まれます。 (例log.txt)日時、デバイス番号、温度℃、湿度% 20180316,12:45:32,978456321,18,36 20180316,12:45:32,978456321,18,36
カンマ区切りのログデータを監視して 20180316,12:45:32,978456321,18,36 更新されたら、MySQLにアップデートして ウェブページを見たら温湿度状態が表示されるようにしたいです。 よろしくお願いいたします。
PHPのお仕事にも出来るが、単純に、Cronのお仕事にした方が良いと思いマッスル。
set_time_limit(0); $size = filesize("test.log"); while (1) { clearstatcache(); $tmp = filesize("test.log"); if ($size < $tmp) { $fp = fopen("test.log", "r"); fseek($fp, $size); $data = fread($fp, $tmp - $size); fclose($fp); //$dataを整形してupdate $size = $tmp; } sleep(60); //インターバル } ログが追記されることを想定して ログが0になったり途中に追記されたりおかしくなるのまでは想定してない まぁ>>101 よ >>101 CronというのはLinux でしょうか?
win7proでも出来るのかよくわかりません。
検索してみます。ありがとぉごじゃりまスルメ。
>>102 出来ました。完璧です。誠にありがとうございました。
windowsの場合はタスクスケジューラって言うのがあってそれで同等(?)のことが出来る
ファイル変更をトリガーとするのはLinuxではincrontabってのがあるみたいだけど
Windowsだと
https://forest.watch.impress.co.jp/library/software/folderkanshi/ こういうの使うといいっぽい
やってることは
>>102 と大差ないけど
アップローダーを作りたいのですが作り方を教えてください プログラミングはC#しかやったことありません 初心者向けのphpの本やサイトなどがあると嬉しいです
C# を 学ぶ時に googleは 使いましたか? php アップローダー で 検索すると 作り方 を 一通り 紹介する ページが 出てくる と思います よ
アップロード処理
http://php.net/manual/ja/features.file-upload.post-method.php htmlのformからphpにpostする
php側ではグローバル変数(配列)$_FILESにアップロードされたファイルの情報が入るので
それを操作する(デフォルトではテンポラリフォルダに入るので保存フォルダに移動したりリネームする)
あとはアップロードフォルダを読み取って中にあるファイルリストとリンクを表示するなり
投稿者のコメントやら削除やら高度な管理が必要ならデータベースやらに情報入れてそれ使うなりお好きに
ありがとう! 右も左もわからないくらいの超初心者だけど頑張って作ってみる
スレ違いだったらすみません ネットの中の情報ってどこかに保存されてて僕はそれを引き出して見てるんですか?もしそうだったらどこに保存されてるんですか? 曖昧な質問すみません
いわゆるサーバー とりあえず仮想環境でサーバー作ってみて 慣れたらどこか適当なところでVPSでも借りて好きにやってみればいい サーバーを触れないPHPerなんて話にならん
サーバーを触れるようになるにはlinax系のOSも勉強しないといけませんか?
linux知識は必須だ せっかくこんなスレにくるくらいだから LAMPシステムの概要読んだり apacheでhttpサーバー立ち上げたり php.ini読むことから始めてみては? それやった上でのhello world は感慨深いものがあるぞ
>php.ini読むことから始めてみては? ええぇぇぇ…
>>113 私の場合、WindowsのPCにVirtualBoxで仮想マシンを仕立て、そこにLinuxをインストールしてます。
これに
>>114 のようにそれぞれ個別にapache、PostgreSQL、PHPを入れて遊んでますね。
LinuxっていってもデスクトップはWindowsと変わらないけど いわゆるガチのサーバ機はデスクトップ環境でやらないので WindowsならDOSプロンプトで遊ぶところからがいいのでは
>>107 が希望しているアップローダーは、どこに置いて実現したいのかな
自分の手元にあるWindowsPCにPHPをインストールし、
PHPのスクリプトをそこに置いて
コマンドラインでPHPを起動してスクリプトを実行する感じ?
それとも、どこかのレンタルサーバーを借りて、そこにPHPスクリプトを置いて
WindowsPCはレンタルサーバーのHTMLを使い、ブラウザでフォームを表示させ、
そのフォームに手元のファイル名を指定し、ボタンを押してアップロードする?
諸事情でララベルしなきゃいけないんだがSQLが俺は全く出来ないていう状態なんだが ララベルとSQLはそれぞれ並行してやった方がええかな?分担してやった方がええかな?
Laravelみたいなフレームワークは 普通はSQL文を直接書かずにクエリビルダーを通すんだが 何らかのフレームワークは使った事あるのかね その質問レベルで分業できるのか疑問
>>121 mvcとやらはvueでルーターでビュー振り分けたり変数の値を直接表示したりで慣れてるけど
フレームワークにあるテストやらなんやらの沢山の設定ファイルは苦手やな
今前知識活かしてルーター探してララベルでビューの切り替えした辺り
どの道ララベルとMySQLを覚えなきゃいかんのだが、今は最優先でララベルで二、三個モノを作らなきゃいかん
ガチれば一夜漬けでSQLデータの出し入れ位は出来るようなるかな?
>>123 おおありがとうな
本当にやったんだがMySQLのインスコ時に沢山エラー出ただけで
phpから中身吐くの簡単やなぁ
SQL周りの質問します $sql = 'select count(bang) from tbk'; $stmt = $dbh->prepare($sql); $stmt->execute(); こう書いてcountでデータベースの行数を取得してその値をPHP側で受け取るにはどういうコード書けばいいですか? $count = $stmt->fetch(PDO::FETCH_ASSOC); こう書いて$countで受け取ってvar_dumpで調べたら連想配列なんですが$count['bang']としても値を得れません データベースのカウント後を受け取るにはどう書けばいいんでしょうか?
データベースのcountを普通の変数として受け取りたいです。
たぶん名前はcountになってると思うけど SQLのほうで as つけて好きな名前にしたら確実かと思う
>>126 $count = $stmt->fetchColumn();
$count['count'] か $sql = 'select count(bang) as bang from tbk'; でもよかったのよ、ってこれ意味わからなかったのか
>>130 ありがとうございます
理解できてませんでした
$count['count'] のほうではできませんでしたが
$sql = 'select count(bang) as bang from tbk';のほうでcount['bang']としたら通りました。
難しいですね・・・
include_once って読み込むファイルを
http:// ・・・ で指定する方法は
無いの?
php.iniでallow_url_includeをOnにして include_onceすればオッケー
おっけーだけど実際何もおっけーじゃねぇな, HTTPとか正気の沙汰ではない
>>131 $sql = 'select count(bang) from tbk';
このままで実行したときは、
$count['count(bang)'] に入っている
>>135 >HTTPとか正気の沙汰ではない
なんでよ?
改竄されたら任意コード実行に直結やぞ せめてちゃんとした証明書付きのHTTPSは必要 それでも何か嫌だけど
>>138 >改竄されたら任意コード実行に直結やぞ
それは今回の質問の件と関係なく
改竄された時点で危険なんじゃないの?
>>136 var_dumpで調べたとき確かそうでました。
そのまま括弧もつけて書くとは思いませんでした。
勉強になります。ありがとうございます。
文法を一通り習って、Laravelなるフレームワークが主流と聞いて調べてみたのですが、自分の知ってるPHPとだいぶ違って面食らいました。 これはオブジェクト指向プログラミングなるものを習えばわかるようになるのでしょうか? 公式のドキュメント読むとルーティングとかコントローラーとか解説なしで当然のごとく出てきて激鬱です。 何をすればLaravelが使えるようになるか書籍・ウェブサイト等、指針を示して頂きたいです。
フレームワークはコーディングにルールや制約を持たせることで 簡単に構築できるようになってるので 自分の知らないことや言葉に惑わされず とりあえず書かれてる通りに従って真似してみればいいだけだよ サンプルを何個かやってくうちにどんなもんかわかるだろうし
>>142 とりあえずLaravelのチュートリアルでもやったらいいんではないか
あとMVCの基本的な構成は勉強してもいいかもね
フレームワークまじでわからん 内容や構造を理解、構築しようとするのではなく、ひたすら「手法」を学べ ってアドバイスされたがそれでもわからん、ってかこのアドバイス本当にあってんの?俺の頭がイカれてるのかと思い始めてきた
>>145 フレームワークは構造を理解した上で使うもの。職場でそれ言われたんならすぐ他行ったほうがいい。
>>143-144 ありがとうございます
とりまやってみます
48都道府県名が格納されてる配列があるとして 例えば東京都が格納されてる配列番号を知りたいときはpreg_grepとprint_rを使った結果を確認すればいいみたいですが 検索して結果の配列番号だけを変数に格納するにはどうすればいいのでしょうか?
下手にarray系の関数使うよりforeachでやったほうがたいていパフォーマンスはいい
と書いてみて気になって測ってみたけど array_searchのほうが早かったな php5時代の常識はもはや通用せんね
>>149 $ken = ['東京', '京都', '大阪'];
$kenFlip = array_flip($ken);
var_dump($kenFlip['京都']);
Ruby on Rails 5.2正式版発表。Active Storageによるクラウドストレージ対応、Redisでのキャッシュ対応など
http://www.publickey1.jp/blog/18/ruby_on_rails_52active_storageredis.html >Active Storageは、Amazon S3やGoogle Cloud Storage、Microsoft Azure Storageのような
>クラウドドストレージに対してファイルをアップロードし、
>それらのファイルのActive Recoredオブジェクトへの添付を容易にする機能です。
>また、ミラーリング機能によって複数のクラウドストレージのあいだでファイルを同期することもできます。
>これによって高い冗長性などを実現可能です。
これは良さそうですがPHPにこういうのありますか?
>>153 Symfony
+
Doctrine
+
VichUploaderBundle
+
Flysystem
FlysystemのAWS S3用アダプタ
でDBへの書き込みと画像のS3へのアップロードなら出来る
冗長化は無いが
サムネイル作成が必要ならLiipImagineBundleで
VichUploaderはPropelやMongoDBにも対応している
FlysystemはSymfony以外も対応している
グラフ画像を作って保存したいんですけど簡単なライブラリみたいなのってありませんか? グラフを表示するhtmlやCSSをはくとかはあるみたいなんですけど グラフ画像を作るのはさがしてもみあたらなくて…
レンタルサーバーを借りてphpの勉強はじめたんですけど /ドメイン名/public_html/ 以下に php ファイルをおくとエラーが出たときに /home/アカウント名/サーバー名/public_html/... のファイルでエラーがありましたってでちゃうんですけど アカウント名をみえなくすることってできませんか? 関数全部に@つけるのも微妙だし 何かの拍子でアカウント名みえちゃうのいやなんですよね
レンタルサバのエラーディスプレイいじれるんならいじる
.htaccessか.user.iniでdisplay_errorsをoffにしてerror_logを設定しておくのが普通では
>>158 ,159
できましたありがとうございます
Xサーバーなんですけどphp.iniがおいてあったのでそのなかの
display_errors = Off
にしてみました
あとはじめから
log_errors = On
log_errors_max_len = 1024
ってなってるんですけどこれどこに表示されるんでしょうか
エラーがまったく表示されないのもそれはそれで困るかも…
これは設定ファイルとかじゃなくてphpのなかに書く関数なんですか? 自分で関数も戻り値とかをハンドリングしてエラーをハンドリングして使う感じなんでしょうか? エラーメッセージも自分で作らないといけないみたいだし… そもそも構文エラーとかの場合これどうやってハンドリングすればいいんでしょう デフォルトのエラーメッセージに絶対パスを表示させたくないだけなんですけど結構大変なんですね…
phpで設定を行う方法は主に3つ
・サーバ側の設定ファイル(php.iniやhttpd.conf)に直接書く方法
・phpスクリプトにini_set関数を使って書く方法
・専用の関数が用意されてればphpスクリプトに専用関数を使って書く方法
phpの設定がどこで行えるかは下記の通り
http://php.net/manual/ja/configuration.changes.modes.php 今回のerror_logは
http://php.net/manual/ja/errorfunc.configuration.php PHP_INI_ALLなのでphp.iniに直接書くことも出来るし
ini_set関数を使ってphpスクリプトに書くことも出来る
http://php.net/manual/ja/function.ini-set.php また同名の関数が用意されてるのでそれを使ってphpスクリプトに書くことも出来る
http://php.net/manual/ja/function.error-log.php うまくいかない… エラーも表示されないし ログファイルに書きこめない パーミションもあけてるんですけど せっかく丁寧に回答もらったのに申し訳ないんですがもうパス表示されたままであきらめます phpのコードの勉強がしたいのにサーバーの設定だけで土日つぶれそう…
xamppでもいれて自鯖でやれよ レンサバでやる意味がわからん
>>164 <?php
ini_set('display_errors', 0);
ini_set('log_errors', 'On');
ini_set('error_log', '/home/アカウント名/サーバー名/errors/error.log');
>>16 ありがとうございます
/homeからのパスを設定しないといけなかったんですね…
php.ini に設定すればログがふえるようになりました
本当に感謝です
c言語から勉強初めてjava→html/css→javascript→php→mysql→jqueryときてwordpressの本読んだけど ウェブやるならこれだけでいい気がして今までの時間が凄く無駄に思えてきた・・・ phpとかできたほうが有利な点を教えてください・・・ モチベーションが・・・
何かウェブサービスをやりたいとか スマホでゲームとか作ってユーザのデータを集約させるバックグラウンドが必要とかでなく ただWebサイトを構築したいってだけなら別にWPでいいんじゃない? モチベが欲しいならWPなしでサイト構築するためにPHP学ぶでもいいのでは? PHPerは無駄が好きなのでJava脳で車輪の再発明嫌いな人はPHP向いてないかもね
同じサーバー内で、自プログラムが置かれているディレクトリとは異なるディレクトリにある ファイルを読み込みたいのですが、そのディレクトリはBASIC認証をかけています。 この場合、phpプログラムから認証を突破するための手続きはどうすればいいでしょうか? IDとパスワードはもちろん分かっている状態です。
httpでやる必要がないならbasic認証関係ないんで
ローカルのファイルのパスがちゃんと指定できてれば読める
もしhttp経由で読み込む必要があるのなら
http://php.net/manual/ja/function.file-get-contents.php ここの例4のとこ参考にして
Authorizationヘッダをつけてリクエスト送ればいい
"Authorization: Basic {$token}\r\n"
$tokenはbase64_encode('id:password');
>>172-173 思い違いと動作確認でもミスがあり、何か処理が必要と思い込んでいました。
すっぱり整理してやり直しをし、無事動作することが確認できました。
どうもありがとうございました。
ここで聞いていいのかわからないんですが、フレームワークの利用に関する質問です 5年以上前に誰かが作ったWebサイトを運用していく必要があるのですが、フレームワークはEthnaを利用しています 当時サイトを作った人や、その後追加改修を行った人は、もういない状態です。 Ethnaの使用感としては5年以上前に開発が止まっていて、ドキュメントも未完成。 これに学習コストを払うのは嫌だなあというのが本音です。人不足で新しい人も入ってきているのですが、覚えてもらうのが申し訳ないレベルです。 ただ、フレームワークを変えて書き直すとなると、ほぼサイトをリニューアルすることになります。 そもそもフレームワーク関係なく、設計書もなく、中身がブラックボックス化しているサイトなので、リニューアルは何度か検討しています。 が、やはり時間がかかってしまうので、なおしたいことがあればその都度プログラムを読んで、修正しています。 なので、「現状のままであるリスク」を「リニューアルするコスト」がこえないと、なかなか上を説得することが難しいという状態です。 このWebサイトは、年数億円を売り上げており、何かの拍子に動かないというのは許されない状況です。 前提としてはここまでで、ここからが質問なのですが 5年以上前に作ったサイトの、5年以上前のフレームワークをそのまま扱っていくリスクというのは、どう見積もれば良いものでしょうか? 古いシステムをそのまま使い続けてる現場に入ったなら、どのように考えますか? 一応進言すれば、現状は変えられる可能性が高いのですが、判断に悩んでいます。
動かなくなったらまずいといいつつ、 よくわからないものをいじって、なんとなく動いてるってことだよね? その現状に危機感を抱くべきでは? 個人がフォークしたEthnamという後継プロジェクトはあるみたいだけど、 5.4で動くなんてのをウリにしてるあたり、 オリジナルはサポート切れのPHPバージョンを使ってるのだろうけど、 それだけで十分置き換え理由になるのでは?
>>175 コスト面では定量してTCOで比較すればよい
リスク評価も定量して算入するならリスクを分類した上でリスク発生率と予想損失額の積で損失見積もりとする
サイトの仕様を解析して理解する所から始める。 仕様さえ分かれば、フレームワークなんて大したことないって気づきそう
よく知らないけど、5年以上前のフレームワークってセキュリティ的にどうなの
FastCGIで動かす時にアプリケーション初期化のコードは最初の1回だけ実行したい というより予め実行済みの状態でリクエストを待機させたいんだけど、どうすればいいの?
ファイルを file_get_contens() や file_pet_contents で読み書きしたいんですが ロックってどうすればいいんでしょうか flockにファイルディスクリプタが必要みたいなんですけど それを使って与密会するわけじゃないのでRD_ONLYで開いてもいいんでしょうか $fp = fopen($filename, 'r'); if (flock($fp, LOCK_EX)) { file_get_contents($filename); 〜 file_putt_contents($filename); flock($fp, LOCK_UN) } でうごきますか? ロックファイルはわける必要がありますか? ロックがぶつかるケースをデバッグできないので大丈夫なのかどうかがよくわかりません
$fp = fopen($filename, 'c+'); if (flock($fp, LOCK_EX)) { $buf = ''; while ($tmp = fread($fp, 1024)) { $buf .= $tmp; } rewind($fp); ftruncate($fp, 0); fwrite($fp, $buf.$buf); flock($fp, LOCK_UN) }
スマホ向けに下記をhtmlのheadに書いた場合は、スマホの横サイズいっぱいで折り返し表示されますが、 <meta name="viewport" content="width=device-width,initial-scale=1" /> php埋め込みhtml(拡張子はphp)に上記を書いても折り返してくれません。 他に何かお作法が必要でしょうか?
文字コード周りに問題がなければ PHPで出力したHTMLのソースを表示してみてオリジナルのHTMLと対比してみては? エスケープミスでタグが閉じられてない状態で出力されてるとかそんなレベルかもしれない サーバ側で関連ヘッダーを出力しちゃってる可能性もあるので 理解出来るならブラウザの開発者ツール使ってHTTPヘッダの中身チェックするといい なんにせよ再現できる全体ソースが出ないことには答えようがない
>>186 原因が分かりました。
変数に改行(\n)付きの長いメッセージを入れてあり、それを表示するのにpreタグ
で囲っていたのが原因でした。
preタグを使わずに改行付きの長いメッセージを表示する方法を考えてみたいと思います。
どうもありがとうございました。
連投すみません。 nl2brを使えばすぐでしたね。 初歩的なことですみませんでした。
>>184 やっぱりロックとる場合はロックをとったファイルディスクリプタに
fread, fwriteで読み書きする必要があるんですね
コード参考にさせていただきます
ありがとうございました
プログラムの基本を教えてください。 一つのphpファイルが300行をオーバーしてしまったから、汎用性はないけど一まとまりの機能があって、色んな所から呼び出す処理を別のphpファイルにしてインクルードで呼び出す、 という形で小分けにしていこうと思ってますが、そんな風にバラバラにしてしまってもいいんでしょうか?
その考えの行きつく先にオブジェクト指向があるのでオブジェクト指向入門するといいかな 方向性としてはあってるのでとりあえずは思った通りにやってみては? あと行数に関していえば1万行クラスのソースコードはざらなので(半分はコメントだったりするけど) 長い行数になったときのソースコードの管理の仕方をIDE使って覚えていくといいよ
>>191 返信ありがとうございます。1万行はぞっとします。とりあえずはこの方向性で行きたいと思います。
>>189 ファイルロックについてはその通り
stream_get_contents()を使うと
>>184 よりはもう少しスッキリ書けるかと
関数の呼び出しがあっているのかわかりません ボタンでCreateとLikesの処理をわけたいんですが、うまく実行できません (ボタンの処理は別のPHPファイルに書いてます) create_qaとUpdate_likes_whenbuttonClickは、単体であれば実行ができているのはわかっているのですが、振り分けるためのbutton_Click関数に入れた途端動かなくなります returnで、振り分けそのものができていることは確認しました(IDを表示することができたので、問題がないかと思っています) 何か間違っていそうか分かる人教えて下さい public function button_click(Request $request,$session_id){ if(isset($_POST["create"])){ $this->create_qa($request,$session_id); } else if(isset($_POST["likes"])){ //return $session_id; これはできてる $this->update_likes_whenbuttonClick($request,$session_id); } }
エラーログは読んだの? 超能力者じゃない限りソースだけ貼られても分からんよ
>>195 errorが全くでなくて、むしろ真っ白なページが表示されます・・・
関数単体だときちんとreturn viewしたページに飛んで、処理もできているのに、こっちだとできないです
>>197 return でelse以降に入ると数値が表示させるようにして確認しましたが、今のところ流れてはなさそうです
分岐を一切作らずに
$this->create_qa($request,$session_id);
だけ入れてもおかしなことになるので、
$this->〜〜〜っていう表記が間違っているような気がするのですが何がおかしいのか全く分からず・・・
>>198 簡単な別のメソッドを作って呼び出せるか試してみたら
>>199 引数なし、return0をするだけの別の関数を作って、同じように呼び出しをしてみましたがだめでした、
やっぱりthis〜の行が何かしら影響を及ぼしてるようです・・・
error_logでファイルにエラー吐いてないのか? 画面出力はエラー出力でHTTPヘッダとか壊れてまともにならんことも多いぞ
>>201 ためしにエラー出力してみましたが、全く何もでてないようで・・・
>>194 ですが解決しました!
分岐文の内部でreturn viewができてないのが原因でした
すみませんお騒がせしました
変数の$〜〜の$ってなんて読むの?? ドルなんとかって読んでるんだけど間違い?
文字列全体を正規表現判定するのってどうすればいいんですか? 入力に不正文字がないかチェックしたいんですけど pregmatch('/[0-9a-zA-Z]+/', $input) だと一部にマッチしてもtrueになっちゃうので 文字列全体で数字アルファベットしか使われてないことを確認したいです
^[0-9a-zA-Z]+$
そういう単純なものは正規表現使うまでもなく
他の関数が用意されてると思ったほうがいい
http://php.net/manual/ja/ref.ctype.php ctype_alnumを使えばいいんですね ありがとうございました!
あとPHPの配列についてききたいんですけど a[] = 2; a[] = 4; や array(2,4) でつくった場合Cやjavaの配列と同じくメモリ上にvalueだけがならんで a[1] でアクセスした場合アドレス計算でアクセスされるんでしょうか? それとも自動的に連想配列になって '1' っていう key を検索するんでしょうか? メモリにははいるけどキャッシュにははいらないそこそこ大きなテーブルデータを扱ってるので気になりました
僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方 役に立つかもしれません グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』 Q3682
参考書を1ページずつjpgに自炊スキャンしましたが 今あるjpgの奇数ページと偶数ページをくっつけて見開きページの画像にして保存したいと考えました、phpの画像処理ライブラリは GD DmImage ImageMagick 等があるみたいですが 手軽にできるのはどれですか?
そんなのどれ使っても手軽だろw こんなところに書いて待ってる間に処理一つくらい書けるし、 まずは分かりやすそうなのどれか一つ使って書いてみればいい
どれもベースがGD GDに皮をかぶせて使いやすくしたものだが皮の厚さが違う
初心者です。。 Class hoge { public static function aaa (){ echo __CLASS__; } public function __construct (){ static::aaa(); } } Class piyo extends hoge {} $var = new piyo(); //hoge みたいなコンストラクタの中でstaticつけて関数呼び出すのってどういう意味が有るのですか… static::hogehoge($this);みたいなのがコンストラクタのなかにあるのって どういうふうに動いてるのかわからないです。
>>216 遅延的束縛がわからんのです。
コンストラクタの中でやってるからpiyoにならないのかな
static $piyo;
public function __construct(){
static::hoge($this);
}
public static function hoge($this){
return static::piyo = $this;
}
みたいなのときとかもうわけわからん
>>217 まんま
>>216 のマニュアルに書いてあるんだけど読んだの?
>>219 書いてある?
あんまりインスタンス化して使ってるような例ないぽいけど
>>217 はClass Hogeとして
$aho = new Hoge()とするとインスタンス化した時にHogeの静的プロパティも初期化されるってことだよね。staticとparentがチェーンしてると訳わからんくなる
Hogeを継承したpooクラスがあったらpooクラスのstaticプロパティも初期化されるけどselfとどう違うのかわからん。。
トランプゲームみたいな感じで写真の入ってるカードを並べ替えさせるゲームを作ろうと思っています。 カードはドラッグして移動可能。 所定の□の近くにくるとカードは□に収まる こういったことを簡単に実現できるおすすめの言語があったら教えてください。 使ったことのある言語はCとC#だけです。
なぜPHPのスレで聞くのか? てか、ハブリッシュするプラットフォームに依存する話しだから それを言わないとだれも答えられない ロジックだけ実装するならどんな言語でも作れる
>>224 すいません。
スレタイ読み違えて誤爆しました・・・。
フォームで受け取ったデータをそのままディレクトリ名にしたいんですけど ディレクトリ名に使われて危険な文字をはじく関数みたいなのってないですか? . と / だけはじけば大丈夫なのかな
入力できる文字を絞った方がいいよ アルファベット数字のみとかにすれば一番無難 それ以外の文字が一文字でも入ってたらエラーで返す
a.php が吐くHTMLに、b.php を差し込むSSIタグを埋めたところ、挙動がおかしい。 サーバは apache、PHPの出力に対してもSSIが効くように設定してある。 どうおかしいって、b.php 出力がSSIタグの位置からズレた場所に挿入され、しかもなんか断片化してる。 a.php と b.php の出力が混ざった感じというか、a.php と b.php が非同期に並行して動いてる感じというか。 a.php や b.php と同等の内容の a.html と b.html を用意し、a.html に b.php や b.html をSSIするケースや、a.php に b.html をSSIするケースでは問題無く、a.php に b.php をSSIするケースだけでおかしい。 原因の心当たりって無い?
ツッコミどころだらけで笑うわ * SSIはWebサーバの機能(スレ違い) * その構成にする意味が分からない * というかSSIってマジ?
SSIって10年以上ぶりに聞いた なんでそんなトリッキーなことしてんだw
>>231 > * SSIはWebサーバの機能(スレ違い)
あぁ、それもそうだ。おっしゃる通り。
残りについては、そういう都合があるとしか言えない。
SSI もまじ。<!--#include ... のやつな。
いろんなもの SSI してるのよ。
SSIの時点でもうアレだけど更にPHPを絡められて試す気がなぁ
とりあえずApache側の設定か? 同期、非同期の問題ならpreforkとworkerで挙動変わるか試してみるとか まあ、どっちにせよ激しくスレ違いな気がする
更新履歴〜 みたいなページでSSI使ってたことはある これはこれで便利やしトリッキー言うほどじゃないだろ まあ今時としては、SSIみたいな挙動をするphpコード書くだけになるか
public function Hoge($hoge) { return function () use ($hoge) { return $this->test_func($hoge); }; } こういうのって意味有りますか? クロージャのとこに$hogeを持ってきても実際には繋がりはないように見えるんすけど $var = Hoge($hoge) //$var = function($bar){ return $this->test_func($bar);}
クロージャの$hogeと最初の引数の$hogeの繋がり
クロージャになっても最初に渡された$hogeは生きてるんやな。。 知らなかった
>>236 PHPを使ってるんだったら
SSIの<!--#include...に該当する処理は
取り込み対象をPHPのコードとして評価したいならinclude、
文字列として評価したいならfile_get_contets()するだけの
1行で済む話
SSIはサーバー環境依存だし今どきSSIが有効になってる古いサーバーを
これから先も使い続けるのか?という疑問もある
SSIってJavaScriptもiframeタグもブラウザ標準ではなかったそれこそ10年以上前の遺物よな
メンテしているperlのサイトで確か使ってたな phpで使おうと思うほど猛者じゃないので勘弁
PHPでerrnoを取得することはできますか? やりたいことは、ファイルまたはディレクトリの有無を確認しつつ、 falseだった場合は、ENOENTなのかEACCESなのか知りたいのです。 file_existsとis_readableを組み合わせるしかないですか?
>>230 せっかくなので分かったことを報告。
SSI にせよ PHP の virtual にせよ apache のサブリクエストが発行される場合、元リクエストとサブリクエストのPHPのインスタンスは同一のものが使い回されるらしく、グローバル変数なんかは共通されるらしい。
恐らく define や include、出力バッファなんかも共有されてると思う。
それでいろいろ思いもよらない挙動を示すっぽい。
ということが分かったので、適当に回避した。
apacheの設定によるところもあるかもしれないけど、そこまで検証してない。
なんか普通の話だな グローバル変数なんて使ってたらそんなの当たり前だろ
>>247 ユーザー定義のグローバル変数や名前空間をもたない定数なんかもう何年も使ったことないけど
よく分かってないので、スマソ。 モジュール版PHP5.3環境で動かしていたのを、 @ モジュール版5.6環境に移行させる場合 A CGI版5.3環境に移行させる場合 @、Aともにソースコードの書き換えは必須なの? また、簡単なのはどっち?
それだけじゃなんとも言えんよ… エスパーでも答えられんと思われ 上の話と同じでグローバル変数とか使ってるとかなら書き換える必要あるかもね 使われてるモジュールやライブラリが対応してるかどうかもあるし 同じ環境を用意して実際に動かしてテストするしかないと思う
5.6でサポートやめたり、推奨からは図したりしたものがあれば 良くて警告、悪くて動作せずとなる やってみないと分からないから、試験環境を作って試すのが最善
5.2.X⇒7.2.Xに以降した環境がいくつもあるけど PHPコンパイルで何度かこけた(コアに取り込まれて使えなくなってるオプションがあった)ぐらいで コードを手直しをした記憶が全くないなぁ 逆にどんな書き方をしてたら動かなくなるのやら…
開発を error_reporting=E_ALL(PHP5.4以前ならE_ALL|E_STRICT) でしてなかったりすると環境移行でエラー出まくったりするかもな 初心者はまずエラーを正しく出すところから学習しないとな
>>248 同じインスタンスで動くならそりゃそうだろって話だけど、virtual はともかく SSI が同じインスタンスで動かすのが当たり前かと言われれば微妙じゃね?
$_GET みたいなスーパーグローバルとかどうなっちゃうんだよって問題もあるし、実際出力バッファはまぜこぜになって使い物にならないわけだし。
わざわざ SSI でやるのなんて、他所の誰かが作った全く関係ないものを自分の処理と隔離してページ上に取り込みたいなんてケースだったりするわけで、隔離できないならあんまり意味が無いというか。
そういうものだということが分かってりゃやり方考えるからいいんだけど、なんでそうする?っていう仕様だと思う。
PHPそのものの問題じゃないであろうこと引っ張ってすまないけど。
前バージョンと同じように、必要なモジュール・ライブラリがロードされていて、 基本的な環境に差異がないのを前提とすれば、 あとは廃止変更された機能や関数が影響を受ける。 なので動かない場所が出てきて、書き換えが必要になる場合はあるが、 それはコードの1%にも満たないぐらいの量のはずだから、 大規模なアプリケーションでも書き換えに1日はかからないだろう。
>>256 > 他所の誰かが作った全く関係ないものを自分の処理と隔離してページ上に取り込みたい
SSIを使う理由になってないしSSI以外の知識がないだけ
サーバーの知識が多少ある人間なら今この時代にSSIを使うのがいかに馬鹿げているかすぐ分かる
SSIもhtaccessも無駄にサーバーに負荷をかけわ、遅いわ、セキュリティリスクの管理もしにくわで何1つ良いことないから無効にしろと大昔に教わったな 結構最近でもSSIインジェクションで資生堂の小会社がが情報漏えい起こしてたけど資生堂みたいな大きなところが未だにSSI使ってることに驚いた includeしたいだけなら他にいくらでも代替案あるのにさ
SSIインジェクションやらかすようなやつはSQLインジェクションだってやらかしかねないんだから、それはSSIを使わない理由としては弱いでしょ。
素人だからよく分かんないんだけど ssiでincludeするのとhtmlで<iframe> or phpでfile_get_contents するのは何が違うの? ssiを使う理由って何?
>>261 旧来からのスタイルを踏襲しているとか、
SSIはPHP知らなくてもHTML(と言えるか微妙だが)分かれば使えるってのもあるかもね。
サイト全部がPHPじゃないし、みんながみんなPHP使えるわけじゃないからな。
PHP使うなら PHP の include しても file_get_contents しても、適用できるなら得られる結果は一緒でしょ。
>>261 使う理由は特にない
1.SSI/#include file|virtual="path"はpathの中身をそのまま取り込んだ結果を取り込んだ場所で出力する
2.<iframe src="url|local_path">は対象の出力をフレームとして取り込む
3.file_get_contents('url')はurlの出力を取り込む
4.file_get_contents('local_path')はlocal_pathの中身をそのまま取り込む
5.includeは対象を「PHPのコードとして評価する」
1 ≒ 2 ≒ 3 ≠ 4 ≠ 5
だと思っとけばいい
includeとfile_get_contents()が等価なんてのは大嘘なので信じないよう
SSIの#includeに該当する処理は、そのほとんどが<iframe>+αで片付く程度の低レベルの事しかしてないね
繰り返すけど今更使う必要性は全くない過去の遺物です
include と file_get_contents が等価だなんて言ってないぞ。 別のコンテンツを差し込む方法として適用できるケースがあると言ってるだけで。 例えばページのヘッダやらフッタやらを別ファイルに浮かせたとして、それが include できるなら include で、file_get_contents できるなら file_get_contents で差し込めるだろ。
>>265 > PHP使うなら PHP の include しても file_get_contents しても、適用できるなら得られる結果は一緒
一緒じゃないでしょって話だと思う
実際全然違うし
>>266 例えばただのHTMLファイルがあったとして、それを include した場合と file_get_contents 使って出力した場合とで得られる出力結果にどんな違いがあるの?
もちろんただのHTMLじゃないものを扱おうとすれば、得たい出力を得るために適用できないこともあるよ。
>>263 の PHPのコードとして評価するというのも語弊があると思うよ。
パースはテキストとして始まるわけだから。
初心者も見てるだろうから実例を出しとく ・test.php ------------ test <?php echo $a; ------------
・index.php
------------
<?php
$a = 'hoge';
var_dump(file_get_contents('./test.php'));
/*
test
<?php
echo $a;
*/
var_dump(file_get_contents('
http://localhost/test.php' ));
/*
test
Notice: Undefined variable: a in...($aが定義されていないというエラー)
*/
include './test.php';
/*
test
hoge
*/
------------
この違いを理解してるならこれ以上俺から言う事は何もない
PHPを勉強している者ですが、 PHPを使ってお問い合わせフォームを作る際に気を付けるべきセキュリティ対策についてのアドバイスをください。 メールの送信までの流れは「入力」→「確認」→「送信」となりました。 入力・・・入力される文字の制限(メールアドレスの欄なら使用可能な文字以外でエラー) 確認・・・出力の前にhtmlspicialchars()を使い無害化 送信・・・? 参考になるサイトや書籍のアドバイスなどもいただけると嬉しいです。 よろしくお願いします。
>>270 とりあえず思い当たることをざっくり。
・SQLインジェクション対策
・セッションハイジャック対策
・HTTPSの確認
・管理者のうっかり対策
・スパムメール基地化の防止
前2つはこの言葉と PHP で検索すれば出てくると思うけど、SQLインジェクション対策にはPDOのプリペアドステートメントとバインドを使うとか、セッションハイジャック対策は個人的には問い合わせフォーム程度ならセッションなんて使わずhiddenでたらい回しにするかな。
HTTPSの確認は、HTTPでアクセスされた場合に受け付けないとかHTTPSにリダイレクトするとかの施策だけど、シンプルなサーバ構成なら $_SERVER['HTTPS'] が 'on' かどうかを見ればいいものの、webサーバの前段に何か(AWS の ELBとか)入れてるとそれじゃダメなこともある。
開発前に HTTP と HTTPS でのアクセス時の違いを phpinfo を diff 取って確認しておくのがいいんじゃないかな。
管理者のうっかり対策ってのは、問い合わせ内容に悪意あるURLなんかが書かれていてもうっかり踏まないようにするとか。
悪意あるURLじゃなくても、管理画面なんかからリンクを直接踏めると referer とかで管理画面のURLが漏れることがある。
スパムメール基地ってのは、もし受け付け時にユーザーにメールを送信する場合、他人のメールアドレスを入力されるとそっちへメールが飛ぶことを悪用されること。
文面に悪意あるURLを書かれると、それを踏まされちゃうかもしれない。
対策はいろいろあると思うけど完璧な対策は難しく、どこかを妥協することになると思う(メール送るのやめるとか)。
>>270 です。
>>271 さん
詳細なレスをくださり、ありがとうございます。
今回いただいたアドバイスを元にセキュリティを強化していきます。
本当にありがとうございました。
>>272 こんなところで聞くだけじゃなく、本買ってちゃんと勉強した方がいいよ
得丸さんって有名な人が最近本出したから買って損はない
>>270 です。
>>273 さん
書籍情報ありがとうございます。
独学なのでありがたいです。
>>274 ごめん、名前間違えてた
徳丸 浩
体系的に学ぶ 安全なWebアプリケーションの作り方 第2版 脆弱性が生まれる原理と対策の実践
PHPがサンプルで使われてるので参考になると思うよ
>>270 です。
>>275 さん
徳丸 浩ですね 了解しました。
重ね重ねありがとうございました。
練習なら色々気を遣うトレーニングになるからいいけど, 実際に公開する場合にはよく使われてるメールライブラリを使うべきだろうな
>>278 スパムメール基地化に対しての対策とってるライブラリなんて見たこと無い。
正直、自動返信は鬼門だと思う
>>279 それはライブラリでどうこうできる問題じゃなさそうだよね。
個別にトレードオフ見て仕様化してる。
送信されることを緩和するならボットチェック(と言うのか知らんが)入れるとか、本文の悪用防止ならメールに入力本文は転記しないとか入力本文中のURLを伏せて転記するとか、
あるいはそもそもメール送らないとか、悪用元が分かってるならIPアドレスチェックして内部処理変えるとか。
本文転記のニーズは高いから難しいのよね。
自動投稿系のスパムはハニーポットしかけるのが楽 <input type="text" name="mail" value=""> みたいなよくあるname値をもたせたダミーの<input>タグをcssとかで非表示にして GETやPOSTメソッドでnameの値が飛んできたらスパム扱いにするだけ 初心者でも簡単に実装できるのがメリット
クラスAを継承したクラスA1、クラスA2を作りました クラスA1ではB1、クラスA2ではB2クラスをuse Bx as Bとして読み込み クラスAにクラスBを操作する処理を書けばクラスA1、A2に共通の処理を書かなくて済むかと思ったのですが、名前空間的にnew BとするとクラスAを基準としたパスで読み込もうとしてnot foundになってしまいます 親クラス側から子クラスで読み込む前提のクラスに対しての操作を書く方法はありますでしょうか?
>>282 コード無いからエスパーするとinterface使え
少しマニアックな可能性はありますが シーサーブログへの自作エディタを作成したいと思っています。 プルダウン方式で時刻を簡単に選んだり その他を大分楽にすすめる事ができるのが目的です。 PHPでライブドアへの投稿ツールを少し作成してみたり PHP、pythonあたりを少しだけ知っている、というのが 現状の自分かと分析していますが ネットで少し検索してもシーサーブログへの投稿のためのプログラムは PHPであまり引っかかりませんでした。 最終的には、タイトル変更、カテゴリ選択、時刻設定、定型文の挿入あたりの出来る ツールを目指しているのですが、 スレッドのPHPとは離れますが もし良いツールが出来るならPerl、Rubyなどもチャレンジしてみるしかないのか、 と思うのですが、 現状、攻めれそうな言語、もしくは方法を・・ 本当にすみませんが、大まかなアドバイスでもいただけたら有難いです・・ よろしくお願いします。
>>285 結局APIをAPIの仕様に沿って叩くだけなんだから
言語なんか別に何でもいい
SeesaaのAPIはXML-RPC互換らしいが
XML-RPCを採用しているPHP製CMSで有名なのはWordPress
だから情報は豊富にあるかと
>>286 有難うございます。なるほど、そういう事ですか…。
確かにWordPressのそういう解説はある程度あると思われますし、
まずそこを自分も作って、それをシーサー向きにカスタマイズ、
という方向にもっていってみるのが得策ですかね。
プログラム等々色々しっかり理解できていないので
例えば、テストのワードプレスに投稿がうまくいっても
それをシーサーに対応させる、その箇所でいかにも自分はつまずきそうですが…
やってみようと思います!ありがとうございました!
formからfileタイプでファイルを送信するとき、一緒にカスタムデータも渡したいんですが phpでカスタムデータを取得するにはどうすればいいんでしょうか
カスタムデータはバックエンドやのうてフロントエンドで使うもんや
html5の属性にdata-がつくってやつ? submitを動作のない通常のbuttonにしてjsでsubmitするようにして submitの前にjsでdata-要素を探して中身を hiddenフィールドに追加する処理書けば渡せる onsubmit時にやってもいいけどjavascriptオフだと想定したデータを受け取れない buttonにしてjsでsubmitすればjavascriptオフだとsubmit自体ができなくなるが そっちのほうが開発者には都合がいい
質問内容がPHPに関してではないし 回答もjavascriptを使用してと言うことだし Web製作板なら全般に渡って質疑しても良いけど プログラム板に設置したPHPスレとしては ちょっと違う感じを否めない
webprogのほうは手取り足取りしてほしけりゃこっちこいって 初心者こっちに丸投げしてんだよな だから多少ズレててもしょうがない
難民受け入れる? 嫌がる人がいないなら、自分は反対はしない
今どきレガシーIE使ってるのとJavaScript使えない環境なんて考慮する必要ある? そういう人たちの考えを改めさせるためにも甘やかしてはだめだ あと広告ブロッカーなど入れてる人間にはおかえりいただくのだ
IE11は新機能も追加されないのに 2025年10月までサポート続く 頭の固い奴がいつまでも使い続けそう
そのレベルまで言うならサーバサイド使う必要性あるか?
>>301 現状まだIE11はいいんだけど
このまま取り残されるつもりなら害悪だね
ITリテラシーのないユーザーが悪いわけではないが
>>302 サーバサイドとクライアントサイドでは出来ることが違う
質問者のフォーム設計がクソであろうことは疑いの余地はないが
>>300 で言いたかったことは
閲覧者様ありがとう!1人でも多くの閲覧者様に奴隷のように対応します
ではなくサイト開設者側が閲覧者を選んでもいいということだ
cakePHP3を使ってます。 mysqlに保存する場合、メールアドレスも暗号化した上で保存したほうがいいの?
CakePHPの名前を出す意味が分からんが 動かす環境や設計思想によるとしか
curl_setoptをphp.iniの中で設定したいのですが、そんなこと出来ますか?
curl_setopt($ch, CURLOPT_SSL_CIPHER_LIST, 'ecdhe_ecdsa_aes_256_sha'); と同じ設定をiniファイルで設定できるかと curl.ssl_cipher_list="ecdhe_ecdsa_aes_256_sha" とcurl.iniに書いてみましたが、うまくいきませんでした iniファイルで設定するのはやはり無理なのでしょうか?
そうですか VPSで動かしているTinyTinyRSSで、HTTPSのスクレイピング時にエラーが出ていて CURLOPT_SSL_CIPHER_LISTを設定すればいいということまでは分かったのですが コードを書き換えたとしてもアップデートで上書きされてしまう可能性があるので 設定ファイルでデフォルト値を設定できないかと思ったのですが、残念です・・ ありがとうございました
>>310 自前のiniファイルを適当に用意し、parse_ini_file関数で読み込む
それだとcurl呼び出し部分のコードを結局書き換えないとですよね? 設定ファイルで設定したいと言ったのは コードに手を加えずに挙動を変えたいという意味でした 目的じゃなくて手段です
>>314 infoで出てくるcURLライブラリの情報出して
cURLのビルド設定によっては楕円曲線をデフォルトで無効にしているケースがある(あった?)
>>314 そこまで説明しなくても普通は
>>310 読みゃ分かるよw
そういう時は普通はラッパークラスを作る
Adapterパターンとかでググるといい
curl直接使うよりguzzle通じて使った方が良いよね? よっぽどシンプルなプログラムとかでも無い限り AWS SDK for PHPでも内部で使ってた
手続き型の書き方しかできないcURL関数群をラッピングして オブジェクト指向型のインターフェースを提供するライブラリは色々とあるから 実用的にはそっち使った方がいい(もちろん今ならguzzleが第一選択肢) 車輪の再発明をする必要はないが guzzleみたいにガッツリじゃなくて cURLのうすーいラッパークラスを作っとくと ちゃちゃっと何かしたい時に便利ではある
>>312 を読んでないのか読んでて無視してるのか
TinyTinyRSSを使うこと自体アレじゃねってのはあるけども
TinyTinyRSSの中でguzzleを使った方がいいよねなんて話は誰もしてないかと
ちょうどスクレイピングとかを勉強してる俺にはなんとタイムリーな話題
>>319 > cURLのうすーいラッパークラスを作っとくと
> ちゃちゃっと何かしたい時に便利ではある
もう少しkwsk
>>322 例えば、http://example.com/ の出力結果を取りたいってだけなら file_get_contents('http://example.com/' ); だけでいいけど、もう少しだけ色々としたい時 例えば、POSTメソッドで「hage=fuge」を投げつつ ユーザーエージェント「Mona」、リファラ「http://2ch.net/ 」にした時の http://example.com/ のステータスコードを取りたいなんて時 $status = Curl_Wrapper::getInstance() ->requestPost('hage', 'fuge') ->setUserAgent('Mona') ->setReferer('http://2ch.net/' ) ->getStatusCode('http://example.com/' ); こんな風に書けるクラスを用意しとくと気持ちいいってだけの話 大した話じゃないから意味不明ならスルーでw >>321 うん >>323 なるほど
やりたい事を書いた文章がそのままPHPのソースになってる感じですごく分かりやすい
->setUserAgent('Mona')
->setReferer('
http://2ch.net/' )
こういう書き方ははじめて見た
;のつけ忘れではないよね?
>>324 メソッドチェーン
setうんたら系のメソッドで$thisを返すようにすればよい
ただ(薄いwrapperだからアレだけど)getうんたら系のメソッドで副作用があるのはキモい
>>324 $curl = new Curl_Wrapper;
$curl->setUserAgent();
$curl->setReferer();
$status = $curl->getStatusCode();
普通はこう書くけど面倒くさいから
Curl_Wrapperクラス内のメソッド(setUserAgentやsetReferer)で
Curl_Wrapper自身のインスタンス(PHPなら$this)をreturnする
そのメソッドを鎖のように繋ぐから「メソッドチェーン」って呼ばれる
「PHP メソッドチェーン」とかでググってみるといい
上手く使えばすっきり書けるけどデメリットもあるのでケース・バイ・ケースで
>>325 >>326 詳しくありがとう
メソッドチェーンって呼び方がかっこいいな
すごい勉強になった
質問です /aaa.php /bbb.php /ccc.php /ddd.php ... ばらばらに作って使うのと /xxx.php?aaa /xxx.php?bbb /xxx.php?ccc /xxx.php?ddd ... 一枚にまとめて使うのと どっちがパフォーマンスいいでしょうか? よろしくお願いします
まとめても数百行程度なら、性能上は変わらないと思うが メンテナンスする上では、機能別に分けて置く方が楽かも
実体は別ファイルにしてエントリポイントからrouterで振り分ける
バラした方が各スクリプトのサイズが小さいなら、物理的な読み取りとパースの分速くはなるんじゃね。 でもそんな細かいことよりメンテ性のいい方を選んだ方がいいんじゃないかな。
>>328 よく100万回ループ回した時の実行速度の差を比較したりする人がいるけど
ハッキリいってやるだけ時間の無駄
そんな事を気にするならそもそもPHPなんか使わない方がいい
webアプリのボトルネックというのは
大抵はDB周りだったりするわけで
そのボトルネックを正確に計測し解決する手段を身につける事が遥かに大事
というかそんな事を気にしてるって時点で
何かしらのフレームワークは使ってないんだろうけど
なぜ使わないの?
>>332 フレームワークとか最近知ったばかりでよくわからん初心者です
DBじゃなくてテキストファイルで処理するphpをああだこうだ弄って遊んでいて
ふと思い付きで質問してみました
PHPに関してフレームワーク使って良かったと思える場面て正直ほとんど無いな。 PHP自体がごった煮状態にしてまでいろいろできるようにしてある中で、フレームワークで実現しようとしている目標がいまいちわからん。 生産性にも得してるように思えないどころか、フレームワーク自体のメンテがだるい。 まあそれほどフレームワーク使ったわけでもなく、古くはSmarty、ちょっと前はCakePHP使ったくらいで、それも他所のベンダが作ったのを引き継いだくらいだから偏見に満ちてる可能性はある。
>>333 そか
フレームワークに頼らずに作るのも
DBに頼らずテキストベースで読み書きするのも
とても良い経験にはなるから頑張って
ただ○万回ループした時の実行時間の差を気にするなんてのは
本当にただの無駄でしかないから
コードの見通しの良さとか管理のしやすさとか
そっちを最優先で
root.php?mode=aaa ⇒ mode/aaa.phpを読む
root.php?mode=bbb ⇒ mode/bbb.phpを読む
root.php?mode=ccc ⇒ mode/ccc.phpを読む
なんて作り方もある
今これがベストだと思って設計しても
どうせ1年後にはもっと良い設計が閃くさ
だから色々と試してみるといい
>>334 大規模開発をした経験がないとそうなるかもね
PHPはとてもいい加減な言語なんで
”正しく”書くにはかなりの知識と経験が必要
ネット上のPHPコードの多くが糞なのを見てもよく分かる
だから特定の規則さえ覚えれば”正しく”書ける
フレームワークってのは大規模開発では必須になる
あとは生産性の問題やね
スクリプト言語なんてものはいかに短時間で簡単にものを生産するかが鍵なので
個人開発であっても何かしらのフレームワークは使え
ってのが俺の意見
俺々マイクロフレームワークでもいいからさ
フレームワークの選択を誤ると、 数年後「まだそんなの使っているのか!」 ってエラーが頻発して苦労する
ネット上のソースのカオスさはPHPとJavaScriptが抜きん出てるよな
本ですら平気で間違った事を書いてるから
初心者ならこれを読めって本がなかなかない
if ($_POST['foo'] == 'var')
こんなコードを見ると目眩がする
>>337 それはあるな
ただ今はLaravel使っとけば間違いはないんじゃないかと
>>336 フレームワークを使うにしても、それをどう使うかは結局設計して周知しないといけないわけで、その手間ってフレームワーク使わない場合とそう変わらなくない?
むしろフレームワークが足かせになってそこから外れる部分をトリッキーに遠回りに書くことになったりのデメリットの方が目についてくる感じだ。
工数削減は俺々ライブラリでやれるし、それを周知する手間も前述の周知に比べて多大なわけでもなく、必要ならライブラリを好き勝手に育てられるから、むしろ身軽で早いと思うがな。
この辺はとりわけ既にいろいろお膳立てされてるPHPならではというか。
大規模開発だとどんなメリットが効いてくると考えてるかについては興味あるけどね。
>>338 フレームワークを使わずに
リクエストパラメータを変数に入れて比較してみましょう
って超初歩的な事でも
$foo = (string) filter_input(INPUT_POST, 'foo');
if ($foo === 'var') {}
と正しく書けてる本が何冊あることやら…
$foo = (isset($_POST['foo'])) ? $_POST['foo'] : NULL;
と書けてたらまだマシで酷いのになると
$foo = $_POST['foo'];
だからPHPはヤバすぎる…
PHPがヤバいのではなく、使う奴がいい加減なだけだろう きちんと書ける奴は、何使っても大丈夫
フレームワークの重要性が理解できない内は3流以下と自覚すべき php以外の言語を書けない人に多い
>>340 強制的に string でキャストして情報落とすのが正しいと言われてもなって感じだし、
$foo = $_POST['foo']; がダメというのもそんなの条件次第だろって気もするし、
大事なのは画一的な書き方じゃなくてやり方を適切に選べることなんじゃないの?
オレはこんな感じで書いてるな $foo = ""; if (array_key_exists('foo', $_POST)){ $foo = $_POST['foo']; }
>>344 そのケースなら isset 使ってる。
100万回ループのパフォーマンスなんて気にするなという話の後で言うのもアレだけど、isset の方が速いし短いから。
多重配列の時もそのまま書けるし。
>>343 リクエストパラメータを(string)キャストしてるのは
PHPの仕様的に$_POST['foo']が配列になる事があるからだよ
だから
>>344 だけでは駄目で
少なくともis_string()を追加する必要がある
大垣さんとかPHP界隈のセキュリティで有名な人は言及してるけど
ここら辺まともに書けてる本を俺は見た記憶がない
で、フレームワークってのはこういうところもきちんとチェックしてる
だからフレームワークを使った方がいいよという話
>>341 の言う通り使う側の問題なんだけど
知らなくても動いているように見えてしまうというのは罪な事だね
>>346 も書いてるが
?foo[]=1&foo[][]=2&foo[][][]=3
の時の$_GETの中身を見れば$fooがスカラー型になると決めつけていたらだめだと分かるはず
頭の良い人がせっかくフレームワークってのを作ってくれてるんだから我々凡人はそっち使えばいい
だからPHPerって馬鹿にされんだよw
>>347 応用パターンとしては
<input type="checkbox" name="foo[]" value="1">
<input type="checkbox" name="foo[]" value="2">
<input type="checkbox" name="foo[]" value="3">
というフォームがあった時に
$_GET['foo']が一次元配列になると決めつけてしまってるケース
$_GET['foo']がスカラー型にも二次元にも三次元にもなる可能性を考慮してないから
バリデーションなんかでエラーをだす残念コードがネット上にはたくさん転がってる
そういうのを初心者が真似してしまうのが問題なんだよね
filter_inputというものをはじめて知った(´・ω・`) issetでチェックしなさいというのは最近覚えたけどこっちの方が短く書けるね 勉強になるなあ
>>346 最後については同意。
ただ細かい話、キャストの件は filter_input のオプション無しなら配列は取得されないんじゃないかと。
元々値があったのかどうかの判定が出来なくなるのもまた問題じゃないかね。
だからフレームワークにやってもらえばいいじゃんという立場だとは思うけどさ。
>>347 その程度のバリデーションライブラリも書けない凡人のために(ありものの)フレームワークがあるということであれば、やはりあまり縁の無い話かなと思えてくる。
隣のコンビニになら歩いて行けばいいのに、なぜ車を用意してナビまでセットする?みたいな。
フレームワークってのは、端的に言えば誰が書いても同じ書き方になる仕組みで細かいこと周知しなくてもそうなるから多人数で書いても認識が共有できる、という思想なのかと思ってたよ。
思想通りに実現されるならよさそうだが、現実はそうでもないなって感じてるけど。
PHPみたいにWebに特化してない他の言語なんかは、イチからやるよりはフレームワーク使うのが現実的だと思うし、
PHPでも俺々マイクロフレームワークの話であればその実態は必要ライブラリと雛型くらいのものだろうから、そういうのに異論は無いけどね。
>>349 Filter関数は意外と浸透してないっぽい
$foo = filter_input(INPUT_POST, 'foo');
は
$foo = (isset($_POST['foo']) && is_string($_POST['foo'])) ? $_POST['foo'] : false;
と書くのとほぼ同じ意味になる
上の方が楽だよね
>>351 下の?を使う書き方が苦手なんよね
頭がわるいからこう書かないと理解できない(´・ω・`)
if(isset($_POST['foo'])){
$foo = $_POST['foo'];
}else{
$foo = false;
}
>>352 PHP7からはもっと短く $foo = $_POST['foo'] ?? false; と書けたりもする 三項演算子は別に無理して使わなくていいけど 他の言語を経験してると$fooを初期化せずに if (isset($_POST['foo'])) { $foo = $_POST['foo']; } else { $foo = false; } と$fooをif〜elseの中に入れてしまうのはとても気持ち悪い 三項演算子を使わないなら自分はこう書くかな $foo = false; if (isset($_POST['foo'])) { $foo = $_POST['foo']; } 細かい話なのであまり気にしないくてOK ifとelseの中に書くのはあまりよくないのか(´・ω・`) 全部こうやって書いてた。。。 理由が理解できないあほですまんけど次からはfilter_inputを使うから許して
if (条件A) { $foo = 'a'; } elseif (条件B) { $foo = 'b'; } var_dump($foo); 条件AもBも満たさなかった時にエラーになるわな まずはvar_dumpが参照できるレベルで$fooを定義して必ず参照できることを保証しろってこと phpしか書けないPHPerだとelseを書けばいいだろと思うかもしれんがそうじゃないそうじゃないんだ
>>355 $test = "c";
if ($test == "a") {
$foo = 'a';
} elseif ($test == "b") {
$foo = 'b';
}
var_dump($foo);
エラーはでずにNULLと出るんだが。。何か間違ってる?
>>356 <?php
の次の行に
error_reporting(-1);
ini_set('display_errors', 1);
を書こう。大雑把にいうとエラーを全部出力するって意味になる
Notice: Undefined variable: foo($fooっていう変数が定義されてない)
ってエラーが出力されるはず
あと条件式は
($test == "a") じゃなくて
($test === "a") と「=」3つ使って比較しよう
理由は「PHP 型 比較」とかで適当にググって
>>356 エラーレベルってのがあってデフォの設定だとnoticeレベルのエラーとかは出ないようになってる
http://php.net/manual/ja/errorfunc.configuration.php#ini.error-reporting undefineってのは未定義ってエラーなんで消したいなら最初に
$foo = null; なり $foo = ""; なりまずは$fooを定義(define)しろって事
エラーが出たし理由もなんとなく分かったよ サンクス でも今まで書いたやつにもエラーが出まくり 本を写しただけなのに(´・ω・`) 買う本を間違えたかな。。。初心者は何を買えばええんや。。。
>>359 エラーの設定ってのは学習時に一番最初にやるべき事で
本来はphp.ini(PHPの設定ファイル)の方へ設定すべき事なので
それについて書かれてないのならその本はハズレだろうねw
あと本を写したって書いてるけど
ソースコードを見たまままま打ち込む(写経と呼ばれる)作業は
何かしらの言語をもう少し書けるようになってからでいいと思う
(決して無駄ってわけじゃないけど)
今の段階だとソースが付録として付いてたり
ウェブからダウンロードできるようになってる方が良いんじゃないかな
具体的にこの本が良いと答えられたらいいんだけど
知らないんだ…すまない
最近はネットで動画を見ながら学習できるサービスが色々とあるからそういうのもいいんじゃね? 本は俺も知らん phpのまともな本を探すのってウンコの山から金の塊を探すようなもんだ
未だにフレームワークを使う意味が分かんないとか言ってるのは中小零細の底辺ペチパーやろな SQLとかを生で書いて文字列結合とかやってるんだぜきっと LaravelあたりのモダンなFWを理解する頭もなさそう
ウンコはすぐ分かる まずそれを踏まないようにしよう
「サーバーを書く」っていうのはどういう意味?phpで書いたプログラムをサーバーに置いて動作するようにすることも含むの?まったく違う概念?
サーバーサイドプログラムを書くってことじゃないかな 基本的には動作するところまでも含むと思うが、 そんな表現使う人の気持ち次第ってところもあるかと
サーバーサイドという言葉でくくってしまうとPHPはサーバーサイドで動くものなので語弊があるが PHPは得意とするフロントを作る以外に例えばProxyサーバとして動作するものを短い行数で書いたりもできる サーバーを書くってのはそういうものをPHPなり他の言語なりで書く時に使う表現かと
>>367 例えばオンライン要素(マルチプレイ)のあるゲームを作る際に、サーバーにあるDBにアクセスしてデータを出し入れするプログラムをPHPで書いた場合は「サーバーを書く」と言っていいの?
>>368 そういう用途では使わないと思う
Proxyみたいにサーバ上でスタンドアローンで動作するアプリと言えばいいかな?そういうものを書くイメージ
例えばwebminはhttpサーバ機能をperlで書いてるがそういうものをサーバーを書いたと言うのはしっくりと来る
>>369 完全に理解した!!(大嘘)
ありがとう
ちょっとググるとguzzleでproxy書いてるのとかあったからやってみればいいんじゃないかな そうすればサーバーを書くというのはどういうものなのか何となく分かるのでは
サーバってのはsocket関数使ってポートlistenしたデーモンであること
>>368 はたんにバックエンドなだけ
>>373 今のところ使い道が浮かばないからやめておくよ。でもありがとう
>>374 これで完全に合点がいった。ありがとう
VB/VBA(クラス無し)しか書かけないけど、PHP(5?)を触ることになった 入門書探してるんだけど、尼のカスタマーレビュー見るとどれも賛否両論でまともなのがない 「これ買え」ってのない? 内容全部が役に立つわけないのはわかってるから、本の特徴が知りたい
リンクをクリックすると問い合わせに回答するメールの画面が開くという処理があるのですが、 EdgeとIEでは正常に動作するのですが、Chromeだと何も起こらない時があります。 $val = mb_convert_encoding($_POST['body'], "SJIS", "UTF-8"); body(本文)が短いとChromeでも正常に動作するのでbodyの内容が長い時に↑のエンコード時に何か異常が起きてると思うんですけどわかる方いますか?
input要素の入力の有無を確認する方法で一般的な方法を教えてください。 1. if($hoge == ''){・・・} 2. if($hoge === ''){・・・} 3. if(empty($hoge)){・・・} 4. if(!$hoge){・・・} 5. if(!strlen($hoge)){・・・} 6. 他の良い方法も教えてください。 PHPを初めて日が浅いので変な質問をすると思いますが、よろしくお願いします。
>>378 <form action="" method="post">
<input type="text" name="hoge">
のフォームから飛んでくる$_POST['hoge']の値が空かどうかは
if ((string) filter_input(INPUT_POST, 'hoge') === '')
と書くのが実用的(正しいというと語弊があるので「実用的」と表現しとく)
少なくとも3や4は使っちゃ駄目
hogeに'0'が入っていても空として判定されてしまう
>>377 <a href="mailto:
[email protected] ?body={$val}">〜</a>
としてリンクをクリックした時に
メーラーの本文に$valが書かれた状態にしたいって話だろうか?
もしそうならbodyに何byteまで指定できるかは環境依存なので
その方法は止めて
ローカルのMTAやSMTP使ってメールを飛ばすようにした方がいい
>>376 ちょっと上でも話が出てるがPHPには初心者ならこれ!という本が本当にない
強いていうならPHP公式サイトにあるPHPマニュアルが一番いい
何かを作りながら学びたいのであれば
ドットインストールみたいなサービスも選択肢になるかも
プログラミング言語として学ぶだけならいざ知らず, PHPの場合はほぼ確実にサーバサイドプログラミングのお作法とセットだから難しい 構文だけは簡単だけど実用しようと思うと全く初心者向けじゃないと思うわ (サーバサイドアプリケーション自体初心者向きじゃないとは思う)
本屋で色々見て一番読みやすそうなの買えばいいんだよ 何が読みやすいなんて人それぞれなんだから
>>378 です
>>379 さん
アドバイスありがとうございます。
教えてくださったコードとPHPマニュアルを見て動作から学びたいと思います。
また、3と4の方法は、日本語のみの場合、使っても問題ないということでしょうか。
覚えることが多いですが、頑張ります。
>>381-383 やっぱなぁ
入るスキルがバラバラだからコレっつーのが難しいんだな
「PHPマニュアル」が一番ってのはわかるんだが、リファレンスであって教本じゃない感じ
XAMPP(MySQLでPHP5)環境だから、大きい本屋であさって、尼で中古買うわ
自分が始めた10年ぐらい前は赤マンモス本とかが流行ってたけどね 今はもう古いんじゃないかなあ 困ったときはとりあえずみんなオライリーって言うけど誰も言ってなかった
>>384 > 3と4の方法は、日本語のみの場合、使っても問題ないということでしょうか
例えば if (empty($hoge)) は
1.$hogeが未定義(undefined)
2.$hoge = NULL
3.$hoge = (bool) false
4.$hoge = (int|float) 0
5.$hoge = (string) 0 or (string) ''
6.$hoge = (array) array() (空の配列)
なんかの時に真になる
意味を分かって使うのであれば別に絶対駄目だという訳じゃないよ
「日本語のみ」というのはPHPではどう判定するのか
そもそも日本語をどう定義するのかって話はあるけど
>>387 さん
詳しいレスありがとうございます。
それぞれの関数の意味を理解するよう勉強します。
ありがとうございました。
>>380 ありがとうございます。mailtoじゃなくjavascriptですけどメーラー本文に問い合わせ内容が書かれた状態にしたいです。
私は専門はオフコンなのでほとんどPHP等の知識はないのですが、作った人がもういないので仕方なく探り探りやってる状態です。
>>389 今JavaScriptでやってるという方法も
結局は内部的にmailtoスキームを使ってるのではないかと思う
その方法はブラウザやブラウザから呼ばれるメールソフトに依存してしまう
しかも環境によってはそもそもメールソフトが起動しない
つまりPHPの処理の問題ではないって事ね
Googleフォームみたいに
問い合わせフォームを簡単に作れるサービスがたくさんあるので
そういうのを使ってみるのはどうだろう?
「問い合わせフォーム 作成」とかでググってみるとか
>>389 試しに実験してみたけど
Chromeはやはり?body=に長過ぎる文字列を指定してると
mailtoが反応しなくなるっぽいね
適当に10,000byteのbodyを与えみたら
Chromeはmailtoをクリックしても何も起こらなくなる
Firefoxだと2046byte以降が削除される
これはもう仕様なので他の方法にするしかないだろうね
今までも環境によっては動いてなかったんだと思うよ
>>389 GETじゃなく、POSTでやってみたら
PHPの知識というよりWebの動作についての知識
>>390-391 やはりそうですかありがとうございます。
問い合わせフォーム自体はあるのですが、返信する時にメーラーを使っています。
>>392 POST勉強してみます
>>394 問い合わせ内容がメールで来るわけではなく画面に表示されて
画面内のリンクをクリックしたら返信用にメーラーが立ち上がるみたいな仕組みなのかな?
問い合わせ内容が何かしらのメールアドレス宛に届くようにしさえすれば
あとは運用で解決する問題なような気がするけど…
>>395 まさにそう言うことです
VBAくらいは触ったことはあってもWebアプリはチンプンカンプンで一から勉強です・・・
運用でカバーするなら今のままでIE使わせればいいって話でもあるわな。
$var = $_POST['var']; よりも $var = filter_input(INPUT_POST,'var'); が良いんですか !? 前者は危険だと聞いた(´・ω・`) 勉強中の身だけどムズカシイ
filter_inputで少しぐぐれば出てくるでしょ 分からない単語出てきたらまたぐぐるってやってけば分かるさ
>>399 前者が危険な理由はキーワード知らないと filter_input でググってもでてこないと思うけど。
>>400 実際にググってみた?
キーワード知らなくても検索結果の上から5つくらい見ればそれなりには理由分かるよ
filter_input だと便利な場面があるというだけで、$_POST はこれまでみんな使ってきたものだし留意点を押さえれば問題があるわけじゃない。 $_POST での参照は、そもそもそのパラメタが設定されているか、期待する型かとかを自分で判定する必要があるというだけで、fi-ter_input はそれを場合によって便利にするユーティリティ関数程度のもの。
$_POST が危険って言われるのは、変更可能なスーパーグローバルだから。 filter_input は HTTP で投げられた値を直接参照するので、$_POST とは全然別物。 ググってでてくる情報で、変数汚染に触れてる記事はないので、概要知らないとたどり着けないんだぜぃ!
>>405 行儀の悪いモジュールやライブラリとか使うと書き換えられるかも。ってぐらい。
実際にはそれほど気にしなくて良いレベルだけど、それを気にしなきゃいけないプログラムは多い。
読みやすく/使いやすく/再利用性の高いコード書くってことは、結合を疎に保つことが重要なんで、そのあたり理解してると $_POST はまず使わん。
>>404 >$_POST が危険って言われるのは、変更可能なスーパーグローバルだから。
>filter_input は は HTTP で投げられた値を直接参照するので、$_POST とは全然別物。
$_POST が危険って言うのは聞いたことがないんだが、
Webサーバーが受けとったリクエストをPHPが取得して変数に代入している訳だろう?
PHPスクリプトが変数の値を参照するのに誰かが割り込めるのかな
リクエスト内容を直接参照すれば他が割り込めなくなるとは思えないが
filter_input がやれるなら、他も出来ると言うことだろう
$HTTP_POST_VARS って変数があり、 これはスーパーグローバルではないけれど 現在は非推奨となってる
>>408 ここで言う「危険」は「セキュアじゃない」って意味ではなくて、「コードが意図した通り動かない可能性がある」とかの意味。
$_POST は「スーパーグローバル変数」なので、コード内のいたる箇所で書き換えることが可能。
で、書き換えちゃった場合、それを使用している他の箇所にも影響出るよね。ってことを危険っ言ってる。
普通は書き換え行うようなことはしないけど、何かの意図があって書き換えた場合、後に想定を超える影響を及ぼす可能性が大。
filter_input は読み取りのみが保証されるので、疎結合なコードを書くには filter_input を使用することが必須。
>> 407
GET も考え方は同じ。
>>410 そういうのはバグって行って、POSTスーパーグローバル変数の問題ではないなあ
使い方が間違えているか、ワザとそうしているかだろう
普通に推奨されている方法をあえてとらないって 意味が無いと思う
自分だけでやってシステムが終わるまでメンテするって言うなら良いけど
>>411 バグの入る余地をなくして、読みやすく/使いやすく/再利用性の高い危険を回避したコードを書くには、結合を疎に保つことが重要
で、結合を疎に保つには filter_input を使用することが推奨されるって話なんだけど、通じてる?
普通に推奨されている方法をあえてとらないって 意味が無いと思う
自分だけでやってシステム終わるまでメンテするって言うなら良いけど
あえて書き直すほどの事は無いと思う 開発する人間が注意すれば避けられること そこまで拘るなら、Webサーバー使わずに 自前でリクエストを受けとってしまえば良いんじゃない? 普通に推奨されているとは思わないよ。そんな関数初めて聞いたし。 どこでそんな事で大騒ぎになっているの?サイト教えて
疎結合と filter_input がいまいち結び付かん。 HTTPリクエストから必要パラメタを取り出しオブジェクト化して、後はそのオブジェクトを使ってパラメタにアクセスしましょうってんならHTTPリクエストを隠蔽できて疎かなって気もするが。 $_POST の代わりに filter_input を使うと何と何が疎になるの?って感じ。
>>414 変数のスコープのの話なんて、適当に探せばいくらでも出てくるだろうに^^;
堅牢なコードを理解してないみたいなんで、これでも見て意識改善するといいよ。
VIDEO >>415 > HTTPリクエストから必要パラメタを取り出しオブジェクト化して、後はそのオブジェクトを使ってパラメタにアクセスしましょうってんならHTTPリクエストを隠蔽できて疎かなって気もするが。
その認識で正しいと思うよ。
ただ、それはそれ。
取り出しの時に行儀の悪いモジュールやライブラリ使用したときに、邪魔される可能性は残る。
取り出しのときにでかいスコープを回避できる 読み取り専用の関数を使用すると、予防的にコードが書けるってことです。
PHPを扱うサイトでfilter_input が話題になっている所あるの? 見つからないんだけど 普通に推奨されている位だから、たくさんあってもおかしくはないよね?
Webサーバーからリクエストを受けとるのに隠蔽も何もないと思うけどね グローバル変数だから書き換えられる可能性があるというのも変 書き換えているのは自分じゃないか。人のせいには出来ないでしょう 大勢で開発しているなら、その処理を行う担当以外は操作禁止にするだけだし
>>418 filter_input じゃ、ググれないよ。
グローバル変数を使用しない理由を検索してみるといい。
キーワード知らないと、ググれないっていうのはそういうこと。
>>419 @t_wada の前でも同じこと言えんの?
既存コードを修正すべきだとまでは言わないが, 新規コードにはfilter_inputを使うべきだという点に関しては疑う余地がない
>>420 つまり、公開されているPHP関連のサイトではそのような話題が出ていないと言うことでOK?
>>419 んまあデバッグしたりコマンドラインでも実行できるようにしたりする可能性を考えると、HTTPリクエストの扱いは浮かせて置いた方がいいかなって気はするよ。
後は同意。
$_POST がダメで filter_input ならいいって話には繋がらないと思うし、$_POST をわざわざ書き換えるならあえてそういう設計なんだろうけど、それが甘いか明確になってないだけじゃねとしか思わん。
そういう設計はかくかく然々でお勧めしないよって話ならまだ聞ける。
ちなみに
>>416 は見たよ。
話のうまいやつで面白かったよ。
PHP にも assert あったのね。しかも運用時にいないことにできるとか、なかなかいいじゃないか。
キーワードで検索出来ないってことがとても不自然に感じるんだけど 普通に推奨されていると言うなら、行う記事があってもおかしくはないよね まさか、この関数が非公開関数で秘密にしないといけないものだったりして
>>423 >>425 グローバルスコープな変数使うなよって話以上に何が聞きたいの?
グローバル使用しない代替手段使おうねって話でしか無いんだけど^^;
そろそろ理解しようよ。
>>426 それならそういえば良いでしょう
変な関数持ち出す必要もないし
普通に推奨されているなんて言いだすから
サイトを教えてくれと言う話になってるんだし
>>426 よく言われるようなグローバル使うなって話は、自分で定義するのは極力避けましょうってことであり、用意されてるものを使うなって話ではないんじゃない?
そんな事実上の内部バグを問題にするよりも リクエスト投げてくるのは、こちらが用意したフォームとは限らない、 想定外のリクエストに乗せられることが現実に発生するんだし、 そちらのチェックの方が重要だと思うよ そういう実際的な話題を提供して議論する方が良いと思うな
>>428 最初っから、そう言ってるんだぜぃw
>
>>399 > 前者が危険な理由はキーワード知らないと filter_input でググってもでてこないと思うけど。
途中で投稿してしまった。 > $_POST が危険って言われるのは、変更可能なスーパーグローバルだから。 > filter_input は HTTP で投げられた値を直接参照するので、$_POST とは全然別物。 > ググってでてくる情報で、変数汚染に触れてる記事はないので、概要知らないとたどり着けないんだぜぃ!
>>429 改変されるリスクの有無は同じなので、限定した話ではない。
ググっても出てこない関数がどうして普通に推奨されていると言うのか、 その根拠を聞きたかったんですが そんなに話題に上らない関数と言うことで良いんでしょうか?
しつこくて済みませんが、グローバル変数を使うなと言うのは、一種の宗教だと思うんです 信じる人はそうすれば良いけど、信じない人はそうしなくてもいいと言う程度で
PHP The Right Wayくらいは必読だと思う
https://www.phptherightway.com/#data_filtering 理由もなくスーパーグローバルを直接叩くようなコードを新しく書いたならそれだけでrejectするに足る
それ以外のグローバル変数も納得出来る説明がコードやコメントに無いならreject
エラーが起きない方法をとるのに越した事はないと思うけど、何をそんなにむきになってるのだろう
>>436 そこからどこまで読めばお前さんの言いたいことが書いてあるのが分からんが、とりあえず外部データをサニタイズせずに使うことの危険性なんかを説明してるのかな?
それを解決するのに filter_input や filter_var を使えますよという話だよね?
グローバル使うな的な話は書いてないようだが、ただ実はもしやと思ってたんだけど、register_globals を使うなって話と混同してるんじゃない?
それは危ないから使わない方がいいよ。
そしてそれは $_POST を使うななんてこととは全く関係無い。
>>434 ずっと同じことのループやねぇ。。。
> ググっても出てこない関数がどうして普通に推奨されていると言うのか、
ググって出てこないのは、$_POST の危険な理由。
関数としては各所で便利だぜぃ。って紹介されている。
PHP The Right Way もその一つ。
>>435 > しつこくて済みませんが、グローバル変数を使うなと言うのは、一種の宗教だと思うんです
宗教じゃなくて、意識の話。読みやすく/使いやすく/再利用性の高いコード書くことを意識していれば、グローバル変数の使用はまず避けるように設計する。
避ける気がないのは、読みやすく/使いやすく/再利用性の高いコード書く意識が無いってだけ。
>>435 他言語しか知らないけど、グローバル変数なんてめったに使わない
>>440 PHP勉強中だけど、教本のサンプルって短いからグローバル使いまくり
いいコードの書き方ってなかなかないね
やっぱり実践のコード((またはきれいな)が見たいよ
filter_input 自体は $_POST使っているんでしょ?
>>440 だからさ、自分でわざわざグローバル変数作るなってことだろ、それは。
既に用意されてるものを使うなって理由としてグローバル変数だから(誰でも書き換えられるから)ってのは意味が分からんだろ。
わざわざ示されたもの読んで言ってるんだから
>>438 にも答えてくれよ。
>>443 ずっと同じことのループやねぇ。。。
> 改変されるリスクの有無は同じなので、限定した話ではない。
改変されるリスクの有無は同じなので、限定した話ではない。
この辺が、結合を疎にする意味。
> わざわざ示されたもの読んで言ってるんだから
>>438 にも答えてくれよ。
オレが示したわけじゃないんで解釈あってるか分からんけど、普通に読めば「ググっても出てこない関数がどうして普通に推奨されていると言うのか、その根拠を聞きたかったんですが」に対するコメントだと思うぞ。
filter_input 紹介している有名記事を教えてくれたんでしょ。
>>442 filter_input は HTTP で投げられた値を直接参照するので、$_POST とは全然別物。
試してみるといいよ。オレも最初試したw
>>444 あ、ごめん
別の人と混同してたわ
それはそれとして結合を疎にする話、自分でグローバル変数を用意してそれを介して複数クラスやモジュールでコミュニケーションするって話ならそれは結合が密だと言えると思う。
でもただシステムが用意してるリソースを参照するからと言ってそれが密かと言えばそうじゃないし、密だったとしてそれを疎にするためにラップしなさいっていうならそれは分かる。
filter_input 使ったところで何が疎になってるの?って感じだけど、そこらへんどうなの?
若干繰り返しになるけど、PHP固有の関数である filter_input 自体を直接参照せずラップしましょうってところまで行ってるのであれば、そういう方法論もあるかと思うよ。
グローバル変数誰かが書き換えたら不具合が起こるって、スコープが狭いだけでクラスメンバ変数を誰かが書き換えちゃったらという話と同じような話でしょ。
早い話、選定してるものを仕様通りに使ってないという問題なんだかrさ。
個人的には $_POST をリードオンリーにして使ってるが、俺だけだろうな
>>446 filter_input は HTTP で投げられた値を直接参照するので、$_POST とは全然別物
スーパグローバル変数は「参照」できるだけでなく、「書き込む」こともできるのでどう使っても密になる。
オブジェクトのプロパティに「POST内容を突っ込んでおく」場合でも、スーパーグローバル変数を使用して取り出すと行儀の悪いモジュールやライブラリに邪魔される可能性が残る。
取り出しのときに読み取り専用の関数を使用すると、そういった結合を疎にすることができ、予防的にコードが書ける。
で、ここで言う読み取り用の関数が filter_input
> グローバル変数誰かが書き換えたら不具合が起こるって、スコープが狭いだけでクラスメンバ変数を誰かが書き換えちゃったらという話と同じような話でしょ。
読みやすく/使いやすく/再利用性の高いコード書く場合は、発想が逆でそういった事をさせないように設計する。
堅牢なコードを理解してないみたいなんで、これでも見て意識改善するといいよ。
VIDEO これ以上やっても信仰する宗教のようなのでやめますが php.netで $_POST変数が非推奨になり、filter_input関数が推奨になったら その時に考えることにします 今は、いくつかある対策方法の一つとして聞いておきます
>>448 書き込めたら密だって?
なんかワケわからんが、お前さんの言う密って何?
ちなみにそれは見たよ。
>>450 複数クラスやモジュールでコミュニケーションしてしまう状態
あなたはそういう風に使いたいのかも知れないが 普通の人はそうは使わない いつまで自分の信仰に拘るんだろう
>>452 グローバル変数の汚染を回避する設計って普通だぞ^^;
新興でも何でも無い。
汚染する犯人は自分以外にいないんですが 多重人格者でもなければ心配ないでしょう
>>454 3ヶ月目の初心者みたいなこと言うなよ。。。
堅牢なコードを理解してないみたいなんで、これでも見て意識改善するといいよ。
VIDEO 汚染の原因なんて事前に特定出来るでしょう それが出来ない人だから、こんなことするの?
>>456 だから動画見ろってw
汚染も含めて「影響を受けない/受け付けない」コードの書き方を研究して、公開してくれてるんだから。
一か月前の自分は他人だよ 一年も経てば細部なんて何も覚えてない 俺は自分にそこまで自信を持てないわ
防げるのはせいぜい自分が書く内部バグくらい? 外部からの攻撃については無力 コツコツとバリッドチェックを用意することになるのは変わらない こんなんでも堅牢なシステムだって言えるんだろうか
グローバル変数に対して誤って代入している箇所を見つける事が そんなに難しいことなんだろうか?
>>456 は結局のところ「注意すれば事足りるでしょ?」ってことを昨日からずっと言い続けてるよね
その注意をかける負担を減らせる手段を一つでも盛り込む事に反発する理由なんて一つもないと思うんだけどな
俺の頭がおかしいのかそうじゃないのかよく分かんなくなってくるじゃん
誤った代入ならローカル変数にだってあり得るが こういうロジックミスはそれを使っても防ぎようがない 丹念にチェックし潰していくしかない
あと宗教だの信仰だの言ってるけど、頑として自分の主張を曲げずにずっと言い続けてるってのは、結局のところそれは「別の宗教(信仰)」なのでは……?
経験により積み重ねてきた手法を変えるというのは それだけの説得力が必要なんだと思います だから布教は大変なんでしょう
堅牢と言っているけども、何から堅牢かと言えば、自分自身が書く記述の誤りから堅牢になると言うこと プログラムから見たら、グローバル変数だけをガードしてからと言ってバグフリーになるわけじゃない また、Webサイトとして堅牢をうたうなら、それは外部からの攻撃に対しての話だし 今回提案された関数を使おうと、その点については無力のまま この辺が改善されたら導入を考えようと思うんですが、如何ですか?
>>466 オマエほんとバカだろ。。。
動画見ても全然理解できないと思うけど、まず見てみ。
会話が成立しないくらいズレたことコメントしてるってだけでも理解したほうがいい。
>>466 の提案を受け入れたら考えます
出来ないなら、これで終わります
>>468 なんで交換条件なんだよw
そのままズレてろ。どうでもいいわ。
>>461 注意すれば足りるっつうか、$_POST に値を代入しないようにコードを書くのがそんなに大変なの?
わざわざそういう設計をしなけりゃそんなことしないし、そうしてるなら必要だからしたんだろうから仕様に沿って使えばいいんじゃね?
ということなんじゃないの。
いや別に filter_input を使うなと言ってるのではないし使えばいいじゃんと思ってるが、$_POST をそこまで忌み嫌うのが意味分からんてことだよ。
それで疎にするとか持ち出してきて、$_POST の代わりに filter_input 使えば疎になるって何のこっちゃ?って感じだろう?
堅牢になるぜならまだ分かるが、疎って?ってさ。
疎にするって話ならと
>>415 みたいな手法を持ち出してみたらそれには同意してもらえてるっぽいが、filter_input 使えば疎って話ではないだろってところは通じてないっぽいんだよな。
なんつうか、意識高い系なんだろうなって感じ。
チームで開発したことないんだろ、きっと それか、一人で十分な開発規模 あるいはチームでテレパシーw
スーパーグローバルとfilter_inputに関してはPHP特有だし多少議論があるのは理解する それでもfilter_inputの方がベターだと思うが しかしグローバル変数使うなが納得出来ないというのはお話にならない
正直、ここしばらくフレームワークの世話になってたから $_POSTもfilter_inputも明示的につかったことない でも、ざっと見た限りではよっぽどトリッキーなことしない限り filter_inputをつかわない理由はないな
>>470 密とか疎に対して「結合」って使ったから良くなかったかもね。
結合というより、関係性かなぁ。
$_POST が変更可能な変数であり、かつどこでも使用できるため、使用箇所の関係性が密になってしまう。
値が変更になれば、当然後続が影響を受けるから密ね。
だから、http から直接値を引っ張ってくる filter_input 使用することで、どこで使用しても一律な値を保証できるよう関係性を疎に保とうよ。
って書きたかったんだわ。
結局、$_POST 使用するたびに、プロジェクト全体を grep するとかアホらしいので、新規にコード書くならまず $_POST は使わん。って程度の決意。
ところで $_FILES や $_SESSION へのアクセスはどうやってるの?
>>475 回避不能だねw
基本はフレームワークに閉じ込めて、自分では $_FILES とか $_SESSION は書かない。
で、どうしても自分で書かなきゃいけないときは、念のため grep するぐらいしか対応できない。
追いついた。 単にグローバル変数を使わないようなコードを書きましょうねって話よね。 大昔BASICからCに移行したときに見た話かな。
>>477 同じくくだらない話に今追いついたが
たったそれだけの話だよな
グローバル変数なんか感覚的・直感的に気持ち悪いと感じないようじゃ
いちいち細かい理由を説明しないと理解できない時点で
プログラマとして失格だと思う
趣味でやってて自分1人さえ理解できればよくて
メンテも一生自分1人でやるのなら好きにやりゃいいけどさ
>>477 ,478
追い付いたというからにはそれなりに読んだんだろうに、それで単にグローバル変数を使う話に見えるならプログラマー失格だと思うよ
>>479 様がマウントを取りたいがために風呂敷を拡げ始めたと聞いてバックネット裏の席を確保しました
>>480 PHPの仕様として存在しPHP自体が用意してる参照が非推薦ともされていない情報に対する参照がグローバル(スーパーグローバル)というだけでなぜいけないのか?という話だよ。
自分で勝手グローバルを作ろうって話じゃない。
>>482 >>477 と
>>478 はどのあたりがプログラマ失格なんですか?
>自分で勝手グローバルを作ろうって話じゃない。
彼ら(
>>477 >>478 )はこれに該当する旨を話してるんですか?
どのあたりがそうなんですか?
人の話を聞かないまま退散したあのかたが蒸し返しで再登板しただけでした 解散
グローバル変数云々の話以外だと例えば ?foo[]=1&foo[][]=2&foo[][][]=3 の時の htmlspecialchars($_GET['foo']); はエラーになるわな なのにis_set($_GET['foo']) や array_key_exists('foo', $_GET) 程度で満足してるウンココードだらけで そういうウンココードが書籍にまで書かれててウンコが量産されてるのもphpの問題だな htmlspecialchars(filter_input(INPUT_GET, 'foo')); ならエラーにはならないが、現実的にはfilter_input()も直接は使わないわけで フレームワークを通さずに書きたいなら$_GET['foo']よりはベターってだけ フレームワークを使わない便利な関数を使わないって人ってのは 大した頭もないくせして車輪の再発明が大好きなんだろうとお察しする 絶対に一緒に仕事をしたくないタイプ
register_globalsやmagic_quotes_gpcみたいなPHPの黒歴史や 伝説の名言「例えば、PHPを避ける」なんかを知らない人も 増えてるんだろうなと思う 今から10数年前のPHP4を勉強してた頃の自分なら $_GETや$_POSTを直接使って何が悪いの?と言ってた筈 プログラミングの世界は1年前の自分ですら赤の他人だし いつか理解できる日が来るといいね 理解できなくても食うに困らない稼ぎがあるなら それはそれでいいんじゃない?(周りの人は迷惑だけどw)
PHPの開発方針がめちゃくちゃ保守的だってことも知らないのだろう
https://externals.io/message/100087 php-internalsでも$_POSTや$_GETをimmutableにしないのはあくまで後方互換性が崩れるからだとしか言われてない($_ENVや$_SERVERはまた別だが)
スーパーグローバルの(スーパーグローバルの書き換えとは独立した)immutable版があればいいのにと思う
PHPしか書いた事ないやつだとimmutableという概念を知らない可能性もありそう そもそもさ ?foo=bar $_GET['foo'] = 'hage'; var_dump($_GET['foo']); // string(4) "hage" var_dump(filter_input(INPUT_GET, 'foo')); // string(3) "bar" ↑これ理解できてるんだろうか? あと素朴な疑問だが $_GETや$_POSTを直接使ってるやつってユニットテストはどうやってんの? ブラウザで表示させて実際に値を入力してテストとかやってそうw
>>489 >↑これ理解できてるんだろうか?
>>442 を見る限りでは勘違いしてるっぽいね
> $_GETや$_POSTを直接使ってるやつってユニットテストはどうやってんの?
その例のように
$_GET['foo'] = 'hage';
とかやってるんじゃないかな…
真面目な話
個人開発レベル程度の経験しかない人だと
PHPUnitなんて使った事ない(というかユニットテストという概念を知らない)って人がわりといたりする
>>486 そこでちょろっと言ってることが本質なんじゃないの。
一番に検討しなくちゃいけないのは、外とのインタフェースをあちらこちらに書かず特定の機構に閉じ込めるということだろ。
閉じ込めた中で $_GET と filter_input のどちらを使うかなんてことは本質じゃなく、その時の都合でベストチョイスすればいいだけのこと。
どっちもPHPが用意している正当なインタフェースなんだから。
グローバルはいけないんだなんて言ってみても、結局
>>475-476 でしょ。
>>491 > 一番に検討しなくちゃいけないのは、外とのインタフェースをあちらこちらに書かず特定の機構に閉じ込めるということだろ。
このことはだれも否定していない。
> 閉じ込めた中で $_GET と filter_input のどちらを使うかなんてことは本質じゃなく、その時の都合でベストチョイスすればいいだけのこと。
こっちを、スーパーグローバル変数を使用するのはやめようぜ。って言ってる
自前実装だろうが、PHPの仕様だろうが、グローバルな変数ってだけで悪w
> グローバルはいけないんだなんて言ってみても、結局
>>475-476 でしょ。
だから、immutable 版がほしいね。って流れ
ざっと見て
>>448 あたりは結構頑張って理由を書いてると思うし
>>493 はワッチョイから判断するに同じ人だと思うのだけど
自分は
>>442 を見た時点で説明するだけ時間の無駄だと判断した
スーパーグローバル変数(笑)なんてものを直接使う糞コードが少しでも減ってくれたらいいなとは思う
ワッチョイで
>>448 と
>>493 が同じってどうやって判断するの?
>>493 と
>>494 は hE18 で同じかなって気がするが、そういう見方じゃないんだっけ。
来週の木曜0:00AMまではワッチョイ末尾4桁「hE18」はJaneStyle4.00をデフォの設定で使ってる人 すなわちUserAgentを現してる(毎週木曜リセット) じゃぁどこ見て判断してるのかといえば「b3」で 大雑把に回線が同じHostなんだろうって事を確認して あとは文体で判断してる(リセットされない) プログラム板の人なんだからそれぐらいの法則性は自力で見つけて欲しいものだが…
ちなみにこんなサービスもある
https://afi.click/browser/list/ プログラム板の住人なら
どうやればこのサービスを実現できるか
DB設計から考えてみたらいいんじゃないかな
他人に根拠希薄にプログラマー失格とか罵っときながらのオチがこれ
11レスもしながら出だしの>442の時点で間違ってるのは オチとは言わず「ボケ」と言うんじゃないかと たくさんのツッコミが貰えて本望だろう
この話題の最初に書いたとおり、filter_input の使用に関して、スーパーグローバル回避のためって理由がググっても中々ヒットしない。 ある程度コードかけるようになると自明だし、フレームワーク使うようになると filter_input すら使う機会が少なくなるからだと思うけど、量産型初心者が全部 $_POST で育ってくるのでめんどいw みんなどんどん素敵記事書いて、初心者に広報してくれんかねぇ。
グローバル変数を使わない方がいい理由が分からないって人ってやっばりPHPしか書けない人なのかな? 他の言語では常識な事だけに何が理解できないのかが理解できない
✕PHPしか書けない ◯PHPすら書けない PHPerが馬鹿にされる理由がよく分かるよな
メジャーなフレームワークのコードを読んでみたりはしないのだろうか 全部を確認したわけではないけど流石に$_GET $_POSTを直接ごにょごにょやってるFWは無いと思う
ググってみるとteratailに質問してる初心者のやり取りを見つけたからurlを張っとく
https://teratail.com/questions/63786 501の言う量産型初心者が1人でも減ってくれることを願って。。。
>>505 これ、オレがコメントした時に参考にした記事www
これのせいで、「疎結合」とか、伝わりにくい表現使ってしまった。
ちゃんと理解した奴がまとめて記事書いてくれprz
>>504 laravel 5.6.33 の新規プロジェクト作って grep してみたら、filter_input はヒットしなかったよ。
$_GET やら $_POST、$_SERVER なんかを使ってるコードはたくさんあるが、これが FW 本体なのかは知らないから見てるものが違うかもしれんが。
ついでに手元にあった古い cakephp のコードも grep してみたけど、やはり filter_input は使ってないようだね。
最新だとどうなのかは知らないけど。
どのフレームワークのコードを読んだの?
なんで使ってないんだろうな さすがに何らかの理由があるはずだよな
その辺はいろいろなFWのコードを読んだ
>>504 がまず解説してくれると思うけど、
>>493 によればグローバルな変数ってだけで悪らしいし、それについての否定コメントも無いことを見れば共通認識なんだろうから、
この流れから言えば量産型初心者が作ってるってことなんじゃない。
スパーグローバルの差し替えなんて密結合(?)な行儀の悪いこともしてるようだから、ゴミがメジャーになった悲劇的なケースなんだろうかね。
おれはそうは思わないけど。
filter_input は多重配列に弱いし $_GET や $_POST も含めて同じパラメタ名が重複することに気付けなかったりするので必要に応じて自前で QUERY_STRING やら STDIN を読む選択もあるだろうと思ってるから、
FW の利用を含めておれはその時一番都合のいい方法を選択するから気楽なもんだ。
選択肢を絞ることを徹底するというのも品質管理の手法の一つとしてあると思ってるけどね。
何にしても解説を待ちたいね。
グローバル変数とユニットテストについて質問です。 ユニットテストで、NULLバイトチェックのため、$_GETにユーザー入力値(ヌルバイト¥0)を 直接代入してテストしていますが、これはまずいのでしょうか? public function test_checkNullbyte() { $_GET['nullbyte'] = "abc\0xyz"; $this->object->checkNullbyte(); }
>>510 そのチェックメソッドが $_GET を参照する作りになってるならいいと思うよ。
>>511 ありがとうございます。
プロダクトコードのスーパーグローバル変数の参照部分を見直してみます。
JavaScriptを使わず、PHPだけでフォームの戻るボタンって作れるんですか !?
>>513 JavaScriptを使わずと言うことは
<input type="button" value="戻る" onclick="history.back()">
こういうのもだめってことかな?
>>513 です
>>514 さん
ISO-HTMLなのでイベントハンドラ?も使えないです。
安易だが ブラウザから返してくる、$_SERVER['HTTP_REFERER']の値を信じて、そこに送り返してあげる (セットしないブラウザもあるし、嘘も書けるので、オススメはしない) 面倒だが 自分のサイトだけで遷移しているなら、直前のURLをセッションに持たせ、それを参照して戻す (入力フォームで行ったり来たりする場合は、入力しかけのフォームの値も保持しないと行けなくなる こういう場合、相当面倒な処理を書かないと行けないと思うが、仕方ないね?)
あるいは フォームでPOSTする要領で直前のURLに遷移すると言う方法もある その場合はサーバー側で次画面に遷移する際に、 現在の場所をフォームに埋め込む形で出来る
>>513 です
>>516 さん
セッションですか !?
身につけたいので頑張ります!
>>508 $_REQUESTとかってwww-form〜専用だろ。
>>513 よくあるフォームで、入力➡確認➡完了 みたいな流れの中で 確認から入力に戻るような話?
>>513 です
>>517 さん
お返事が遅れました。
戻る際にもフォームを使うということですか。
ありがとうございます。
>>520 さん
お返事が遅れました。
>>確認から入力に戻るような話?
はい。PHPで対応したいので現在勉強中です。
始めはHTMLのtype="heidden"を採用しようと考えていたのですが、いただいたレスやセキュリティを考えた結果、セッション変数を使ってみようかと思い試行錯誤中です。
>>521 そういう遷移ならもっとシンプルに考えた方がいいんじゃね。
submit ボタンに name を設定しておけば、送信時に押されたボタンが分かるよ。
>>520 のような全部の画面は例えば form.php で処理させ、押されたボタンによって画面を出し分けるなんてのが簡単じゃないかな。
確認画面には例えば <button type="submit" name="act" value="back">戻る</button> と <button type="submit" name="act" value="send">送信</button> 置いておく感じ。
入力画面には <button type="submit" name="act" value="check">確認</button> とか。
すると form.php はこんな感じ。
$act=filter_input(INPUT_POST, 'act');
$view=入力画面;
入力値の取得とバリデーション;
if(エラー無し) {
if($act==='check') {
$view=確認画面;
}
elsif($act==='send') {
登録処理;
if(成功) {
$view=完了画面;
}
}
}
$view 表示;
セッション使ってないから、確認画面には入力値を hidden で埋めておく。
入力画面ではエラーメッセージの表示も行う感じ。
>>522 その流れだと初回表示時にバリデーションが走って必須項目未入力のエラーが出ちゃいそうだねw
説明用とは言え雑だったが、submitボタンが取れることが分かればうまいことやれるでしょ。
>>513 です
>>522 さん
そのような方法もあるんですね。
くださったレスを参考にいろいろと試行錯誤してみます。
ありがとうございました。
hiddenが危険という言葉を鵜呑みにする必要はない 用途による メールフォームの確認程度なら別にhiddenでいい そんなの改ざんする意味もなければされたところで問題ないし 最終的に受け取ったデータを通すかはPHPが判断すればいいこと
hiddenに限らずチェックはしないとね さもないと、支払もすんでいない商品を買ったことにされたり ログイン認証済んでいないのに、内部に入り込まれたりするから
質問投下です。 PHP 2chBBSをphp7.0のサーバーにアップして色々と対応させるよう書き換えましたが、これだけが分かりません。 abon.php,92行目あたり $line = preg_replace("!<a href=\"\.\./test/read\.php/$_POST[bbs]/$_POST[key]/([\d|\-]+)\" target=\"_blank\">>>([\d|\-]+)</a>!e", "'<a href=\"../test/read.php/$_POST[bbs]/$_POST[key]/'.res_num('$1',$del).'\" target=\"_blank\">>>'.res_num('$2',$del).'</a>'", $line); php7ではpreg_replaceのe修飾子が廃止されており、preg_replace_callbackを使う事に なっているようですが、ググってみても、どのように置き換えれば良いのか分かりません。 お知恵をお借りできれば助かります。よろしくお願いします。
その部分だけ見ててもすげーやべーコードなのが分かるから手直し以前にゼロから作り直した方がいいよ つか調べたら最終更新2005年(13年前)でかつこのコードとか本格的にやべーのでもっと新しくてまともなもの探さなきゃダメだよ
スーパーグローバルのチェックはしてあるんだと思うよ。流石に…w
>>528 レスありがとうございます。
これ、ちまちまと手直しして使っておりまして。
このコードは管理機能内の記事削除部分で、管理者しか使えないですし、
第三者が入れないよう認証かけてるのでセキュリティーは多分大丈夫だと思います。
取りあえず使えるようにしたいので手直し出来るのであれば教えて欲しいです。
あと、どういう点がやばいのかご教示いただければ勉強出来るので非常に助かります。
だから、$_POSTをいきなり正規表現の処理に入れてるところがヤバイって言いたいんだと思う。 bbsやkeyに悪意のあるコードを入れてられても、そのままノーチェックで処理を継続していたらヤバイ。 仮にチェック済だとしても、スーパーグローバルを使ってると頭悪そうにみえるしな。
>>527 $line = preg_replace_callback( "!<a href=\"\.\./test/read\.php/$_POST['bbs']/$_POST['key']/([\d|\-]+)\" target=\"_blank\">>>([\d|\-]+)</a>!", 'callback_hoge', $line); function callback_hoge($matches) { return "<a href=\"../test/read.php/$_POST['bbs']/$_POST['key']/" . res_num($matches[1], $del). '\" target=\"_blank\">>>' . res_num($matches[2], $del) . '</a>'; } クロージャ使って書くなら $line = preg_replace_callback( "!<a href=\"\.\./test/read\.php/$_POST['bbs']/$_POST['key']/([\d|\-]+)\" target=\"_blank\">>>([\d|\-]+)</a>!", function ($matches) { return "<a href=\"../test/read.php/$_POST['bbs']/$_POST['key']/" . res_num($matches[1], $del). '\" target=\"_blank\">>>' . res_num($matches[2], $del) . '</a>'; }, $line ); 半角スペース2個を全角スペースにして書いてるので注意 【補足】
他の人も書いてるけど
たった1行のコードから色々とヤバさが伝わってくる代物なので
他の代替手段を使うことを強くおすすめ
少なくとも $_POST[bbs] じゃなく {$_POST['bbs']}
>>530 JVNにXSSの脆弱性がある事が報告されてる
https://jvn.jp/jp/JVN48774168/index.html コードをざっと斜め読みしたけど他にも色々と駄目すぎてどこから手を入れるべきかアドバイスできないレベルで酷い
2005年のコードでもきちんと書いてればPHP7でも大体問題なく動くものだけど
このコードだと他にも色々と問題が出ると思う
>>532 訂正 $delって変数があるの見落としてた $line = preg_replace_callback( "!<a href=\"\.\./test/read\.php/$_POST['bbs']/$_POST['key']/([\d|\-]+)\" target=\"_blank\">>>([\d|\-]+)</a>!", 'callback_hoge', $line); function callback_hoge($matches) { return "<a href=\"../test/read.php/$_POST['bbs']/$_POST['key']/" . res_num($matches[1], $GLOBALS['del']). '\" target=\"_blank\">>>' . res_num($matches[2], $del) . '</a>'; } クロージャ使うなら $line = preg_replace_callback( "!<a href=\"\.\./test/read\.php/$_POST['bbs']/$_POST['key']/([\d|\-]+)\" target=\"_blank\">>>([\d|\-]+)</a>!", function ($matches) use ($del) { return "<a href=\"../test/read.php/$_POST['bbs']/$_POST['key']/" . res_num($matches[1], $del). '\" target=\"_blank\">>>' . res_num($matches[2], $del) . '</a>'; }, $line ); エラーを無視するような感じのエラー処理が適当なコードだから セキュリティもそれなりなのだろうというのが容易に想像出来るんだわ なんせPHP4時代のコードだし今ほどそのへん考慮されてないからねえ
>>529 コード内に出てくる $_POST[bbs](本当は $_POST['bbs'] だが)は
まともにチェックされてないっぽい
unlink("../$_POST[bbs]/...");
みたいなコードが散見されるから
NULLバイト攻撃も素通りだと思う
ヤバすぎ
>>532 $del を受ける use が必要じゃね
あと細かい話だが、PHPが単なる即時関数もクロージャと言うのにはちょっと違和感ある。
>>532 のケースはクロージャになるけど、クロージャってやっぱスコープが特殊なところに意義があるというか。
>>536 そうなんだ…ワロタ
クローズドな環境で割り切って使う以外はあぶないね。
OSに処理投げる形式のファイルシステム関数についてはnulバイト攻撃はPHP側で対策されてはいる
https://github.com/php/php-src/blob/master/ext/standard/file.c#L1510 https://github.com/php/php-src/blob/master/Zend/zend_API.h#L1011 が, 何れにせよ救いがたいコードで, 管理者しか使えないから問題ないという発想も正直ヤバい
この状態から
>>527 の質問のレベルで更にツギハギで直してるっていうんだからセキュリティに関しては想像もしたくないというのが正直なところ
敢えて繰り返すけど, もっと新しくてまともなもの探さなきゃダメだよ そうするのがベターなんじゃなくて, そうしなきゃダメ, SHOULDじゃなくてMUSTだよ
>>539 かなり昔に対策されたんだな
知らなかったサンクス
$_POST[bbs]でコード内を検索したら
unlink("../$_POST[bbs]/dat/$_POST[key].dat");
こんなコードが出てきたんでびっくりして脊髄反射してしまったww
ついでに正規表現パターンにPOSTデータ突っ込むのがどうしても我慢ならなかったから直してみた $line = preg_replace_callback( '!<a href="\.\./test/read\.php/(?<bbs>[^/]+)/(?<key>[^/]+)/(?<num>[\d|\-]+)" target="_blank">>>\k<num></a>!', function ($matches) use ($del) { $bbs = filter_input(INPUT_POST, 'bbs'); $key = filter_input(INPUT_POST, 'key'); if ($matches['bbs'] !== $bbs || $matches['key'] !== $key) { return $matches[0]; } return '<a href="../test/read.php/'.$bbs.'/'.$key.'/'.res_num($matches['num'], $del).'" target="_blank">>>'.res_num($matches['num'], $del).'</a>'; }, $line );
Interface用のファイルって基本的にどこに置けばいいの? それを継承するクラス群と同じディレクトリなのか、 もしくは最初から一箇所(例えばMyApp\Contract等)にまとめていいのか
>>532 手直し、ありがとうございます。
勉強させてもらいます。
件の掲示板ですが、社内LANで運用されておりまして、前任者より引き継いだものです。
設置はさらに前の前任者(退職)が行ったようです。
お察しの通り、phpのスキルはそれ程高くはありません。
移行を検討するよう進言してみます。
ありがとうございました。
社内でしかも管理者限定なら急ぐことはないか… でもコードの品質全てが問題ありそうだから、仲間内で注意喚起はした方がいいな。 JVNで周知されてるのも良い理由になると思う。
>>544 >>532 のコードは間違ってるので使うなら
>>534 か
>>542 で
お節介ながら
今はSlackみたいな便利なものが色々とあるので
そもそも掲示板を使う必要はあるのか?ってところから検討した方がいいのではと
メールヘッダーインジェクションって現バージョンのPHPではどうなんですか? mail()やmb_send_mail()で対策されたとネット上で見かけたのですが(´・ω・`)
>>547 英語版のPHPマニュアルの改変履歴追ってみると7.2.0での対応で一段落って感じだけど
日本語版には書かれてないな
NULLバイトや改行コードを悪用したインジェクションなら
mail()やmb_send_mail()に渡すデータをバリデーションしてたら7.2.0未満でも問題ない筈だが
例外を投げるとき、Exceptionを投げるのは良くないのでしょうか?
Exception は、すべての例外の基底クラスだからユーザーが投げるのは
良くないという記事を以前に何かで見たので気になります。
ただ、PHPマニュアルでは、普通にExceptionを投げる例が載ってます。
http://php.net/manual/ja/language.exceptions.php <?php
function inverse($x) {
if (!$x) {
throw new Exception('ゼロによる除算。');
}
return 1/$x;
}
要するにcatchしたいときにExceptionやらThrowableとするしかなくて, 少なくとも例外は全部漏れなく捕捉してしまうのが問題なわけだ
>>551 なるほど。例外を個別に場合分けして処理したいときに困るということですね。
ありがとうございます。疑問が晴れました。
最近話題になってたfilter_inputみたいに$_POSTを取得する関数って他にもあるんですか?
http://php.net/manual/ja/ref.filter.php >>553 それは $_POST を取ってるわけじゃない。
POSTされたデータを取る手段として $_POST と filter_input がある。
他の標準的な手段として用意されてるものは無いと思うけど、リクエストを自分で処理するという手段はある。
>>554 詳しく教えてくださりありがとうございます。
勉強になりました。
FILTER_SANITIZE_FULL_SPECIAL_CHARS? htmlspecialchars? あばばばば(´・ω・`)
前者は使わなくてもいい。 後者は画面に出すときに必須
mail関数で文字化けするのはどういった状況なんだろうか
エンコード関連の設定が間違えているって書いても、 そのくらいは知っているって言われそうだしなあ
PHPを初めて間もないので知らなかったです(´・ω・`) 文字化けが自分で作った環境が原因でおこるのか、 ユーザーの環境によっておこるのか、 それすらも現在進行形で勉強中です。
今時はメールもutf-8にしちゃう方が良い? サイズはともかく。
JIS だと扱えない文字が結構あって面倒なんだよね。 氏名を埋め込もうとするだけでもすぐ問題が起こる。 個人的には結構保守的なんで極力 JIS にしたいが、utf8 も仕方ないかなと思うこともある。
>>559 件名が化けてるの?
本文が化けてるの?
>>559 >>561 です
>>564 さん
どちらも化けてないです。
ただ文字化けする状況がよくわからなかっただけです。
自分の環境を全てutf8に統一すれば化けないですかね(´・ω・`)
どちらかと言えば、送信したサーバー側にあると思うよ。 ヘッダをMIMEエンコードしてないとか、 本文をJISと宣言しておいてSJISとか良く見る。 作る側が理解してない。 それを受信すらメールソフトが何とか正しく表示しようと努力して、 それでもダメだった場合に化ける。 あと稀に、ソースからしてそもそも化けてるという バカが書いたメールもあるw
>>566 たまに磁場消したメール受けとる
解読するのを楽しみにしたりする
>>565 です
>>566 さん
こちらがしっかりと設定すれば大丈夫そうですね。
後は山のように試行錯誤を積み重ねていきたいと思います(´・ω・`)
今はmail($to・・・)の$toに自分のメールアドレスをどのようにして入れるか考えてます。
define関数で定義した方が安全?なんでしょうか。
勉強がんばります。
>>570 メンテナンス性を考慮すれば定数で定義しとく方が好ましい
”ハードコーディング”でググるんだ
あとPHP5.3未満だという理由でもない限りは
定数の定義はdefine()じゃなくconstでいい
define()にしかできない事をやる時だけdefine()を使う
…というかdefine()にしかできないような定数の定義の仕方は
しない方がいいというか
>>570 confg.phpとかconfig.iniとか作って、
設定値を書きまくるファイル用意するといいよ。
定数名は大文字にしておけば目立つね。
>>570 です
>>571 さん
constでも定義できるんですね。
他にも詳しいアドバイスありがとうございます。
>>572 さん
設定値を管理するファイルを作る、メモしました。
定数名は大文字がマナー?なんですかね。
お二方、アドバイスありがとうございます。
ずっと画面と見つめ合ってたので頭が痛いです。
体調管理に気を付けます。
ありがとうございました。
>>570 の$toって直書きすると外部から参照されたりするん?
そこらへん うちも勉強不足だわ
外部からってどういう意味? 宛先見せないと配達できないでしょ? そういうことじゃなくて?
web公開ディレクトリに置かないのが基本なんだよ。 hdocs/index.html lib/php/config.ini
共用のレンタルサーバーだと、 Permissionを0604にするのもありだな。 最初の0は気にしない。 次の6は自分の読み書き権限 次の0は同居してるユーザーに権限剥奪 最後の4はApacheに読み取り権限
>>577 釣りかな?
それApacheにかぎらず誰でもオッケーって意味だよ
ほとんどの共用レンタルサーバーは、
webユーザーは同一グループに所属するから、
xx0xで引っ掛けて拒否させるんだよ。
最後の4は付けないとApacheが読めない。
https://www.xserver.ne.jp/manual/man_server_permission.php グループ設計がどうなってるかとか、
PHPの実行ユーザーが誰になるかとか、
事前に確認しないといけないな。
suEXEC、FastCGIなんかで変わってくる場合もあるし。
ど素人です 質問させてください cakephp3のwebroot以下にある.htaccessで、mod_rewriteの括弧外にrewritecondやrewriteruleが書かれているものを人様のサイトで拝見しました 括弧外に置かれても、機能するものなのでしょうか
<IfModule mod_rewrite.c> もしかしてこれ?
そうです
すみません、
>>583 は携帯から書き込んでいたので正確ではありませんでした
質問するにしても良くなかったですね
===================
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$
https://% {HTTP_HOST}%{REQUEST_URI} [R=301,L]
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
</IfModule>
===================
このようなものなのですが
それは、そのモジュールが有効化されていたら設定するって意味で、 何のモジュールのディレクティブなのか明確になる以外にメリットない。 だから書かない方が良い。 ifを書かなければ、モジュールが無効なら即500エラーで設定ミスに気付ける。 モジュールが無効なのにエラーにならず、 設定したつもりでいる方が危ないからね。
>>581 怖い(´・ω・`)
>>582 ありがとう
>>586 返答ありがとうございます
リファレンスにしていたものが、全てディレクティブを括弧内に書いていたのと
cakephpのインストール直後のプロジェクトに入っていた.htaccessでも
ディレクティブが<ifmodule>で囲まれていたので、
基本的には囲う必要があり、外に出る方がおかしいと思い込みがありました
まさにおっしゃられていた通り、apache2.confを見てみたら
Loadmoduleでmod_rewriteを有効化していたつもりで、実際にはコメントアウトされていたのですが
それにも気付いていませんでした
どうもありがとうございます
読み返してたんだけど
>>557 の前者って使うことないものなの?
>>587 ネタにマジレスしとくと
dieの発音は「ディエ」じゃなく「ダイ」だし
exitとdieは等価なので、エラーログに残るとかは嘘
exitの方が一般的だとは思うが好きな方を使えばOK
あくまで予想だが、die()はperl言語出身者に配慮して作ったんじゃなかろうか
height align allow deny web系に関わってるのにこういう単語の読み方がおかしな人の言う事は疑ってかかった方がいいという経験則
>>590 すまん。perlの関数と勘違いしてた…
PHPにおいてはexitもdieも同じらしい。
dieの引数も標準出力されたw
プログラムは読み手に意図を伝えた方が良い場合もあるから、
exit(1)よりdieの方が致命的エラーなのかなと思わせることはできるかな。
しかし標準出力されるんじゃあ使えないな。
嘘こいてすまん。
>>591 ヘイト
アリグン
?
デニー
allowを読み違えてる人は見たことない…
あとは、hrefをハーフ、widthをウィドスは稀に。
ウィドスはまだネイティブに近い方かな?
>>591 ハイト
アライン
アラウ
ディナイ
どれも高校入試の時の発音問題頻出単語(要するに中学レベルの単語)だったような遠い20年以上前の記憶
うんざりする程しつこく教えてくれた当時の英語担任に感謝しないといかん
アラウか… 何かそこだけ妙にネイティブだな。 アローですまん…
本来ネイティブの発音に合わせて読むべきなんだろうけど、 アラウやディナイと発音しても、日本人相手だと通じなかったりする
アラウはちょっとなあ… それ言い出すとonlyはオウンリイだし。 日頃はカタカナ英語でいいです。
ネタなのかマジなのかわからなくなってきたけど正解はもちろん
>>594 allow,denyをアローデニーと読んでいた自称サーバー管理者が設定したウンコみたいなサーバーに泣かされて以来トラウマです
そして今なおallow,denyという単語を目にするという事はそれ即ち、去年末にサポートが終わったApache2.2系をまだ使い続けてるというトラウマの再来になる可能性がががが
ウォーニング まぁ会社によって方言みたいなのはあるよね 内心そうじゃないだろ…(ため息)と思いつつ相手に合わせる事も大事
今の所全問正解っぽくて安心した falseをファルスと読む人を見る度に パルスのファルシのルシがコクーンでパージを思い出す
アリグンとかデニーとかいってるならヘイグヒトぐらいにしないと
あんまりこだわると意識高い系とか嫌味を言われそうだし、 まあわかればいいやね… ここじゃないかもだかど、どっかのPHPスレで エチョーと書いたらウケたよ。
allowというかau音はアゥからオゥに寄った側に聞こえるからカタカナ英語的にはアロゥはアリかなと思う arrowと区別したいときはアラゥと言うべきだと思うけど デニーとかアリグンは流石にねーなw
ini → イニ? アイエヌアイ? array → アレイ? アライ? あと正直str系の関数が読めない strlen strpos当たりはわかるけど stripos strrpos strripos あたり
array:アレイ ini:initializationの略 stripos:string case-insensitive postionの略だと勝手に思ってる strrpos:string reverse positionの略だと勝手に思ってる かっこよく読みたいなら元の単語を略さずに読めばいいんだろうが 実用的にはアルファベットをそのまま読めばいいじゃなかろうか
if イフ then ゼン? else エルス? true トゥルー? false フォールス? try トライ? throw スロー? catch キャッチ?
すみません、
>>583 で質問したのですが、
再度質問してよろしいでしょうか
サーバのドキュメントルートに置いた
CakePHPプロジェクトフォルダ(仮にCakeとします)
直下の.htaccessを消去しても
http:// {hostIP}/cake/
をアドレスバーに打ち込むと、なぜか
https:// {hostIP}/cake/webroot/
にリダイレクトされる現象が起きています
.htaccess以外にリダイレクトが起きる原因として考えられるものがあれば
教えていただきたくお願い申し上げます
なお、サーバはapache2.4.10、OSはDebian8.0です
routes.phpとかは? アプリのリダイレクトなのか、 apacheのリダイレクトなのか切り分けていくと良いのでは。
include('/path/file.txt');
include('
http://www.example.com/path/file.txt' );
って何か違いはありますか?
>include('/path/file.txt'); / から始まっているから、何かからの絶対パスかな? プロジェクトルートか、公開サイトのルートからの絶対パスかな?
上のは言ってみればfile://になるんじゃないの? 違う?
公式のmail()とmb_send_mail()のページを見ていたのですが、 mail()のsubjectは表題、messageはメッセージ、 mb_send_mail()のsubjectは件名、messageは本文となっていました。 これは何かが違うということでしょうか。 くだらない質問と思いますが、よろしくお願いします。
全く同じ意味ですが異なります この事に気をつけて厳密に取捨選択し、 どっちでもいいから適当に使いましょう
mailはエンコードしてくれないから自分でしてから呼び出す。 mbはエンコードしてくれる。 というか、ググれよ!
どっちの関数も直接使うには勝手が悪いので、さっさと基礎理解してライブラリ使うようにしましょう。
<form method="get" でsubmitした場合、 $_GETを使うのが普通だと思うのですが $_POSTでも値が取れるのですが、そういうもんですか?
普通だけど普通じゃなくなって来たから、filter_input使う。 このスレの上の方にも出てる。
>>619 それちゃんとGETメソッドで送ってる?
GETとPOSTでは受け渡し方法が違うから
ちゃんとやっていればPOSTでは受けとれないはず
>>621 WordPressなんですが、
form タグを埋め込んでbuttonクリックでsubmitしているので間違は無いと思います。
でも何故か$_GETでも$_POSTも値が取れるんです。
methodをgetでサブミットしてるなら HTTPプロトコルではcontent bodyの部分は空になる そういう仕様だからな つまり通常postで取得できる部分はからっぽ methodをpostでサブミットしてるなら そういう状況はHTTPプロトコルでも十分にありえる uriにurlエンコードされた文字列が含まれる状況でpostしたケースならありえるということになる ちなみにオレはスクリプトの変数にその値がどう格納されるかは知らない 質問してるヤツは getでサブミットしてんのになんでそんなことがおきんの? というのが質問の主旨と理解した 低学歴知恵遅れがその質問をどう解釈したかは知らない
>>619 サーバーのログって見ることは出来ない?
リクエストがどういうメソッドでやり取りされたか分かると思うけど
>>624 冗談にムキになって… 低学歴知恵遅れとかw
主旨についてはわかってて書いてんの。
それが5chというところだから。
はい低学歴知恵遅れ図星 ごまかそうとしても もうバレてるからな 分かりやすいわ。。。
冗談は冗談が通じる相手にしないと この質問者はPOSTとGETについて理解できていないんだから 冗談だとは受けとってないと思うぞ
冗談とは言え、とりあえずパケットキャプチャしてみたら?に行き着いて欲しかったんだけどな。 その後、フレームワークなりの変数の検査するとか。 やり方を切り分けて絞り込んでいかないといけない。
PHPを始めたのですが分からないことがあるので教えてください。
https://qiita.com/mpyw/items/2f9955db1c02eeef43ea 上記ウェブサイトに次のコードがあるのですが、配列?を使用する理由を教えてください。
if (!isset($_POST['email'])) {
$errors[] = 'Eメールアドレスが送信されていません';
} elseif ($_POST['email'] === '') {
$errors[] = 'Eメールアドレスが入力されていません';
}
よろしくお願いします。
>>631 この例文の中では特に意味はない。post したページに戻る際、エラーをまとめて送る時に使う。
>>632 このような使い方もあるんですね。
教えてくださり、ありがとうございました。
HTMLとPHPを使ってメールを送信するため、次のように書いたのですが、良いか悪いか判断ができません。
右も左も分からないため、どのようなことでも構いませんのでアドバイスをください。
メールは【入力】→【確認】→【送信】の流れで送信されます。
どうか、よろしくお願いします。
【input.php】
https://ideone.com/cEGHAA ↓
【check.php】
https://ideone.com/R9GueN ↓
【thanks.php】
https://ideone.com/R2mR1b form.php confirm.php send.php こうすると良いと思う
>>635 アドバイスありがとうございます。
辞書を引いたら納得しました。
さっそく反映したいと思います。
ネタにマジレスしてるんで、仕方ないからチラ見してみた。 このスレのダメな例の集大成みたいだな。 受け取った値の長さに制限を掛けて、巨大データを受け入れないようにする。 HTML側でもmaxlengthやtype="email"やrequiredを使うと気休めになるかも。 PHP側でも長さをチェックする。 filter_inputの使い方が違う。 受け取った価をあえて$_SESSIONに入れてどうする? それは使わずに$subjectとかに代入する。 mail関数に入れるデータはエンコードするか、mb_send_mailを使う。 あとは動いてるならいいんじゃない?
勉強のためならいいけどガチでサービスに導入とかはしない方がいいと思うよ 既存のサービス使った方が絶対に安全
class内のプロパティに関数って指定できないでしょうか? class Test { public $date = date("Y-m-d"); } というイメージです。これを記述しても Parse error: syntax error, unexpected '(', expecting ',' or ';' というエラーが出るので無理だと思っているのですが、 できる方法があれば教えてください。
やり方はいろいろあるが、一般的にはコンストラクタの中で代入するんじゃないかな
やり方はいろいろあるが、一般的にはコンストラクタの中で代入するんじゃないかな
>>637 アドバイスありがとうございます。
次を課題に学習を進めたいと思います。
・HTMLとPHPで値の長さに制限を掛ける
・filter_inputの使い方を理解する
mail関数に関してもmb_send_mail関数と合わせて考え直します。
セッション変数については入力されたデータを持ちまわる体で使用しようと考えているのですが、type="hidden"の方が良いのでしょうか。
今は自身の理解が不足しているので、もう一度最初から取り組みます。
アドバイスありがとうございました。
>>638 アドバイスありがとうございます。
やはり既存のサービスの方が安全ですか。
今は自身のために勉強したいと思います。
アドバイスありがとうございました。
このくらいのフォームなら hidden の方がいいんじゃね。 セッションでなんかメリットある?
>>643 参考URLありがとうございます。
hiddenとセッションの使い分けを勉強します。
>>646 う、うん。
でも一番はそこじゃないんだな。
スーパーグローバル変数を書き換えるべきではないのに、
そらをしてしまっているところね。
そもそもスーパーグローバルを使わないためのfilter_inputだから。
最初は誰でもそんなもんだから頑張ってね。
>>647 さっそく勘違いしてしまいました。
アドバイスありがとうございます。
そのURLを見たけど、tarファイルを展開してLinuxでコンパイルしてるよね。 この時点でWindowsはまったく該当しないので見てもわかるわけない。 Windows用のコンパイル済みバイナリをインストールするのが正解かと。 それか、そのファイルをWindowsで自前コンパイルするか。
ありがとうございます。 いくつか調べてlibpuzzleがC言語で作られているはわかりました。 Windowsだとsoファイルではなくdllファイルで動かすみたいだから libpuzzle.cをコンパイルしてdllにする、という感じなのでしょうか?
C言語は…、ちょっというかさっぱりわからないですね…。
GitHubでlibpuzzleの解凍されたフォルダが有りました。
https://github.com/jedisct1/libpuzzle もし参考になれば
>>647 そこで言ってるスーパーグローバルの書き換えって $_SESSION のこと?
>>654 そう。
言われてハッとしたんだが、もしかして俺すげー嘘ついてる?
フレームワーク無しなら$_SESSIONに代入せざるを得ないか?
何かもう忘れたわ。
適当な記憶でたまに嘘ぶっこくから少し自重する。
面白い議論だと思ってたんだけど できれば続けてくださいな セッションは使用禁止にすべきかどうかまで
>>655 うん、$_SESSION はこれを直接触る以外のアクセス方法は無いと思う。
そしてセッションのクリアとか考えるのも面倒なので、今回のケースだと hidden の方が手軽だと思う。
libpuzzleはインストールが困難と判断したので、 他のものを調べたところ、Perceptual Hashが良さそうだったので変更しました。 コンポーザーをダンロードして、インストールはできました。 ですが、実行すると「Uncaught Error: Class 'Jenssegers\ImageHash\ImageHash' not found」といったように認識されません。 Windows7のXAMPPだとuseの書き方が違うのでしょうか? ソースは以下の通りです。 use Jenssegers\ImageHash\ImageHash; use Jenssegers\ImageHash\Implementations\DifferenceHash; $hasher = new ImageHash(new DifferenceHash()); $hash = $hasher->hash('path/to/image.jpg'); echo $hash; // or echo $hash->toHex();
ちゃんとautoload.phpをrequireしてるか?
>>648 >>657 だって! 本当に申し訳ないです。
投稿フォームは、確認画面なくすと session 使う必要がなくて、スマートな実装になるよ。 そもそも確認が必要な内容かどうか検討してみると良いです。 確認が必須なら、モーダルで一旦表示させて投稿させると UX も向上して happy。 ただ、画面はちょっとややこしくなるけどねぇ。。。
>>660 何それ…
やってない
帰ったらやってみる
>>634 のfilter_inputって使い方間違ってるん?(´・ω・`)
美しさはともかく、間違ってはいない。 勘違いしていたのは俺… 申し訳ないです。
提唱者が逃げ出したから、 こういう時にどう使ったら良いか 教えてくれない
ユーザー入力を画面上に表示する場合、どんな時でもhtmlspecialchars関数を使った方がいいんですか !?
>>667 個人的にはここの説明が納得しやすかった
https://qiita.com/mpyw/items/19e6fed835ccdbcb0d6d 画面表示で Content-Type: text/plain の時は、当然だけど必要無い。
text/html な中で、text/plain はちょっと思いつかなかった。
だれかフォローよろしくw
考えられるパターンとしては 1.入力値の検証はせずそのまま出力する 2.入力値の検証はせずhtmlspecialcharsを使う 3.入力値の検証→問題はないのでそのまま出力 4.入力値の検証→問題なのでhtmlspecialcharsを使う 5.入力値の検証→問題はないがhtmlspecialcharsを使う 6.入力値を出力前に無害化してそのまま出力 1は当然やっちゃだめ 6は元の入力値と異なる可能性が生まれるので使うなら重要でない箇所限定(非推奨) 5は冗長だが5が一番おすすめ
phpの質問じゃないかもしれないんだけど URLから指定のディレクトリにアクセスした時に ファイル名が何だろうと指定のファイルを参照させることって出来ますか? hoge.com/rand/test.txt hoge.com/rand/aaa.jpg randディレクトリにアクセスしたら ファイルの有無に関わらず hoge.com/rand/index.phpを参照させて test.txtやaaa.jpgのURL文字列に応じて phpが振る舞いを変えてコンテンツを表示させたいです そんなこと可能でしょうか?
要するに hoge.com/rand/aaa.jpg を見てるつもりで hoge.com/rand/index.php?q=aaa.jpg で内部的に処理して返したいってことです
file(”aaa.jpg”) で表示できたような
print file($_GET[q]) だったかな 忘れた
>>671 mod_rewriteを使って、
RewriteCond %{REQUEST_FILENAME} hoge.com/rand/(.*)$
RewriteRule ^hoge.com/rand/(.*)$ %1/%2/index.php?q=$1
こんな感じでリクエストを書き直す?
うまく行くかちょっと自信ない
PHPの処理はHTMLの外で行い、結果だけをHTMLの中に表示する方法が良いんですか?(´・ω・`)
>>676 その方がいいと思うよ。
HTMLを修正する理由と処理を修正する理由は大抵違うから、それぞれ分けておくと都合がいいと思う。
分業の面でもいいし、処理の見通しも良くなる。
ただそう作るなら、表示(見た目)のためのコードは処理側から排除するのがいいと思う。
エスケープはもちろん、例えばマイナスの数値を表示するのに▲を付ける仕様だったとして、それを行うコードはHTML側に実装する感じ。
処理側で▲付きの文字列を作るようなことするとカオスになっていく。
>>676 そしてPHPはHTMLを分けるというのが非常に簡単にできるから、やらなくちゃ損くらいに思った方がいい。
<?php
:
いろいろ処理;
:
include 'gamen.html';
?>
みたいに include するだけで表示されるんだから。
実際には gamen.html にはわずかなPHPコードも入る純粋な HTML ではないから拡張子を .html とするよりは、.php なり .tpl(テンプレート)なりそれっぽいのにしておくといいと思う。
案外 .php にしておくと、ブラウザからそれを直接見てもPHPのコードは直接見えないから手軽な安全策かも。
>>677 >>678 分けた方が管理しやすいですか(゜-゜)
ありがとうございました。
今回乗っ取りが可能な脆弱性が発見されましたが、その脆弱性を試したいです。 どうすればいいのでしょうか?
Bug #76582が原因らしいからバグレポート読んでみたら? 再現コードも書いてるよ まぁ単にXSSが可能だったってだけでそれ以上でもそれ以下でもないが
laravelを始めようと思うのですがrailsと比べて何が良くて何が悪いのか聞きたいです 僕自身railsはチュートリアルやったくらいしか知りません
set_file_buffer (stream_set_write_buffer)が動作しないということが2003年ごろから言われているみたいですが
今さっき検証してみたところやはり-1が返ってきて動作していないようです
何故こんな関数が未だに存在しているのか、わかる方よろしくお願いします
http://jp2.php.net/stream_set_write_buffer POSTされた値を最初に変数に代入してから検証するのと、 検証してから変数に代入するのとでは安全性に違いはありますか? 変な質問で申し訳ない(´・ω・`)
一概には言えないが、値の検証はその値を使う直前にやるのが一番良い 検証の後に不用意に値が書き換わってたら検証の意味がない
>>685 いただいたレスを参考に考えた結果、値を使う直前に検証することにしました。
アドバイスありがとうございました。
>>658 です。
お返事遅くなってしまい申し訳ないです。
>>660 うまくいきました。
XAMPPだと相対パスだとうまく行かなかったのですが、
絶対パスだとうまく行きました。
どうもありがとうございます。
if($A === $B){ $A; }else{ $B; } と if($A !== $B){ $B; }else{ $A; } って どっちが良いですか !? って聞かれても俺にはわかんねーよ(´・ω・`) というグチ
>>688 !== より === の方がタイプする労力が小さいから前者
結果は同じでもどちらに主軸をおくかによってニュアンスが変わる 例えばコンサート会場でチケットを持っている人は通し持ってない人は通さない場合 チケットを持っている人を通したいに主軸を置くと普通のスタッフを連想するが チケットを持ってない人を通さないに主軸を置くと警備員のようなもっとお硬い物を連想する $A===$Bを比較したいのか$A!==$Bを比較したいのか 自分が何をやりたいのかどこに主軸をおきたいのか考えれば自ずと答えは出るでしょう
thenが通常処理、elseが異常(エラー)処理ってイメージ 通常処理がn種類(複数)あるって感じな場合は、二択だったとしてもswitchにしてる
$var = getA(); if (!$var) { $var = getB(); } if (!$var) { $var = getC(); } if (!$var) { $var = getD(); } if (!$var) { return false; } return $var; こういうコードをもっとスッキリさせる書き方ってないですか?
get($ident)的な関数作って $var=false;で初期化して ["A", "B", "C", "D"]をぶん回して見つかれば$var上書きしてbreak
短絡評価でbooleanが返ってくる言語だからなぁ return getA() ?? getB() ?? getC() ?? getD() ?? false; でnullが返ってくると順次後ろに落ちていくようには出来る falseが返ってくると打ち切られて結果もfalseになる
みなさんレスありがとうございます 実際はもっとメソッド名が長く、引数が複数あり、一つ一つが若干重い処理なので 現状が一番スマートのような気がしてきました
Cなら関数ポインタを配列にツッコんでぶん回す 危険かどうかは触れない
メソッドに応じて引数も可変ならcall_user_func_array()使えばいいだけじゃない? そんな大層な話しか?30秒で書けるがw function hoge() { $methodArr = [ 'A' => ['a', 'b'], 'B' => [], 'C' => ['c', 'd'], ]; foreach ($methodArr as $method => $params) { if ($result = call_user_func_array($method, $params)) { return $result; } } return false; }
行数的には
>>693 と大差ないが
$methodArrのところを定数にでもしておけば
動作に変更が入ってもそこの定義を変えるだけで済むわな
さすがに
>>693 はないわ
見ただけで頭がクラクラするw
>>688 みたいに
if(){
}else{
}
と詰めて書く人ってPSRなんか読んだ事ないんだろうな
if () {
} else {
}
と書きなさい
>>700 >>693 の方がシンプルでスッキリしてて速くて分かりやすいコードだと思うよ。
>>699 の利点てなに?
メソッドや引数が減ったり増えたり順序が変わったりした時に 699なら”コード”を触らず”定義”の修正だけで済むが 693だと”コード自体”を修正する必要があるな
call_user_func_arrayなんてあったんだね。 じゃあこれ一択だわ。 理由は>703
>>703 hoge が呼び出す関数達の引数は hoge に渡された引数だったり別の変数だったりを含むんじゃないの。
それを事前に定義するって?
仮に定義できたとして、そんな内部のロジックに直結した定義を修正するのはコードを修正するのに加えてそんなに気安いことなの?
>>693 のコードを大体そのまま hoge.conf にでも書いて、
function hoge()
{
if(!@include_once 'hoge.conf') {
retur false;
}
return $var;
}
とでもする方がまだマシなんじゃね。
>>703 >>700 に同じ事書いたんだけどなw
>>704 だよね
>>705 頭固いねw
理解できないならもういいわw
>>706 定義と称してロジックを別の形で書いてるなら、ロジックをそのまま書けばいいだろう?
んで引数に変数はどうやって渡すの?
これは絶対にこうだって話でも何でもなく、おおよそこれまでの経験に基づく好みの方がデカいと思うけど。
>>693 の実際のコードや運用保守まで知り得ないから、絶対こうだと第三者が結論づけるのはナンセンスだと思う。
自分は実際にこのようなケース(Cで)楽にメンテできた実績があるからこっちを選ぶけど、
こういう方法もあるよってディスカッションならどんどんやればいい。
今更include_onceなんかを使ってるしむしろ693より悪化してるという 699みたいに動作定義を配列変数にしておけばその中に更に変数やメソッドの返り値を持たせることだってできるだろうに
>>708 うん、方法としては知っていていいものだからどんどん上げればいいと思うが、
>>700 この言い草だからな。
>>709 その変数やメソッドの返り値を定義した具体例を挙げてみてよ。
>>710 はたから見たらお前さんも同じようなもんだし喧嘩腰なのはむしろお前さんの方に見えるが
>>712 >>699 は $methodArr が hoge のスコープに居るからパラメタに変数を取ってもシンプルに定義できるけど、それを定義として別ファイルに浮かせるという話について、どうやって?と聞いてるだけだぞ。
おまえは具体的な実装イメージ湧いてる?
if ( ( string ) filter_input ( INPUT_POST , 'hoge' ) === '' ) { ・・・ } ↑だと入力欄が空の時に〜となりますが、 半角・全角のスペースが1つだけ入力されたの時も含めたい場合は どのように書くのが良いですか? どなたか ご教授ください(´・ω・`)
>>714 filter_input のマニュアル見てみ。
>>714 本当に半角スペースと全角スペースだけでいいの?
タブ"\t"とか改行コード"\rや\n"とかはOKなの?(たぶん駄目だよね)
本当に1つだけでいいの?
半角スペースが100個連続しているのはOKなの?(たぶん駄目だよね)
ってことで
UTF-8ならpreg_match()にuのパターン修飾子付けるのが楽
$hoge = (string) filter_input(INPUT_POST, 'hoge');
if ($hoge === '' || preg_match('/\A\s++\z/u', $hoge)) { }
もっと厳密にやりたいなら、弾きたい文字を文字プロパティで表現すればいい
例えば [\p{Z}\p{Cc}]++ みたいに
で、更に言えばさw 'あいうえお'の前後に空白文字が1000個あるのはOKなの?って話にもなってくるんで ちょいと考え方と変えて $hoge = preg_replace('/\A\s++|\s++\z/u', '', $hoge); こんな感じで先に文字列の前後の空白文字を取り除いてから if ($hoge === '') { } とするやり方なんかもあるな
preg_match('/\A\s*+\z/u', $hoge) じゃない理由は何かあるのん
>>718 空の時点で評価して正規表現に通さない方がいいから
だから本当に質問の通りでいいなら
if ($hoge === '' || $hoge === ' ' || $hoge === ' ')
で別にいいw
あと+じゃなく++と書いてる理由はReDoSでググればいいんじゃない?
Stack Exchange(違ったかもw)が
++じゃなく+使ってたせいでサービスダウンしたのはわりと有名
>>715 アドバイスありがとうございます。
filter_inputのマニュアルを確認しましたが、自分では解決できませんでした。
引き続き学習を続けます。
>>716 アドバイスありがとうございます。
ご指摘の通り課題が山積みです。
いただいたレスを参考にします。
お二方、ありがとうございました。
>>720 filter として FILTER_VALIDATE_REGEXP つまり正規表現が使える。
FILTER_CALLBACK つまり、ユーザー定義の関数をコールしてデータをフィルタリングしても良い。
if('aaa'==' aaa')//true となることを発見したんですが、前方の空白は無視されるんですか? これは正しい使い方でいいのですか? よろしくお願いします
>>720 です
>>721 さん
詳しく教えてくださり、ありがとうございます。
いただいたアドバイスを生かせるよう精進します。
>>724 すみません、間違えました
アルファベットaaaじゃなくて、数字1234でした
var_dump('1234'==' 1234');//bool(true)
メール送信の際に確認と検証目的で画面上に表示させる時、気をつけるべきことって どのくらいあるものなのだろうか(´・ω・`) htmlspecialchars() ? 未入力の確認 ? (´ρ`)
>>726 単に表示するだけならそのくらいだろうけど、チェックも含むならメールのエンコーディングで使えない文字が含まれてないかとかかな。
>>725 http://php.net/manual/ja/language.operators.comparison.php >整数値を文字列と比較したり、比較に数値形式の文字が含まれる場合は、文字列が 数値に変換され、 数値としての比較を行います。
要は文字列'1234'が数値形式(int型)なので↓のように比較される。
(int)'1234' == (int)' 1234'
> === あるいは !== による比較では型変換は発生しません。 この場合は値だけでなく型も比較します。
なのでこういう自動キャストが困るのであれば===で比較すること。
すまない。 微妙にスレチなのだが助けてほしい。 端的に言うとXAMPPの処理中にブルー画面になり、MySQLが壊れて動かくなった。 コントロール画面でStartを押しても一瞬動いてすぐ止まる。 調べてみたところ復旧方法がない。 XAMPPを外付けに移し、再インストールはうまくできた。 問題はSQLのデータをどのように移し替えればいいのかわからない。 エクスポートはできておらず、移行の仕方がわからない。 mysqlのdataファイルにデータベースの情報があるのはわかったが、 ここままファイル移動させただけでは動かないのです。 移行方法をご存知の方いらっしゃいましたらお教えください。
・echo htmlspecialchars($var = (string)filter_input(INPUT_POST,'var',ENT_QUOTES,'UTF-8')); ・echo $var = (string)filter_input(INPUT_POST,'var',FILTER_SANITIZE_FULL_SPECIAL_CHARS) どっちが危険だと思う?
>>731 そんな汚いコード、読むまでもなく危険。
>>730 xamppのどこかにログ出力されてるかは知らないけど、
まずエラーログを見ないことには。
windowsのイベントビューアとかにもなんか書いてる可能性がある。
>>733 #1932 - Table 'rssurl.imglist' doesn't exist in engine
(訳)#1932 - テーブル 'rssurl.imglist'はエンジンに存在しません
というエラーが出ます。
phpMyAdminのデータベースのページにはrssurlがあるのですが、
テーブルのimglistをクリックすると上記のエラーが出ます。
「ibdata1」「ib_logfile0」「ib_logfile1」を書き直せばいいというとこまではわかったのですが、
やり方までは分かりませんでした。
古いファイルもdataファイル内のものしかありません。
>>731 前者だな
理由は↓が語ってくれるだろう
ワッチョイ 9fd0-ZVm4 そろそろ金払って誰かに個人レッスンしてもらいなさい
>>734 もうそこまで来たらバックアップ使って一から復旧した方が速い
まさかバックアップ取ってないとかないと思うが、もしそうなら諦めロン
次からは定期的に数世代分はバックアップ取るようにしなよ
>>737 FRMファイルとIBDファイルは残っています。
これらのファイルから復元はできないでしょうか?
>>736 ここの方々の方が信頼できるから仕方ないです(´・ω・`)
いつも教えてくれて ありがとうございます。
>>738 それが壊れる前のファイルなら単純に差し替えれば動くだろう
バックアップあるならそこから引っ張ってくればいい
それが壊れたあとのファイルならそのファイル自体が壊れてるのだからあったところで意味がない
>>740 ありがとうございます。
頑張ってみます。
>>741 ファイルは壊れていないようなので
このまま使ってみようと思います。
>>736 横から失礼、個人レッスンってどこで頼むのがいい?
テックアカデミーや侍でもできるのか?とか、
クラウドワークスやココナラで単発でお願いするのがいいかと迷っている
会社の先輩から受け継いだコードに ini_set("allow_url_fopen", 1); って有るのですが、何ですか? PHP初めて三日目なので何も分かりません。
質問です 将来的にこういうアプリを作りたいと思っています まずゲーム部分をunityで作って例えばオンラインランク的なネットワーク機能はphpで作るという物です ここで疑問なのですがphpはサーバーとしてネットに公開するという事になりますよね? 俺はそのunityで作ったアプリからしかそのphpサーバーにアクセスして欲しくありません でもネットに公開してる時点で普通にブラウザからでもアクセスできてしまうと思うのですが こういう問題について世間の開発者の人たちはどういうやり方を用いているのでしょうか?
>>746 Webサーバー上でPHPを動かそうとしてる?
それなら、通常のポートと違うポートを使用して
そのポートを外部から遮断しておけば良いのでは
>>746 > unityで作ったアプリからしかそのphpサーバーにアクセスして欲しくありません
これと
> でもネットに公開してる時点で普通にブラウザからでもアクセスできてしまうと思う
これは全然別のレベル。
要件としては前者だと思うけど、各社のノウハウになるんじゃないかなぁ。
簡易的なものだと、header 触るぐらい。
>>747 レンタルしてサーバーを使おうと思ってます
外部から遮断してアプリからアクセスできるんですか?
>>748 個人で作ってるので簡易的なものしか作れません
ヘッダーの設定ですね
覚えておきます
プログラミングはphp mysqlを齧った初心者です。
下記のようなユーザー参加型ランキングサイトを作りたいのですが
https://www.animeranking.net/index.php ユーザーにデータベースにある作品でランキングを作成してもらい
他ユーザーの投票によりランキングを変動/変動しない(ユーザーの任意)
またユーザー登録ログインシステムも作りたいのですが
html css php mysqlで事足りるでしょうか?
ご教授お願いします。
>>749 レンタルサーバーなら、
アクセス元のIPアドレスを取得して
自ホストからのリクエストでなければ
応答せずそのまま終了すれば良いよ
>>751 アプリやpcソフトからのアクセスで自分のホストとかわかるんですか?
>>752 勘違いしてたかな?
アプリってPCなりスマホなりで動かすって事?
そういうことなら、この方法じゃ無理だな
>>754 それだと、どんなに独自の方式を考えたところで
クライアント側がガードされていない限り
解析されて方式を破られる可能性があるよね?
>>755 ですよね
俺もそう思いました
だから世間の開発者の人たちはどうしてるのかな、と
PHPの話ではないけれど 大概のネットゲーム会社はクライアントアプリに 何らかの形でガードをかけている ホストとの通信は暗号化し、 クライアントアプリ内部メモリへのアクセスも出来ないようにしている チート対策でCPUの不正な高速化までチェックしている所もある どこまでやれば良いのかを考えるとキリがないかも知れない
>>758 うーむ
無理、ですね
チートされても致命傷にならない範囲で作るしかなさそう
パケットを圧縮暗号化分割して何をしているのかわからなくする もちろんメンテナンスと称して毎週のようにパターンは変えること
蔵のチート対策やデータの暗号化はさておき、今回の質問のメインって 鯖との接続・セキュリティ対策よね? 単純に認証方式の話になるんじゃないの?>756でも書かれてるけど
>俺はそのunityで作ったアプリからしかそのphpサーバーにアクセスして欲しくありません 非正規クライアントを作られてほしくないからその対策を教えてくれ って言ってんじゃないのか
>>762 746ですが
俺の入門書レベルでの知識ではphpをサーバーに設置したらネットのどこからでも見れてしまうと
思ったのでそれで質問しました
あくまでゲームからアクセスして欲しいなと
IPアドレスにデータを流す以外に通信する方法があるならそっちでやればいいけど、 普通に公開鍵と秘密鍵を使って認証するのが真っ当じゃないの これを第三者クライアントが使えるんなら鍵の意味がない
>>746 ゲームは、ログイン・認証した人しか、プレイできない。
もし、アクセス権のない人がアクセスすれば、ログイン画面にリダイレクトされる
ログイン後は、セッションを使うから、各プレイヤーは判別できる
Ruby on Rails で、システム運用構築・プログラミングの練習をした方がよい
>>765 ログインですか
でもアプリとかのゲームではログインなしでランキング機能を使えるゲームも少なくないと
思うのですがそれについてはどう思われますか?
>>762 例えBASIC認証でも自分で作ったプログラム以外からのアクセスは除外することはできるよね。
あとはセキュリティ強度の問題であって、チートやら暗号化の話は別の話のはず。
>>766 プログラム内部でログイン処理があるだけで表に出さないだけの話でしょ。
端末固有情報でアカウント作ってログインしてるだけ。
端末固有情報を使わないと鯖にはもちろん入れない。
あとは不正な端末固有情報を使わせない仕組みを考えるだけ。
IDとパスワードを手打ちでポチポチッとすることだけがログインじゃない もうちょっと自分でいろいろ調べてみていいと思うよ さすがにちょっと質問のレベルが低すぎて教えようがない
>>768 なるほどわかりました
それで一つ質問なのですがある端末の識別情報を別の端末が偽装して使って成り済ます
という事はどうやって防ぐのでしょうか?
その質問はまず偽装の方法を自分で調べて理解してからの方がいいよ 偽装の方法によって対策が変わるんだからそんなざっくりとした質問は答えようがない
>>770 やっぱりこれ無しにしてください
まず初回アクセス時にサーバーでパスワードを発行してアプリ側で保存してしまえばいいんですよね
それでかなり確かなセキュリティーが保たれると思います
皆さんありがとうございました
あんまりしつこいとウザいのでこの辺で失礼したいと思います
>>770 絶対不可能レベルなのか、仕組みさえバレなきゃまず偽装できないからそのレベルなのかで
方法論変わってくるんじゃない?
自分はなんちゃってプロテクトな感じで、固有情報を暗号化、初回登録時に
鯖で作ったパスを暗号化したのを端末のちょっと分かんないところにピーコしておしまい。
クラッカーからみて、何をどのようにしてるのか分かりにくくしてる程度で、
全バレしたらもちろんアウトだけど、「何を」「どのような暗号化」は中々分からないと思う。
カネ絡みやら個人情報の絡みがあるんなら、もっと厳格かつワンタイムパスワードとか
必要になってくるわね。
>>772 まず難しいこと考える前に作ってしまえば。
URLを秘密にしておくだけでとりあえず充分。
それがちゃんと動くようになったら不正利用防止を考えていけばいい。
少なくとも今は、ただツベコベ言ってるだけで実際にモノを作れるレベルじゃないんじゃないの?って印象しかない。
HTTP は、1回毎の通信だから、同じユーザーかどうか、判別できないが、 セッション機能を使うと、各プレイヤーは判別できる 毎回通信するたびに、各プレイヤーを特定できる暗号を送りあう SSL・認証は、開発者の常識。 国家資格の基本情報処理技術者でも取れば?
>>767 unityC#で作った正規GUIクライアントでランキングサーバにアクセスするのと
同じ情報手順プロトコルを解析してphpで作った非正規CUIクライアントでアクセスするの
サーバはどうやって正規クライアントと非正規クライアントを見分けるの?
正規クライアントを必要とするチートの話じゃなくてどちらかというとBOTの話
ゲームは、ログイン・認証した人しか、プレイできない。 もし、アクセス権のない人がアクセスすれば、ログイン画面にリダイレクトされる ログイン後は、セッションを使うから、各プレイヤーは判別できる それが、どのようなGUI クライアントで認証しても関係ない。 内容が同じなら、どのGUIクライアントでも同じ 全く同じレスポンスを返すのだろ。 エミュレーターなんか、そう
>>778 まずは解析されにくくすることで非正規を弾く発想なので、
解析されてる時点ではどうしようもないよね。
ここからさらにどのように解析しにくくするのかというところが
ポイントであって、解析されてる前提だとどうしようもないんじゃないの。
むしろ正規の証明が難しそう。
認証局噛ませて秘密鍵公開鍵とかやってても、鍵盗まれた前提で
話しても意味ないでしょう。
ていうか、SSL/TLS通信ってそんな簡単に解析して非正規クローン作れたりするの?
>まずは解析されにくくすることで非正規を弾く 俺がいってるのは 解析されにくくすることで非正規そのものを作ろうと思わない環境にするであって 非正規クライアントの存在そのものがないことを前提にしてるので 似たようなこと言ってるのだが微妙に話が噛み合ってないんよな
質問者の前提は >俺の入門書レベルでの知識ではphpをサーバーに設置したらネットのどこからでも見れてしまうと >思ったのでそれで質問しました >あくまでゲームからアクセスして欲しいなと なので、非正規クライアントも含まれると思うが
SSL/TLSは経路上で情報が漏れることを防ぐためのものでエンドポイントでなら当然簡単に読み取れる
そんなのはわかってるよ 1.非正規クライアントを作らせないというか作ろうとは思わない環境を作る 2.非正規クライアントを作られても問題のない環境を作る という視点の違いであったにすぎずパケット圧縮暗号分割を否定してるわけではないだろう? 最も2はソケット開いたあと何したらいいかわからないはずなので コードはせいぜい数行程度になり動作も不能で 俺的にはそんなものをクライアントと呼んでいいのか?っていう感じだが
非正規と判断されたクライアントに対してはなんらかのペナルティーを課せればいいかと P2P file sharing ならばファイル拡散もかねてキャッシュを送りつける、とか
何をしたら良いか分からないはずと言うのは、かなり甘い見通し ゲーム会社はそんな甘い考えは持っていない 例えばクライアントソフトをデバッガー環境下で起動されると サバクラ間のやり取りの相当部分が解析されてしまう ゲーム会社はそれをさせまいと独自のメモリ保護機構を構築し そのようなハッキングを検出したら終了させている
>>787 いやいや、言い方が悪かったか。
何も出来ないんだよ。毎週変えられたら実質解析なんて不可能なんだから。
やるべきことをやった上での話なのは当然に決まっとろう…
>毎週変えられたら だからこういう手間をかけている分けだろう こういう手間をかけなかったら、解析されてしまうってこと 解析する側からすれば、 調べる対象は手元にあって、サーバーとのやり取りは全部把握出来てしまう クライアントの中でどういう処理をしているかも調べる事が出来る 途中経路がいくら暗号化されていようと、クライアントの中は丸見えだ
最初から毎週暗号化しろっていってんじゃん。 不正規なクライアントを作らせないって話してるのに、 メモリ保護やらクライアント解析やら、チート対策とごっちゃにしてるんだよな。
まずプレーンな通信で済ませたプロトを作るのが先。 そんなのも作れないのにウダウダ言ってても意味が無いだろ。
毎週暗号パターンを変えるような仕組みを採用してるのが当たり前みたいな話になってるけど、 そんなアプリあんの? 後学のために教えてよ
作らせないことを前提にしたら 泥棒がいないようにすれば警察はいらないねって言いだしてる様なものだ 不正規なクライアントが簡単に作れてしまうだろ それをどう対策とるんだよ クライアントの中見られたら、暗号解読をどうやってるか丸見えだ 毎週変えようと、毎日変えようと、全然対策にならないだろう
パケットと経路の違いもわからないのがペチパーの限界なんだろ Web脳すぎて草
普通は通信相手と信頼関係があって、 外部にそれが漏れないように暗号化するって事だが ゲームの場合は、通信相手のクライアント自体が 信用出来ない前提でやらないとだめ
初心者です PHPからコマンド一発で終わらない外部プログラムの実行して操作を行うことってできますか? 例えばMySQLのコマンドラインツールのようなものです
Laravelを使ってサイト作成しようとしてます。 ブログみたいに左側にサイドメニューがあって メニューの項目をクリックすると中央のページにその項目の情報が表示されるという ページを作りたいのですが、 サイドメニューを表示させる方法がわからないので教えてください。 調べたところ、レイアウトを設定するかもしれないところまではわかりました。
>>796 適当なシェルスクリプorバッチファイルを作成してキックかな
https://webkaru.net/php/function-exec-system/ 本当にPHPでやる必要があるのか疑問だが
>>792 昔遊んだセガのスマホゲーム
Wiresharkでキャプチャして中身見たら
Jsonをちょこっとエンコード(暗号化ですらない)しただけのデータでやり取りしてたから
デコードしてクラックして遊んでたよ
まあクラックしたところでクライアント側に反映されるだけで
サーバには反映されなかったから
さすがにサーバ側でチェックはしてるんだろうけど
俺も
>>791 に一票
phpレベルでやる事なんてさ
グダグダ言ってる暇あったらさっさと動くもん作れって話だw
>>801 いやいやw
シェルスクリプト使えww
>>800 も書いてるがphpでやる意味が全くない
>>802 間違えた
使ったのはWiresharkじゃなくてBurp Suiteだったw
制御やら関数やら使うならPHPでもいいんじゃない シェルスクリプトってやったことない人には地味に面倒だと思うし
PHP入ってる前提の環境ならPHPでシェルスクリプトっぽいことやったっていいと思うけどね楽だし Python書けるならその方がいいとは思うけど
>>802 暗号化していないんだったら>792の要件を全然満たしてないじゃん
単に自分が
「暗号化されてないゲームのパケットキャプチャしたぞ(ドヤ」
の話だよね
>>807 は?
大手のセガですらそんな感じなんだから
791が言ってるように、つべこべ言ってる暇あったらプロト作れよ
って話をしたかっただけなんだがw
メモリ保護みたいなチート対策と混同してる奴いるし
何なのこのスレww さすがPHPerwww
一般的な質問しかしていないのにプロトタイプも糞もないぞ 勘違いしているのはお前だろう
ざっとしか見てないから結局元の質問が何なのかよく分からないけど せめて通信の秘匿化・通信内容の暗号化・その他ぐらいは分けて考えないと そこをごちゃごちゃに書く人がいるからわけが分からなくなる #たぶん何となくしってる事を適当に並べただけなんだろう とりあえずapiみたいにhttp(s)使ってピンポン形式でやり取りするだけならプロトぐらいはすぐ作れるでしょ
質問者の聞きたいことは 出来るか出来ないかなので 出来ないと言う結論が出て 質疑は終了していると思うけど
非正規蔵を作られて鯖にアクセスされたくないってのが元々の質問内容 それに対して、暗号化して定期的に別パターンに変更するのが当たり前(ドヤ とか宣い始めたのが>790>809(もうちょっと前から)なんだよね。 当たり前っつーならそれ挙げてみ?って書いたら、全然そうなってない例しか 挙げられなかった始末。 挙げ句の果てには809の言いぐさで論点すり替えて未だにマウンティング しようと必死なわけ。 普通に考えたら、暗号化までは普通だろうが、暗号化パターンを定期的に変更 しようなら短スパンでの蔵の更新か暗号パターンファイルの更新をして配布 しなきゃならん。当然鯖の方も対応せにゃならん。 (日付時間を種にしてやる方法もなきにしもあらずだが穴がある) 809の脳味噌はそこまで一切考えずにゲーム脳の脊椎反射でマウントドヤドヤ してるだけだろ。
https://mevius.5ch.net/gamedev/ こっちの板でやれよ
馬鹿にされないようにな
ここから来ましたって絶対に言うなよ
>>814 俺は横からツッコんだだけで、むしろお前がガッツリ絡んでた話題だろ
なに他人の振りしてんだよ禿
自動でログインしてセッション確立して投稿するようなスクリプトがあるけど HTTPに限らず通信手順をちゃんと模倣できていればそれが可能 防ぎたいのなら通信部分を解析されない対策をとればいいのだけど まあ専門外になるしPHPerには難しいと思うよ
俺、セガよりも大手でゲーム作ってたけど、
>>802 の言ってることは何も間違ってないと思うぞ
話の流れよく分からんからこれ以上のことは何も言えんが
話の前の方から引用すると >最初から毎週暗号化しろっていってんじゃん。 これやってないよねって話でしょ 802自身が実際にはキャプチャしたら暗号化すらしてないって言ってる 毎週暗号パターン変更してるのかしてないのかの事実関係は どうでもいいんだけど、上から目線で言う事毎回矛盾してるのはどうなのって話なのでは
別口からのアクセスおさえたいなら暗号化しろと
>>746 あたりのレスに
>>760 が答えたのと
>>792 に対するレスとして
>>802 が答えたのは関連があるのか?
関連ないのを持ち出されても関連ないとしか言いようがないな
>>787 から「ゲーム会社では〜」を持ち出し、
>>787-790 で「毎週変えられたら」
という話が出たから
>>792 を書いたに過ぎない
結果的にゲーム会社でそこまでやってる例を挙げてるつもりで、暗号化されてない
例を挙げてドヤ顔してるやつが居るよなって話になってるだけ
配列で得られたデータをオブジェクトに変換してリターン している例を見たのですが、何かメリットがあるのでしょうか? return (object)$arr;
何かよく分からんが 勝手にマウント(笑)がどうとかと勘違いして 勝手にドヤ顔(笑)がどうとか喚き散らしてるだけって事はよく分かったw つかプライドが高いのかなんなのかしらんが 現実世界で話したら実に面倒臭そうなやつばっかだなw セガでもそんな感じなんだし難しい事考える前に適当に作って動かしてみれば 俺が言いたいのはこれだけ 何をそんなに噛み付く必要があるんだw キモすぎww
>>822 返り値を受け取る側でオブジェクトの方が都合が良いからだろ
まあPHPerは配列大好きだからな
例えばPDOのPDOStatementなんかはTraversableだから
そのまんまforeachでぶん回せるのに
それをわざわざfetch()とかで配列にしてみたりとかさw
>>823 偉そうに自己矛盾を認めないで草を生やして相手を卑下している時点で、どっちが面倒なのかな。
とりあえずプロトタイプをというのは至極まっとうな意見だと思うので 何をそんなに顔真っ赤にする必要があるのやら全くもって理解不能
マウント ドヤ顔 上から目線 このあたりの単語を好んで使う人は自己愛性人格障害だから相手にしないのが吉
>>792 に答えてって質問に対して的外れなことばかり言ってんじゃねえよ
的外ればっかだし、もうマウント取るしか能が無いよね?って話で図星突かれて
さらに的外れ続けんの?無能すぎね?
う〜ん。 自分も非正規蔵の件について話に入ってたけど、認識違いとかのズレで まあどうでもいいやと思って黙ってたけど、結論はいいとして方法論で これが当然のようにいいながら矛盾しつつ相手を卑下するやり方には 同意しかねるね。 議論の内容より相手を叩く事に重点を置いてるだけにしか見えない。 まあこんなところで議論とか求めても仕方ないけど、筋が通ってない分 ヤクザにも及ばないタチの悪さとは思う。
792は自分が馬鹿にされてると勘違いしてるのか 大手でもそんなことやってないと818も言ってるんだなら答え出てるだろ やっぱり病気だわお前
ローカルプロキシ使ってキャプチャするぐらいなら簡単にできるんだから実際にどんなデータになってるか見てみればいいのにね 他の人が言ってるとおり意外と簡素なものも少なくないと思うよ
毎週暗号化手段を変えろ
↓
>>792 そんなことやってるアプリあるの?
↓
>>802 セガでもやってなかったぞ
>>818 セガより大手でもやってないぞ
↓
>>792 激おこ
うん。意味が分からない
>>833 当人じゃないが、端から見てて
>>792 そんなことやってるアプリあるの?
↓
>>802 セガでもやってなかったぞ
↑
そうじゃなくて
>>802 セガでこんなのやってたぞ(やってない)
としか読んでなかったですわ。
読み返してみてだいたいどうしてこうなったか理解した 毎週変える対策すればクライアントなんて出来ないはず→ 「はず」ってのは考えが甘い→ 言い方がわるかった「はず」ではなくて不可能→ 毎週変えなかったら解析されてしまうだろ→ 最初から毎週変えろいってる この最後のはそういう前提で話をしてるってことであって 別にそれが当たり前だとは言ってないと思うんだわ
話の流れがイマイチ読めないが暗号化のキーは共通鍵って話なの? それとも暗号化のアルゴリズムを変えるとかトンでも理論の話なの? どっちでもおかしな話だけれど そんなことしてるアプリあったら教えてほしいw
>>829 >>792 の毎週暗号化法を変えてるアプリはあるの?
に対する答えは
1.そういう事をやってるものもある「かも」
2.やってないものもある
のどちらかなわけで
1の具体例はまだないが
>>802 は2の具体例なんだから別に的外れじゃないでしょ
誰も”全部そうしてる””絶対にそんな事はない”という0か1かの話しじゃないのにさ
マウントだの何だの言ってるあなたの方がよほど的外れだ
外から解析できるような鍵なら毎週変えたところで無意味だし、 リバースして解析されるならそれこそ毎週変えても無意味だと思うの。 だからそんなことは置いといて、さっさとプロト作れってこった。 それが出来たらパラメタのチェック方法を掘り下げていく方が効果的。
>>836 >どっちでもおかしな話
だよなw
暗号化やハッシュ値生成のためのアルゴリズムは高度な数学の話になるから
そのアルゴリズム自体を毎週新しく生み出せってのはトンデモ話だが
既存のアルゴリズムの組み合わせ順を変えるとか
暗号化⇔複合に使うキーやベクトル値を変えるとかって話なら
週ごとどころか通信毎にランダム化できるんだから別に非現実的な話じゃないよな
※つか、なぜ”週”単位なのかの方がよく分からんw
>>838 もうそいつの事はほっとけよw
>>839 特に下2行には激しく同意
>>838 >>792 では「【あって当たり前な流れになってるけど】あるなら具体例を教えてくれ」であって「あるかないか教えてくれ」ではないんだよ
単純明快な日本語でなにもおかしくないだろ
求めてるのは完全に1.(あればだが)なんだが、なんで2.でOKみたいな流れになってんのよ
いつまでクソみたいな揚げ足取りをやってるんだか 特にお前の話は糞の役にも立ってないんだから黙ってクソして寝てろ マウントとかドヤ顔って単語を好んで使う奴ってほんとゴミクズだわ
>>841 じゃああなたの質問には誰も何も答えないのが正解ってことね
それで満足?
はいはい
こんな人を真面目に相手にした俺が馬鹿でしたよ
まあでもlocalに串立ててGUIでデータの中身見るなんてのは 専門知識も要らない低レベルな話なんで そんな話をドヤ顔だのマウントだのと言われて俺困惑ww 何がこいつの逆鱗に触れたんだろうw おちょくる分には面白いが
あるなら教えてくれ(あればな)→これでドヤ!(ないけど)→ねえんだろ何ドヤ顔してんの この流れで悔しがってるのが802以外に居るのが不思議だね 本人か親兄弟か何か?
PHP 7でASPタグが廃止された理由ってなに? セキュリティ?パフォーマンス?
(当たり前というのは思い込みだが)当たり前の流れにしたくなさそうな
>>792 に
加勢した
>>802 になぜか噛み付いてるんだもん
wiresharkでパケットキャプチャしたってのが何か高度なスキルに思えて
そんな自己満披露せんでいいよとかキレちゃったのかはわからないけど
傍からみててなぜキレてるのかさっぱりわからないw
自分も誤読した立場なんでどっちでも取れるレスだったなあと思えたけど、 こうやって一々煽りに来るのが一番悪いと思いますね いつまで続けるんです?
>>848 wiresharkじゃなくてburpsuite
burpsuiteの方がそういう用途に特化してて簡単
それでも
>>792 にとってはドヤ顔に見えてしまった
つまり792はその程度の知識の持ち主だってこと
もう相手にするのはよそう
>>850 こういうproposalに対してさえnoを投じるrasmusほんま老害
>>851 採用例を求めてるのに、採用してなかった一例のみ挙げて加勢とか判断材料にもならん
馬鹿としか思えんし、その加勢方法がキャプチャなんて所がむしろ失笑しかしてないけど?
高度でもないのに自分でそんな詳細一々紹介しに来る神経がもう、背伸び精一杯だろ
やっぱりドヤ顔してたんで?
ドヤ顔指摘がツボすぎるから悔しくて粘着して煽りに来てるんだろ?
>>850 ありがとです!
使用頻度が低いことや、言語の発展上の弊害になると考えられたようだね
strlen()にintegerを渡してもちゃんと桁数が返ってくるのはなぜですか? stringじゃなくても動作するってことは、どこかで型変換されてるんですか?
http://php.net/manual/ja/functions.arguments.php > 強い型付け ¶
> デフォルトでは、間違った型を渡された場合でも、可能な限りは来されている型に変換します。
> たとえば、string を想定している関数のパラメータに integer が渡された場合は、その値を string 型として受け取ります。
declare(strict_types=1);
気になるなら、これいれるとTypeError投げるようになる。
>>857 うえ、そんなんありっすか
噂に違わぬPHPの片鱗ということですね
ありがとうございました
> 組み込み関数内からの関数呼び出しは、 strict_types 宣言の影響を受けません。 とも書いてあるな。 strlenはもろに影響受けてるようだけど、よくわからなくなってきたw
>>858 逆にこういう挙動じゃない動的型付けの言語教えて
文字列のUnicodeを10進数または16進数の配列として取得するにはどうすればよいですか?
>>862 文字列を $s としたとき、$s[$i] で $i バイト目の文字が得られる。
これを ord するとその ASCII値が得られる。
UNICODE文字単位でそれがやりたいなら、mb_substr を組み合わせてやる感じかな。
>>862 $str = 'unkoうんこ'; $arr = []; foreach (preg_split('//u', $str, -1, PREG_SPLIT_NO_EMPTY) as $char) { $arr[$char] = [ 'hex' => bin2hex($char), 'unicode' => base_convert(bin2hex(mb_convert_encoding($char, 'UTF-32BE', 'UTF-8')), 16, 16), 'json' => json_encode($char), ]; } print_r($arr); あとは結果見て都合の良いように改変してどうぞ よろしくお願いします。 $date=date('Y-m-d H:i:s'); $sql="INSERT INTO tableName (name,comment,created) VALUE (:name,:comment,'{$date}')"; のこコード中で、最後の出てくる ' { $date } ' が、シングルクォートで囲まれているのは何故でしょうか? $dateが文字列になるからなのでしょうか?
>>865 前後がないとわからんがPDOかな?
:nameや:commentはパインド変数だから
型を意識する必要ないけど$dateはバインドしてないから
文字扱いにしてるんやろね
んで、文字列でシングル使いたいから全体はダブルで括るという
SQLでは文字列リテラルはシングルクオーテーションで囲まないと駄目ってだけだぞ SQL文として正しくなるように文字列を組み立ててるだけって事を理解しろ
さらに言うと {$date}は 2018/01/01 01:00:00 みたいに展開されるわけだが シングルクォートが無いとこの部分は数値と除算と…のように解釈されてエラーになるわけだ MySQLだと日付時刻の指定はYYYYMMDDhhmmssかYYMMDDhhmmssの形式の数値でもいいから $date=date('YmdHis')かdate('ymdHis') だったらクォートいらないけどな
みなさま、ありがとうございました! 朝からスッキリできました! 皆様偉大な先生です。本当にありがとうございました!!
下記のように名前空間(ディレクトリ名)とクラス名が重複するのって何かデメリット的な事ありますか? use Myapp\FooBar\FooBar; FooBar::new();
>>871 どこをどう見ても3にしかならないし
実際実行しても3が出力されるんで
何かどっかがおかしいんだろ
つか変数のglobal宣言なんていまさら使うことなんかないから
理解できんのなら忘れていいよこんなもんw
>>872 検証ありがとうございました。
その後、必死でテストしたのですが2しか出ません。
>つか変数のglobal宣言なんていまさら使うことなんかないから
なぜですか?
>>873 宗教上の理由。
global だって使うときは使うから使い方は覚えておいた方がいい。
>>873 必死ってのがよく分からんw
コードをコピペして実行するだけなんだから数秒で終わる話だと思うんだが
ひょっとしてコードを見よう見まねで手打ち(「写経」という)してね?
写経が無駄だとは言わんが
もうちょい色々分かりだしてからやった方がいいぞ
globalについては
グローバル汚染って言葉でググってみ
今PHPをやってるって事はセットでJavaScriptもやる可能性が高いわな?
そこも踏まえて言語を問わず
今自分がどこの空間を使っててそこを「汚染」しないようにはどうすりゃいいか
意識した方がいいぞってことだ
って書くのが面倒くさかったから適当に書いたw 適当すぎだなww
今はよく分からなくてもその内何となく分かってくるから
今わかんないなら気にするなw
使い方は覚えておいた方がいいけど なるべく使わずにすむようにした方がいいだろうね WordPressはglobal宣言しまくってるけど設計としてはあまりまねしてほしくないのは確か
wpは歴史的に仕方ない ポリシー的に後方互換を大事にしてるしな 設計はまねするなという意見には同意 そろそろ後方互換を捨てろよって思うけどfirefoxみたいなことになる可能性もあるからなー
wordpressって推奨はPHP7以降になっているけど、
実際はPHP5.2とmysql5.0でも最新版が動くらしい
下手すると10年以上前?
>>876 を見て久しぶりにコードのぞいたら本当にglobalだらけで笑った
こういう古い設計のコードを見てPHPがくそ言語だと言われるのはモヤッとする
プラグインやテーマもテンプレートエンジンを使わずに素のPHPを使ってるもんだからXSSやCSRFとかの対策が完全自動化されてないのも問題 2018年にもなって素のPHPで書いたテンプレートなんか読みたくないよ。。。
5.2っていうと配列をarray()って書いてた時代か 名前空間も無名関数もタイプヒンティングもないし 定数定義にdefine使ってグローバルで衝突しないように接頭辞を付けるようにしてたっけ WordPress頑張りすぎだろ
まぁ現状のコードベース維持するならコードスタイルもコードベースに合わせざるを得ないわな モダンな書き方にするなら新規で書き起こした方が低コストだろうし
>>881 だな
まあWPはしゃーない
プラグインとテーマの豊富さが売りなんだから
そこ切り捨てちゃったらそれこそFireFoxみたいなことになるw
大昔はこんな実装をしてたんだと反面教師にするにはいい材料だ
モダンなものに触れるだけじゃなぜそうすべきなのかが理解できないしな
俺の知り合いにもWPに親殺されたみたいなのがいるから
WPがこの世から消えれば幸せになれるやつも少なくないんだろうが
逆にWPだけで飯食ってるようなやつもいるからなあw
サイトマップから各ページのURL読み込むの作ってたら
http://mutimutigazou.com/sitemap.xml こういうのができたのだがどう処理すればいい?
お願いします。下記はテキストからの抜粋です。 新規登録するメールが、DBで重複していないかチェックするコードです。 function email_exists($dbh,$email){ $sql="SELECT COUNT(id) FROM members where email=:email"; $stmt=$dbh->prepare($sql); $stmt->bindValue(':email',$email,PDO::PARAM_STR); $stmt->execute(); $count=$stmt->fetch(PDO::FETCH_ASSOC); if($count['COUNT(id)']>0){ return TRUE; }else{ return FALSE; } } 解説では、入力するメールアドレスが「何件あるか」調べます。取得する値は0か1。 しっかりと行数をカウントし、メールアドレスが登録済みかチェックします。 と記載されています。 コードを見ていると、fetchで連想配列を1行だけ$count変数に格納しているだけに読めてしまい、 「何件存在しているか」、「行数をカウントする」、という部分の記載が、コード上理解できません。 上記のコードで、DB上で該当する行の行数をカウントしている部分はどこにあたるのでしょうか?
SQL文自体でカウントしてるから1行読むだけでいいやん てか、1行しか返ってこないし
>>885 カウントはSQLの集計関数であるCOUNT()でやってる
SELECT COUNT(id)
のところな
こういう時は
"SELECT COUNT(id) AS cnt FROM members";
みたいに別名を付けるくせを付けといた方がいい
ちなみに今回のようにカラム1個のデータだけ欲しい時は
fetch()ではなfetchColumn()を使って
$count = $stmt->fetchColumn();
とすれば
$count には配列ではなく直接 COUNT(id) の値が入るんで楽
さらにこうやって書けば
$count = $stmt->fetch(PDO::FETCH_ASSOC);
以下の冗長な6行がこうやってたった1行で書けるわな
return (bool) $stmt->fetchColumn();
>>885 さらに言えばw
メアドが登録済みかどうかを知りたいだけなら
COUNT()なんか使う必要はなく
$sql="SELECT id FROM members where email=:email LIMIT 1";
でいい
まぁその例はあくまでも教科書的に「何件あるか」を調べる方法を書いてるだろうが
DB処理ってのはボトルネックになりやすいんで
sqlはなるべく簡素にするのが基本な
>>883 XMLなんだからsimplexml系とか(他にも色々あるが)で処理すればいいだろ?
gzされてるデータの扱いが分からんのか?
gzされてるデータはローカルに保存した上でgzopen()で開いて処理してもいいし
データ取得にcurl使って CURLOPT_ENCODING => 'gzip' ってオプション指定して自動展開してもいいし
そのままとってきてgzdecode()通してもいいし
好きなようにすりゃいい
>>886 >>887 >>888 ありがとうございます。
$count には ['COUNT(id)']=>行数という連想配列が、
$count['COUNT(id)'] には 行数が、
それぞれ格納されているのですね。
return (bool) $stmt->fetchColumn();や
実務的なSQLの考え方を教えてくださってありがとうございます!
>>891 お、おう
そういうレベルだったのかw
変数の中身がどうなってるかわけ分からん時はすぐに
var_dump($count);
ってするんだ
$countが「配列」や「オブジェクト」だと分かってる時は
print_r($count);
ってした方が見やすいから使い分けるといいぞ
とにかく初心者の内はちょっとでもあれ?って思ったらすぐ var_dump() しろ
>>885 の変数COUNT(id)なのですが
$sql="SELECT COUNT(id) で、変数宣言された、ということでしょうか?
>>894 上でも書かれてるけどそういう疑問を持ったら実行してvar_dump
スクリプト言語はそうやって簡単に実行して結果が見れるのがメリットなんだから、
もし今それができないなら環境構築から見直さないとものにならないよ
あと上の人もだけどPHPというよりはSQLが分かってない
勉強の仕方が間違ってる
コレは解説のサンプルコード書いてるヤツが頭ワルイわ $countを$$colum_valuesとか別の名前にするべき countと直接一切関係ない $stmt->fetch()は行の列を全部とってくるのは分かるヤツがみれば コード書いたアホがなにをやりたいかなんとなく分かる きっとなウンコphpのウンコライブラリ使うと 辞書の連想配列にカラムの値が格納される仕様になってるのは分かる コレでわかる $$column_values=$stmt->fetch(PDO::FETCH_ASSOC); if($$column_values['COUNT(id)']>0){ ↓低学歴知恵遅れが書いた解説コードはペケ $count=$stmt->fetch(PDO::FETCH_ASSOC); if($count['COUNT(id)']>0){
PHP 7.2の初歩的な質問をさせてください。 下記のようにコンストラクタの戻り値を宣言すると __construct() cannot declare a return type エラーになります。 __construct( ): void { } コンストラクタは何も型宣言をしてはいけないということでしょうか?
>>899 > コンストラクタは何も型宣言をしてはいけないということでしょうか?
その通り
というかコンストラクタの返却値型宣言していい言語ってある?
ありがとうございました。 さあ…? そんなに詳しくないので知りません。
コンストラクタの機能は100%インスタンスの生成を成功することなので仮に失敗もあるならbool値のみ、でも言語の機能としてインスタンスの生成を失敗したら使い物にならないので100%インスタンスの生成を成功する言語のはずだから戻り値は必要ない
コンストラクタはなくてもインスタンス作れるから戻り値の保証はする必要ない
voidぐらいさせてくれてもいいじゃない。 C言語おじいちゃんなんだからあ…
@のコメントあるから別に困りはしないよ。 すべて統一という気分の問題かな。
返り値のことを返却値というやつって何なんだろう 何も返却なんてしてないのだが
>>908 たぶん何も考えてないんだろw
>>909 その発想はなかったわw
>>897 PHPerは何でも配列にしたがる癖があるのが困り物だが
配列にしてわけが分からなくなるなら
変数名の付け方をもっと工夫すりゃいいのにってのは思う
配列には$rowArrとか$row_arrとか付けるようにするとかさ
前の方にも書いたが配列として取得しなくても
fetchColumnでスカラー型として取得する方法も知っておくべきだと思うし
$arr['COUNT(id)']みたいにSQLの集計関数の結果をそのままキーとして使わずに
COUNT(id) AS cntみたいにエイリアス使って
$arr['cnt']ってする癖をつけておくべきだと俺は思うけどな
オブジェクトで返ってきてるんだから、そのままオブジェクトとして操作すればよいと思うぞ。
xamppでPHPUnitの連続実行ってどうやるの? shスクリプトでは複数行書けば全部実行してくれる。 batファイルだと最初の1行を実行して終了する。 おま環?
>>895 >>896 >>897 ありがとうございました。
よく理解できていないのでメモさせてもらい
勉強を進めて後々で再度確認してみます
laravelがrailsと比べて優れているところ教えて下さい
最大のメリットは php である事。最大のデメリットも php であること。 。。。比較の軸ぐらい考えろよ。オマエアホだろ。
>>916 言語の質ではなくフレームワークの質を聞いてるんです。
比較の軸が出てきたなw どっちも変わらん。要件次第。 もうちょっと聞きたいことを整理して質問しようぜぃ♪
>>919 プログラミング初心者なので一番知りたいのは学習コストで、どちらが学習コスト低いですか?やはり日本語情報の多いRailsの方が有利でしょうか?わかりやすさの面ではどちらでしょうか?もう1つ聴きたいのですが将来性はどちらに方があるでしょうか?長文すいません。
書いてんじゃん。どっちも変わらん。要件次第。前提次第。 XXと〇〇、どっちが優れてますか系の質問するやつにまともなエンジニアはいないんだよ。 要件整理して、前提確認して、比較軸作って、ドキュメント読んで、必要なら検証するのがエンジニア。 手が動かないなら向いてない。
>どっちが優れてますか系の質問するやつにまともなエンジニアはいないんだよ >手が動かないなら向いてない これ両方共すげぇ分かるww
ものすごく感覚的な話で申し訳ないけど Railsは出た当時は画期的だったけど、他のフレームワークがRailsの良いところをどんどん取り込んでいったので優位性がなくなっていってるイメージが強いかな あとこんな事書くとRuby使いの人が怒るだろうけど どこかの海外フォーラムで最近、死に向く言語ランキング上位にrubyが入ってたっけ ソースを探したんだけど、どこだったかど忘れして探しきれなかった 申し訳ない かといってこれから先はPHP?って言われると答えはNoだけど(スレのみんなごめん) 今から勉強始めるなら、個人的には色んな意味でPythonをおすすめするかな Pythonっていうと機械学習や深層学習のイメージが強いと思うけど、 WEBフレームワークもどんどん進化してるし、 スクレイピングライブラリなんかも超高性能なのが出てきてるし 手っ取り早く結果を出すだけならまだまだPHPの方がかなり楽だけどね
サーパーサイドなんてもうNode一択 他はNode書けないやつが使うもの
>>926 ruby のどんな点がクソなんですか?
バグらない、Ruby >> Python, JavaScript >> PHP、よくバグル PHP の本は、デザイン主体だろ。 プログラミングの本は、ほとんどない ゲームエンジン・フレームワークの巨人、掌田津耶乃の本も、初めて出たばっかり。 Node.js超入門、2017 Python Django 超入門、2018 Rails は既に、何十冊も出ている。 この2冊が最短 たのしいRuby 第5版、2016 改訂4版 基礎 Ruby on Rails、黒田努・佐藤和人、2018/9/7 他に、無料のRails チュートリアルがある。 これの10日ぐらいの解説講座もあるらしい YouTube に、Rails の動画もある。 フリーエンジニアになる人は、Rails が多い Pythonは、ラズパイ・AI・機械学習・統計処理とか、普通のウェブページではない。 サーバーサイドは、node.js Railsでも、HTML, CSS, JavaScript(JS), jQuery は必須だから、 プログラミングやテスト工程をマスターするには、Rubyがよい Railsの前に、Sinatra をいじくりまわして、ウェブページの仕組みを学ぶのがよい。 Nokogiri, Selenium WebDriver で、スクレイピングするのも勉強になる Rubyで学んだことは、そっくり、JS で使えるから、JSで学ぶよりも効率的。 Rubyの方が、他の言語よりも可読性が高く、バグらないから!
ちゃんとした質問しないから、エンジニアになれなかった亡霊が無駄コメント残し始めたじゃないか。。。 責任とって、クローズしろよ。
git commit -m "close #915"
HTMLとJVSCRIPT、PHPは相性がいいの? SNSとかコミュニティサイトを作って 海外のユーザにも利用してもらおうとしたら、PHP?
相性は別に良くないと思うよ。 フレームワーク次第じゃない? そういう話なら既存のOSSなSNSをインストールするべきと思う。 OpenPNEやWordPressのプラグイン等など…
プログラム言語やツールは物を作る道具や手段であってできるものに変わりはない HTMLのようなGUIを作る場合はエディタが出来栄えを左右することもあるだろう ただPHPでやることはバックエンドの目に見えない地味な場所であって 頑張って書くようなコードでもなければ体感速度もサーバのスペックが大きく物を言う そんなところで良し悪しを熱く語ってるやつはたいていアホで出来ない子 つられやすい話題につられるのもアホで出来ない子
HTMLやCSS出来なくても WordPress使えば誰でも子供でも ホームページが! それもタダで無料で! WordPressはPHPで構成されてます人気もあります でも問題ないわけではないです! 子供より若い園児向きには Flat-File CMSを データベース不要でPHPで動きます!
>>936 意味わからんこと言って不親切よりいいわ。
そんなにもできる子は世の中お前しかいないんだよ。
>>933 初心者でも簡単にapacheのモジュールとしてインストールして動かせるって意味では相性いいと思うよ
>>936 も言ってるように
プログラミング言語というのはあくまで手段であって目的によって使い分けるものなので
これは絶対こう絶対違うって書き方してる人のことはスルーしとこう
webアプリといえばperlかc言語のcgiみたいな感じだった昔とは違って今は色んな選択肢がある
phpはその内の1つってだけ
phpのいいところは学習コストの低さかな
脳死でさっと結果を出したい時はphpみたいに何かに特化してる言語はとにかく楽
最近10年以上前にperlで書かれたcgiを触る機会があったけど
たったこれだけの事するのに何でこんなにあれこれ書かないといけないんだ…って萎えまくった(perlは文字列処理が得意だけどウェブに特化してるわけじゃないから仕方ない)
php以外にも色んな言語に触れてた方がいいとは思うけど
ウェブアプリを作ることを目的とした初学者が選ぶ言語としてはまだまだ第一選択肢となり得る言語だよ
>>939 がいいことを言った
プログラミング言語には自分との相性みたいなのもあるからな
色んなものを試してみて1番自分に馴染みそうなのを選ぶのもいい
とにかく0か1かでしか物事を語れないプログラマ脳のいうことは鵜呑みにしちゃだめだ
perlは、同じ事するのでも人によって色々アプローチが違ってて それはそれで面白いんだけどね perlをとっつきにくくさせているのは変数の宣言と使い方じゃないかな 書いた人を呪いたくなる事があった
>>942 TIMTOWTDIがperlの設計思想だしね
>書いた人を呪いたくなる事があった
あるある過ぎて泣ける
perlはその自由度のせいで可読性が損なわれやすい(もちろん書き方の問題)けどそういう言語は最近は不人気だね
正規表現使ってワンライナーでさくっと何かしたい時とかやっぱperlはいいなって思う事もあるけど
あんまりやり過ぎると5時間後の自分にすら読めなくなるという…
>>943 設計思想的にPerlの対極にいるのがPythonで今や大人気だもんな
Pythonは数学者が作ってPerlは言語学者が作ったって話を初めて知った時はめちゃくちゃ納得した
>>944 だね
昔は趣味のスポーツカーが流行ったけど今は使い勝手や燃費重視のコンパクトカーや軽が流行るのと同じで
pythonは悪くいえば遊び心はないけど可読性と再利用性の高さは強力な武器だよ
流行るわけだ
プログラミング言語には作者の性格が色濃く現れてるから面白いよね
php作者の名言集
https://anond.hatelabo.jp/touch/20100427231539 ディスる時によく使われるけど俺はそんなphpも好きだ
>>945 > 僕なら、10リクエストごとにApacheを再起動しますね
ワロタwwwww
これ有名なの?恥ずかしながら初めて知った
面白いな
わりと有名だと思うよ
ついでにこれとか
https://takahashifumiki.com/web/programing/2209/ あんまり書いてるとマジレスして怒る人が出たら嫌なのでこの辺で…
繰り返すけど言語はあくまで手段に過ぎない
phpもperlもpythonもその内の1つに過ぎないってことでおやすみなさい
一気読みしてしまったけどめちゃくちゃ面白かった サンクス 俺もPHPをもっと好きになれた気がするww そしてPHPにもgotoがあることを知って驚愕 まあ使う必要はないとだろうけど わざわざあとから付け足したみたいだが必要だったのだろうか
ラスマスさんインタビュー
http://gihyo.jp/news/interview/2010/rasmus ここでは自分のことを利己的と表現してるが
現実主義・合理主義者なんだよな
アホのいうことは相手にせず適当にスルーしてるから
>>945 みたいな感じになるとw
> 言語は開発者が考えているほど重要ではありません。
> 重要なのはどのような製品が必要とされているのかではないでしょうか。
> 必要とされている製品をいかに速く作り,かつ簡単に維持するかが重要です。
> エンドユーザは,どの言語で書かれているか?なんて気にしていません。
このスレの誰かさんに100回声に出して読めといいたいw
>>949 少し上の方にあったglobalの話と似たようなもので
使わなくて済むなら使わない方がいいって感じのもんだな
他の言語にもgotoはあるけど使ったことないや
あ、basicやったことないの?なんていうおっさんは相手にしてませんので
(書いとかないと相手にするのがめんどくさいw)
すみません、よろしくお願いします。 function readLines(string $path){ $i=0; $file=fopen($path,'rb') or die('ファイルが見つかりません'); while($line=fgets($file,1024)){ yield $line; } fclose($file); } $gen=readLines('sample.txt');//*** foreach($gen as $line){ print $line.'<br>'; } ?> 読みだす対象ファイルは10行あります。 ***の部分なのですが、$genで関数readLine()を1度呼び出して 対象ファイルから一行読みだしているように思えるのですが、 実際には、対象ファイルの全行を読みだしています。 $genで全行(10行)格納できているのは、どんな働きがあってのことなのでしょうか?
>>953 たった8行しかない関数なんだから
自分で1行ごとに何しているかを調べてみよう
>>953 while ($line=fgets($file,1024)) { }
がループ処理だって事も分からないのはやばいぞ
もう少し頑張れw
このコードはだめだな
while($line=fgets($file,1024))
これだと 0 だけとか改行だけの行があったらそこで処理が止まる
同じように書くなら
while (($line = fgets($file, 1024)) !== false) { }
こう書かないと駄目
PHPerはよく if ($hoge = fuge()) みたいな書き方をするけど
分かってる上で手抜きでそう書くなら別にいいが
分かってないならそんな書き方はやめるべき
ジェネレータ使ってるから一見何してるか分かりにくいように見えるかもね とはいえ便利だし1行ずつ読めば難しくない ifの条件文中で代入するのはむしろCでよく見た
>>957 swiftとかpythonだとこういう書き方はできないからね(代入式が値を返さない)
そのおかげでヨーダ記法みたいなヘンテコリンな書き方をしなくてもミスが防げるんだけど
一長一短だしこの書き方を全否定してるわけじゃないってことで
perlのワンライナーが気持ちいいってのもよく分かるが
人が書いたものは見たくないというのもよく分かるw
すまん下の2行 全然関係ない文章が入ってしまった 書こうと思って削除した文章がクリップボード履歴からコピペされてしまった
なぜ文字列結合を . にしちゃったんだろう フレームワークを通さずにドットチェーンでサクッと書きたい時に悲しくなっちゃう
>>953 $gen=readLine('sample,text'); は、$genに関数を入れてるだけで、
書き換えるのなら
foreach(readLine('sample.text') as $line){
print $line'.<br>';
}
ということでは?
>>966 ありがとうございます。変数に関数を入れられるのですね。
書き換えられた方はテキストの別のページに載ってるのと似ているので理解できました。
すっきりしました。ありがとうございました。
>>967 別の人も書いてるけどジェネレーター(yield)を使ってて分かりにくいなら
yield使わずに同じことやってみたらいいかも
>>968 ありがとうございます。
各yieldの前後や、関数の呼び出し元に
print文でどこを実行しているのかを表示させるようにして確認しました。
yield fromを混ぜ込んだ文も、同様に処理するようにしたら
ずいぶん理解できるようになりました。
皆様、ありがとうございます。
$gen=readLine('sample,text'); これで代入されてるのは関数じゃなくてジェネレータ関数が返す反復可能なオブジェクト(への参照)かな ジェネレーター関数を呼び出したのをvar_dumpするとこんな感じだわ object(Generator)#1 (0) {}
Laravelのログイン処理をゼロから解説してる学習リソースありますか?
青い本とオレンジ色の本 Amazonで探せばすぐにわかる
>>974 こんな性格じゃそりゃいつまで経ってもゴミのままだわな
よろしくお願いします。 for($i=1;print"{$i}<br>",$i<6;$i++); for($i=1;$i<6,print"{$i}<br>";$i++); 前者は、1〜6までをプリントしますが、後者は無限にプリントされてしまいます。i++が6を超えてしまうのはなぜなのでしょうか?
>>978 ありがとうございます。
判定がtrueになり続けてしまうということなのですね。
もう一つ質問があります。
class A{
private $B;
public function __construcr($C){
$this->B=$C;
}
というコードなのですが、classAのフィールドで変数$Bを宣言して
関数のコンストラクタの$thisで、変数$Bに引数を代入してますが
この時、変数Bの$が取れているのはどういう仕様なのでしょうか?
$が取れていることで可変関数を使える仕様になっている
>>982 ありがとうございます。
可変関数は、$変数に関数名を格納して使うものだと理解していました。
もう少し、可変関数に関して調べてみます。
$db=getDb(); $opDB=$db->prepare('SELECT * FROM sample WHERE id=?'); $opDB->bindValue(1,$_GET['id'] ?:1); このコードから質問お願いします。 2行目の id=? は、ワイルドカードのようなものですか? 3行目のbindValueの一つ目のパラメータの1は、何を指しているのでしょうか?
返答ありがとうございます。 id=? っていうのは、どういう働きをするコードなのでしょう 一つ目とか、bindValue(1,$_GET['id']);の、'1'です
>>984 >>986 SELECT * FROM sample WHERE id=? というSQLの中で使われている「?」はプリペアドステートメントというもの http://php.net/manual/ja/pdo.prepared-statements.php ?だと理解し難いなら名前付き(例えば今回なら :id とか)にした方が理解しやすいと思う $hoge = $_GET['id'] ?: 1; はエルビス演算子という三項演算子を省略した書き方 可読性が悪いのであんまり使わない方が良いと思う ・同じ事を三項演算子で書くなら $hoge = ($_GET['id']) ? $_GET['id'] : 1; ・同じ事をif文で書くなら if ($_GET['id']) { $hoge = $_GET['id']; } else { $hoge = 1; } だが、このケースでは、こんな書き方をしてはいけない。 (続く) (続き) $_GET['id']が定義されていない事を考慮した正しい書き方は ・PHP7以降ならNULL合体演算子を使って $hoge = $_GET['id'] ?? 1; ・↑が分かり難いなら $hoge = (isset($_GET['id'])) ? $_GET['id'] : 1; ・↑でも分かり難いなら if (isset($_GET['id'])) { $hoge = $_GET['id']; } else { $hoge = 1; } このケースでエルビス演算子をこんな使い方するような糞コードは、あんまり参考にしない方がいい
>>977 も読んだが、エルビス演算子の使い方といい
いったい何を参考にしてこんなコードを書いてるんだろうか
もし本を参考にしてるなら焼き捨てた方がいいレベルで酷い
クイズ的に質問してるなら面白いけどw
演算子の説明だけだとシンプルで理解しやすいけど実用性ではクソ 実用性重視の説明だと本来説明したいもの以外の説明で蛇足だらけで 紙面使いすぎでクソ というジレンマなんやろ
$input = trim(fgets(STDIN)); while($input) { echo $input; } これってwhileの式のところでは$inputの中が空かって判断してるの?そういう機能がついてるのか?
>>984 SELECT * FROM sample WHERE id=?
id=? は、placement。
? の所に、値が入る
SQL injection 対策
例えば、単純な文字列をつなげて、問い合わせると、
? が「1; DROP TABLE 何々」とか、クラッカーに入力されると、
「SELECT * FROM sample WHERE id=1; DROP TABLE 何々」のように、
; で、危険なSQL文をつなげてくる
placement で、SQL文をつなげられないようにしている
>>991 そのコードだと、trim(fgets(STDIN))の値が (bool) true であった場合に永久ループになるw
実際は
while ($input = trim(fgets(STDIN))) {
echo $input;
}
こう書くべき処理なのでは?
while分の中では$inputをbool型にして判定してるわけか?
空文字がFalse判定されることを利用して 空行入力で終わるようにしてるんだろうけど ゼロとかもFalse判定されて終わっちゃうんじゃないか 試してないけど
Ruby では、nil, false の偽が2つだけ。 一方、JavaScript, Python, PHP などは、偽が10個ぐらいあるから、超危険! 基本的に、Ruby 以外は、バグってどうしようもない
>>987 ありがとうございました。プレイスホルダなのですね。
prepareでSQLを用いて、プレイスホルダを使うとき、
SQL文の中で、左から数えたプレイスホルダの順番を、
bindValueのカッコ内の数値で指定してバインドする、ということもわかりました。
?:や??:の解説もありがとうございました。
>>989 独習phpというテキストを使っています。
>>992 ありがとうございます。
prepareステートメントが悪意ある入力に対策しているとテキストにも書いてありました。
皆様、ありがとうとざいました。
今のテキストを読み終えたら、もう少しテキストを吟味して、違うテキストを探してみようと思います。
>>994 そういう事
ただ
>>995 ,996の言う通りなので
while (($input = trim(fgets(STDIN))) !== false) {
echo $input;
}
こう書くのが正しい
(なんか前にも似たような事を書いた気がするw)
すまんw 大嘘書いたww
>>998 のコードだと trim() によって string型にキャストされるから永久ループするわwww
while (($input = fgets(STDIN)) !== false) {
echo $input;
}
が正しいが場合によっては
while (($input = trim(fgets(STDIN))) !== '') {
echo $input;
}
が期待した動作なのかもしれない
このスレッドは1000を超えました。 新しいスレッドを立ててください。 life time: 342日 23時間 9分 23秒
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/ ▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
read.cgi ver 07.7.23 2024/12/25 Walang Kapalit ★ | Donguri System Team 5ちゃんねる
lud20250227102217caこのスレへの固定リンク: http://5chb.net/r/tech/1513760420/ ヒント: 5chスレのurlに http ://xxxx.5chb .net/xxxx のようにb を入れるだけでここでスレ保存、閲覧できます。TOPへ TOPへ
全掲示板一覧 この掲示板へ 人気スレ |
Youtube 動画
>50
>100
>200
>300
>500
>1000枚
新着画像 ↓「【PHP】下らねぇ質問はここに 9 YouTube動画>1本 ->画像>1枚 」 を見た人も見ています:・くだらねえ質問はここに書き込め! Part 232 ・■ちょっとした物理の質問はここに書いてね238■ ・|;;; l ゚ ー゚ノ|<くだらない質問はここに Part351 ・くだらねぇ質問はここでしろ!2 ・〒くだらねぇ質問はここでしろ【お客さま専用】162 ・〒くだらねぇ質問はここでしろ【質問スレ】 159 ・どんな下らない質問にもマジレスするスレ153 ・どんな下らない質問にもマジレスするスレ159 ・どんな下らない質問にもマジレスするスレ155 ・くだらねえ質問はここに書き込め! Part 245 ・くだらねえ質問はここに書き込め! Part 239 ・■ちょっとした物理の質問はここに書いてね292■ ・■ちょっとした物理の質問はここに書いてね250■ ・くだらねえ質問はここに書き込め! Part 217 ・■ちょっとした物理の質問はここに書いてね254■ ・|;;; l ゚ ー゚ノ|<くだらない質問はここに Part330 ・|;;; l ゚ ー゚ノ|<くだらない質問はここに Part362 ・|;;; l ゚ ー゚ノ|<くだらない質問はここに Part372 ・|;;; l ゚ ー゚ノ|<くだらない質問はここに Part337 [無断転載禁止] ・どんな下らない質問にもマジレスするスレ161 ・どんな下らない質問にもマジレスするスレ167 ・どんな下らない質問にもマジレスするスレ170 ・どんな下らない質問にもマジレスするスレ145 [無断転載禁止] ・どんな下らない質問にもマジレスするスレ134 [無断転載禁止] ・どんな下らない質問にもマジレスするスレ146 [無断転載禁止] ・誰かがどんなに下らない質問にもマジレスするスレ [無断転載禁止] ・どんなくだらねぇ質問にもマジレスするスレ★1 ・スレ立てるまでもない質問はここで ・どこにも受からないから早稲田で走ってきたら合格したけど質問ある? ・スレ立てるまでもない猫の質問はこちらへ その3 ・くだらない質問はここで聞け!@プロ野球板 第125回 ・スレを立てる程もないクレカの質問はこちらPart339 ・〒くだらね〜質問はここでしろ【お客様専用】157 ・英文法・語法に関する質問はここでしろ! Part 12 ・☆くだらない質問はここ!@賃貸分譲不動産板☆ 4 ・どんなくだらねぇ質問にもマジレスするスレ★178 ・どんなくだらねぇ質問にもマジレスするスレ★180 ・どんなくだらねぇ質問にもマジギレするスレ★1 ©bbspink.com ・どんなくだらねぇ質問にもマジレスするスレ Part171 ・ビートルズに関するくだらねぇ質問はビートルズに聞け3 ・超超くだらねぇ質問に物凄いスピードで答えるスレ★113 ・どんなくだらねぇ質問にもマジレスするスレ★186©bbspink.com ・どんなくだらねぇ質問にもマジレスするスレ★188 ©bbspink.com ・どんなくだらねぇ質問にもマジレスするスレ★193 [無断転載禁止]©bbspink.com ・スレ立てるまでもない質問はここで 146匹目 ・スレを立てるまでもない質問はこちらのスレで ★46 ・お絵かき板を救う唯一の《質問スレ》質問はここでどうぞ3 ・スレを立てる程もないクレカの質問はこちらPart322 ・スレ立てるまでもない猫の質問はこちらへ☆ミpart77 ・くだらない質問はここで聞け!@プロ野球板 第122回 ・スレ立てるまでもない猫の質問はこちらへ☆ミpart83 ・市川海老蔵、『鬼滅』歌舞伎化の話題にうんざり?「どこに行ってもこの質問」 [爆笑ゴリラ★] ・■模型板総合スレッド37〜質問&雑談はここで〜■ ・くだらない質問はここで聞け!@プロ野球板 第124回 [無断転載禁止] ・初心者歓迎 スレ立てる前に此処で質問を 917 ・【なんでもあり】介護職の雑談・相談・質問スレ 97 ・初心者優先デジタル一眼質問・購入相談室 99 ・職務質問苦情スレ 95 ・初心者歓迎 スレ立てる前に此処で質問を 937 ・初心者歓迎 スレ立てる前に此処で質問を 955 ・質問 ・英語質問 ・質問です ・質問ある? ・質問です!
04:54:46 up 51 days, 5:58, 2 users, load average: 9.24, 14.85, 22.11
in 0.82030916213989 sec
@0.82030916213989@0b7 on 030518