PHP質問・雑談スレ5【初心者お断り(ROM歓迎)】
■ このスレッドは過去ログ倉庫に格納されています
PHPに関する質問や雑談をするスレです。
初心者お断り(ROM歓迎)と書いてますが、初心者用のスレが用意されているからで、
難しい質問や話題をしなければいけないわけではありません。
PHPマニュアルの読み方を概ね理解していて、関数リファレンスが正しく読める方用のスレです。
PHP未導入の方や、手取り足取りが必要な初心者の方はム板のくだスレへどうぞ。
https://mevius.5ch.net/tech/ (【PHP】で板内を検索)
前スレ
https://medaka.5ch.net/test/read.cgi/php/1498653249/
その他リンク
・PHPマニュアル
https://secure.php.net/manual/ja/index.php
・コードテスト・貼り付け用
https://ideone.com/
・プログラミングのお題スレ (求PHPer参戦)
https://mevius.5ch.net/test/read.cgi/tech/1538096947/
このスレで扱う話題
・PHPのコード,設定や設定値に関する質問
・常識的範囲内でのコードレビュー依頼・改良相談
・PECL,PEARに関する質問
・PHP新機能やPHP関連トレンドの話題
(FWや非公式ライブラリの話題や特徴比較は良いが使い方から先の話題は専スレへ)
・PHPのバグ発見報告・公式に報告する前の検証依頼
このスレで扱わない話題
・直接関係ない○○特有の質問(専スレへ)
(HH,エディタ,IDE,サーバ,OS,DB,SQL,FW,テンプレート,非公式ライブラリ・アプリケーション等)
・PHPの改造 >>433
高機能だkら山程セキュリティホールがある
他のFWは低機能だからセキュリティホールが少ない
>>434
まぁセキュリティホールをの説明なしにフルスクラッチで作りがる業者や個人は疑ったほうが良い
脆弱性による被害は無い→今後ある可能性がある、そのコスパは非常に悪い
こういうとこまで説明する必要がある WPはCMSでFWでない
セキュリティアップデートは利用人数と開発者人数によるとこが大きい
潜在的な問題はほぼ100%どのソフトウェアも抱えている
それが表に出ないだけ WPは設計が古すぎる
今だに低レベルなxssが起こってるのは、
テンプレートエンジンを通してないのが理由だし
プラグインで低レベルなxsrfが起ってるのは、
そこの処理がプラグイン開発者に依存してるから
良く言えば自由度が高いと言えるが、
一貫性のある手法を提供しきれてないから、
プラグインで致命的な脆弱性が頻発してる。
この辺りは430の話にも通ずるな
コードレベルでいえばglobal宣言だらけな時点でお察しだし まぁwordpressは世界のサイトの3割だかが
これで作られてるってぐらいシェアがあるから
その分攻撃対象になりやすいってのもある
サバのログ見てりゃ分かるが
中国あたりからwordpressの脆弱性をチェックする
ボットが飛びまくってくるからな PHPでフレームワーク使う必要なくね?
フレームワーク使うぐらいなら別の言語でよくね?
なんでPHPつかってまでわざわざフレームワークなんて使ってるのか?
俺にはペチパー思考はさーっぱり理解できないわw フレームワークを使うのは、既にあるものをわざわざ自分で0から作る必要なくね?ってやつだろう >>440はPHP以外にどんな言語ができて
その言語ではどのフレームワーク使ってて
例えばSQLの組み立てはどうやってるのか教えて FW使うにもプログラム言語を少しは触る必要があるわけで
PHPが簡単という嘘に惑わされた初心者がPHPから始めてるから仕方ない
最近は充実してるけどもっと早く豊富な日本語ドキュメントにアクセスできれば
圧倒的にPythonが流行っていただろうにな >圧倒的にPythonが流行っていただろうにな
無いかなぁ
日本ではHSP、ツクールが流行ってたからな。
なんやかんやでゲームとKAWAIIの国
pythonはないかなぁと思う
pythonメインのDXライブラリみたいなのがあれば流行ってたかもね >>443
俺はJava、Swift、Objective-Cとか
古い言語だとPerlも触れるけど>>440みたいな考えは全く理解できないんで
どんな言語でどんな環境だったら440みたいな考えになるのか興味があるので 芸能人レベルの一般人美女(真ん中)
向かって右端は目と鼻整形済み(本人公言)
左は高身長でナチュラル
ランク付けてみて
https://www.instagram.com/p/BrVaQVblRk7 FWを使う使わないが速度云々とか
WPとFWの区別も付いてないとか
PHPでFW使う意味が分からないとか
もうね…
このスレに初心者お断りって書いてる意味がないと思うの そういやもうwpを長らく触ってるから私は中級者ですっていわれりゃそれはそうだし、
何を持って初心者かだよな >>430
前後の肝心なとこ抜くなよ
この発言はPHPの一貫性のなさや批判に対して開き直った発言で
ラードフが初期にあんま深く考えずオレオレライブラリとして作ってたことを示してる
批判に対して整合性が欲しいならフレームワーク使えばいいということに言及したに過ぎず
ラードフ自身フレームワークの遅さを指摘しPHPでは使う必要はないと言っている
Strutsあたりで流行しRoRで完成したMVCが今主流ってだけで(MVVMも流行ってるが)
PHPはそれ以前に流行したHTML埋込み型のWebアプリケーションFWであるというのは知っておけ
>>448
速度重視するならPHP使わないとか言い出すいつものキ○ガイ?
サーバチューニングして半ば強引に最近WPは早くなってきたけれど
肥大化したアプリケーションというのは元々遅くなるもの
FW(特にフルスタック)なんてのはそういうアプリケーションの代表格 PHPの利点を殺さずMVCでコード書きたいならPhalconかSlimでも使えばいい
LaravelやCakePHPは脳死した人間が使えばいい PHPのコードを手っ取り早く早くするには
ZephirでPHPエクステンション書けばいい
WPをPHPエクステンションに移植したら有名になれるよ 可変引数でうまいバリデーション方法あったら教えて下さい
ルールとしては
・引数の数は3か4である
・$args[0]は1か2か3である
・$args[1]は1-100である
・$args[2]は$args[0]が1か3の場合1-100で$args[0]が2の場合1-10である
・$args[3]は$args[0]が3のもので英数字が入る ただし1文字目は数字はいけない
素直にコードにするとこうなります
function foo(...$args)
{
$len = count($args);
switch ($len) {
case 3:
if ( ($args[0] === 1) && ($args[1] > 0) && ($args[1] <= 100) && ($args[2] > 0) && ($args[1] <= 100) ) {
// pass
} elseif ( ($args[0] === 2) && ($args[1] > 0) && ($args[1] <= 100) && ($args[2] > 0) && ($args[1] <= 10) ) {
// pass
}
break;
case 4:
if ( ($args[0] === 3) && ($args[1] > 0) && ($args[1] <= 100) && ($args[2] > 0) && ($args[1] <= 100) && (ctype_alnum($args[2])) && (!ctype_digit($args[2][0]) ) {
// pass
}
break;
}
}
もうちょっときれいにかけたら書きたいです
これでは見直すたびに鬱になりそうです アプリケーションの文字エンコーディングがUTF-8で統一されている時、
<input>要素から送られてくる文字列の文字エンコーディングの検証は必要ですか? >>455 こういうコード書く奴とは一緒に仕事したくないなと思う 引数の数チェックいるか?俺なら最大4つ想定して無視するが
$list($w, $x, $y, $z) = $args;
switch ($w) {
case 1:
case 2:
case 3:
}
でわけたほうがすっきりする
filter_var($x, FILTER_VALIDATE_INT, [
'options' => [
'default' => FALSE,
'min_range' => 1,
'max_range' => 100
]
]);
(function($x) {
if (is_int($x) && $x > 0 && $x <= 100) return $x;
else return FALSE;
})($x)
こうしてみると下はシンプルだけど上の方がより直感的でわかりやすいと思う バリデーションは本当面倒だよね
なんかいいライブラリない? PHPで制御文字を除去する仕組みを学んでいるのですが、肝心の制御文字の送信方法がわかりません。
ツールなどを使わなければ制御文字は送信できないのでしょうか。
詳しい方、アドバイスをください。
よろしくお願いします。 ADCEBという文字列があるとし、
BとCとDの文字のうち、どの文字が最初に来るのか調べて、
最初に来た文字を変数にしまいたい場合、どのようにするのが
いいでしょうか?
>BとCとDの文字のうち
この部分はAとBを調べたかったり、CとDとEを調べたかったり
可変なのでどう処理すべきか悩んでいます。 >>465
言葉足らずだったので補足です。
ADCEBという文字列の中で、「BとCとD」の文字うちどれが最初に来るのか
調べたい、ということです
この例だとDが答えです。 全部の順序調べたりする必要もなく
最初に見つかったの返すだけならstrposすらいらぬ
$str = 'ADCBE';
$array = ['B', 'C', 'D'];
for ($i = 0; $i < strlen($str); $i++) {
foreach ($array as $char) {
if ($str[$i] == $char) {
echo $char;
break 2;
}
}
}
もうちょいコード短くしたいならforeachのとこはin_array使えばいい
つうか初心者スレ案件 >>465
ほい
$text = "ADCEB
";
if(preg_match("/([DEF])/",$text,$m))
echo $m[1];
>>468
ダッさwww 配列作ってfor/foreach回すと遅重くなるよね?
文字列操作のstrposを必要なだけ並べてやった方が速軽いんじゃないかな? みなさんありがとうございます。
>>470さんのものが簡潔なので利用させていただきます。
preg_matchをこう使う方法もあるのですね…驚きです。
ありがとうございました。 計算量考えたコード書けよ
preg_matchなんて短いだけだからな >>465-466の条件でならstrposよりも早そうだけどな
計算量だけがボトルネックじゃないから
例えば最速であろうハッシュマップを参照するのも
array_key_existsみたいな関数使わんといけないし(じゃないとエラー出る) $str = 'ADCBE';
$array = ['B', 'C', 'D'];
$pos = strlen($str) + 1;
foreach ($array as $char) {
if (($idx = strpos($str, $char)) !== false && $idx < $pos) $pos = $idx;
}
if (strlen($str) > $pos) echo "found {$str[$pos]}";
preg_matchのほうがちょっとだけ早い
1文字でいいならpreg_matchのほうがよさそう preg_matchでパフォーマンスも読みやすさも十分だろうに 複雑なバリデーション以外に正規表現は使うべきでない
それも正規表現以外には手がないという最後の最後
1文字チェックに使ってたら笑うわ
>if (($idx = strpos($str, $char)) !== false && $idx < $pos)
if (($idx = strpos($str, $char)) < $pos)
でいいしこれでpreg_matchなんてぶっちぎれるだろ >>478
なんか速そうに見えるだけのコードよりも
ライブラリ内で爆速で動く方がそりゃ速いよ >>476 逆
$str = str_split($str);
$array = implode('', $array);
foreach ($str as $char)
if (strpos($array, $char) !== false)
return $char; 先頭のほうで見つかる保証がないのならあんまよくない。 >>481
面白いけど、まだ遅いね
サービスで$strと$arrayの生成をループの外に置いても
実測でpreg_match版の1.5倍くらい遅い iconv_strlen()ってmb_strlen()と何が違うんや・・・ array_intersectとか使う方法を思い浮かんだが
コードは短くてもどう考えてもおせえな >>483
自分の環境だとpreg_matchより倍ぐらい速かったよ
GoogleCloud GAE PHP5.5の環境で1000回実行したときの時間
preg_match 1.7ミリ秒
strpos 0.8ミリ秒
ちなみに配列ブン回すロジックは1.9ミリ秒だった 468、476、481 はプログラマの適正なし!
ふつうのコードは470だろ
計算量?速度?そんなの元の質問にねーよw >>487
言われなくても考慮するのがプログラマってもんだろ ユーザビリティに影響するなら考慮するけど、
>>486にもあるように0.0008秒の差でしょ。それ考慮して何かあるのけ 正規表現は荒れるからやめろよ
>>468はとても説明的で初心者向けだと思うがな >>489
この測定はあくまでも5文字から3文字分の先頭を求めるロジックの測定
質問者が例題でそうしただけでとんでもない容量のデータを対象にした場合は結果も変わってくるでしょう
preg_matchはレングスによっては動作しなくなるみたいだし >>487
速度の話になって対比で書いただけだから
ま、実際strpos使って正規表現は使わんけどね 単純検索や置換で正規表現止めとけは分かるけどこの内容なら普通に正規表現でいいわ /[DEF]/
$m[0]
でいいだろ
グルーピングする理由がない >>491
>preg_matchはレングスによっては動作しなくなるみたいだし
これマジ? どのくらいから動作しなくなるの?
ちょっとソース教えてクレメンス >>491
100回でも0.1秒差だぞ
>>465の処理をそんなにループさせる場面を想定してるの?w
それともこんな変な処理ばっかり押し付けられてるの? >>496
一回では測定出来ないから1000回の時間で比較しただけだよ >>495
気になったので試してみた
4億8000万文字でも大丈夫だった
$text = str_repeat ( 'D' , 480000000 );
if(preg_match("/([DEF])/",$text,$m)) echo $m[1];
4億8000万文字はphpがエラーになった。
$text = str_repeat ( 'D' , 490000000 );
制限無いと思う
>>491
嘘つきは朝鮮人の始まりだぞ >>487
ペチパーってレベル低いな
そのまま解こうとしててバカみたいだわ
>>465の要件がおかしいんだからそれを直せよ 単純な文字列検索は配列でもstrposのほうが安全 if (preg_match('/[DEF]/', $text, $matches)) {
// $matches[0] <-
}
って書いといてパフォーマンスが気になるなら計測してから直す
最初からパフォーマンスが―ってのは無能 >>470はきれいなサンプルコード書いてやれよに呼応して出したんだろ
JavaScriptの小技的なサイトにのってそうな初心者受けしそうなコードじゃないか
質問者も満足して帰ったんだしそれでええだろう スレ的にはトリッキーでも面白いコードをみたいところだが
そんなコードが出てきても
速度 読みやすさ コードの長さ どれかに欠点もっててボロクソ叩かれる運命 >>506
動かなかったのは仕様をちゃんと読まなかった私の責任です
と書いてあるね >>507
質問者はpreg_match使うって言ってたからこの辺のリスクも知ってもらわないといけない /[DEF]/とかバックトラックも再帰もスタックもO(1)だろ >>499の言う通り
どうせ実際の用途は違うんだろ 正規表現のほうが改修ラクだしいいだろ
文字一文字じゃなく文字列になった場合でもちょっと変えるだけで済むし 改修が楽なわけないじゃん
strposなら配列に文字列のリスト突っ込むだけに対して
正規表現は何するつもりだ?orでつなぐのか?アホくさw 正規表現はどうしても荒れるね
>>512みたいな低レベルが自覚せずにしゃしゃりでてくる >>513
じゃ答えてみろよ
まさかただの文字列検索にpreg_matchで配列渡すとか愉快なこというんじゃないだろうな? >>514
その前に君の意見をどうぞ
随分と高尚なのでそれに見合った意見があるのだろう
別にコードで書かなくてもいいぞ 正規表現に変数突っ込むのはあかんのか?
<?php
$text = "ADCEB";
$match = "DEF"
if(preg_match("/([".$match.""])/",$text,$m))
echo $m[1]; >>515
>>512で答えてんだろうが
理解出来ない雑魚は引っ込んでろよ 3日間も大盛り上がりしてるから仕切り直してみよう
"PHPに関する質問や雑談をするスレです。" *1
この文字列において、
("PHP","質問","雑談") *2
の単語のうち最初に出てくる単語を返しなさい
実際の運用において*1の文字列は大変長いものであり、
*2の単語や数は変わりうるものとし、
実行速度を考慮した上で最適なコードを述べよ
ファイッ >>519
大変長いってのはマジでやめてw
保守性だけに笑点しぼってほしい ああ、スマン
複数の文字列から検索ってのに脳内変換してた
$match = ["DEF", "CEB"];
foreach ($match as $var)
if (strpos($text, $var) !== false) //match
アホくさと言ったコード↓
$match = implode("|", $match);
if (preg_match("/(".$match.")/", $text)) //match
>>516見て>>511の言いたいことは理解した
preg_match("/(".$match.")/", $text)って言いたかったのね
ただそれだとpreg_match使う意味が全くないし
strposに比べて改修楽って主張も全く意味わからんけど >>512
| を知らんのか?正規表現を知らない初心者かよ >>522
こいつ殴っていい?
orと|が別物とか言っちゃうの? >>519
$pdo = new PDO("sqlite::memory:");
以下略 <?php
$text = "PHPに関する質問や雑談をするスレです。" ;
$match = ["質問","雑談"];
$boolean = strpos($text,$match);
if($boolean){
var_dump($boolean );
}
これあかんのか strposに配列渡せるのは知らんかったわ
うえのほうでforeachで回してるもんだからてっきりそういうもんかと
オーバーロードはマニュアル分けてほしいわややこしい クライアントが使っているレンタルサーバーが全部5系で絶望中
7系に対応してないサーバーや、7.0系にしか対応してないサーバーが多い
5系でも5.6系じゃなくて5.1系とか5.3系とかとっくに死んでるのも多い
5.1系でWP4系を動かしてる無茶なサイトもあるし
そもそも互換性がないから安易に7系に移行できない
セキュリティーサポート終了は知らなかったことにしたい
あるいはガッツリ金と時間を取って対応したい クライアントからクレーム来た
アルファメールのphpバージョンが5.4→7.0
どっちにしてもセキュリティ的に問題があるだろってさ
知らんがな、それ選んだのは君だろう >>529
うおっとすごい奇遇だね
なんか流行りでもあるのかね。スパムメールで営業でもしているのだろうか
とりあえず金とって対応スべきだとは思う
これはハイハイといっていい案件ではないわ array()とかcreate_functionとか書かなきゃいけないサーバは勘弁してほしいわ >>531
金と時間の話も絶望的だが仮に金と時間が取れたとしても
全てのクライアントのサーバー引っ越し作業が必要になる絶望感 >>529
うるせーぞ
保守案件とはいえ いまだに4.4使ってんだこっちは ■ このスレッドは過去ログ倉庫に格納されています