X



【PHP】下らねぇ質問はここに書き込みやがれ 10
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん (ワッチョイ cfe8-+65u)
垢版 |
2018/11/28(水) 17:08:46.02ID:Nb5yTkdM0
PHPに関する質問スレです

前スレ
【PHP】下らねぇ質問はここに書き込みやがれ 9
http://mevius.5ch.net/test/read.cgi/tech/1513760420/

次スレは>>980以降
本文の1行目に以下を追加すること
!extend:on:vvvvv:1000:512
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
0786デフォルトの名無しさん (オッペケ Sr0b-B6qE)
垢版 |
2020/02/08(土) 09:15:29.74ID:dJyCpuORr
mysqli関数使ってるんだが、PDOについて質問です。

別のDBMSに乗り換えるときに便利、みたいな記事をよく見ますが、DBMSごとにSQL文の制約が少しずつ違いますよね?

この差はPDO自体は吸収できませんよね?コードで分岐するしかないんですよね?

すると、MySQLしか使わない限りは、PDOを使うメリットって何でしょうか?
0788デフォルトの名無しさん (ワッチョイ d7a7-QQjh)
垢版 |
2020/02/08(土) 14:08:52.88ID:iOIJiyGE0
>すると、MySQLしか使わない限りは、PDOを使うメリットって何でしょうか?
自分で使うもので将来的な移行もありえないならメリットは特にない
pdoのほうがよりモダンなコードで書けるぐらいか
パフォーマンスは公式にも書いてるけどどのAPI使ってもほぼ同じで誤差程度
0791デフォルトの名無しさん (ブーイモ MM0e-gsGW)
垢版 |
2020/02/12(水) 17:49:58.19ID:qFSwmyrvM
アップロードしたファイル名をDBに書き込んでファイルはtmpディレクトリに保存しておくときって
ファイルの名前はハッシュ値に変えるべきかそのままのファイル名で処理するかどっちがいいの?
0793デフォルトの名無しさん (ワッチョイ 5eda-OxJ8)
垢版 |
2020/02/15(土) 18:10:33.43ID:ndNA2Bw/0
下記記述のようにグローバルな場所で $arr を出力することはできたのですが、
関数の中で出力するとエラーになってしまいます。
PHPだと親に位置する変数って参照できないのでしょうか?


$arr = [
'a' => 1,
'b' => 2
];
var_dump($arr);

function test() {
var_dump($arr);
};
test();
0796デフォルトの名無しさん (ワッチョイ 8689-RqZf)
垢版 |
2020/02/15(土) 22:52:13.91ID:wgObr5UE0
質問です。
色の近さを測る方法ってあるでしょうか?
例えば、
A.#4169e1 B.#ff7f50 C.#dc143c
があった場合、Cにより近い色はAとBどちら?
といった感じで使いたいです。
0797蟻人間 ◆T6xkBnTXz7B0 (ワッチョイ a701-ZWcj)
垢版 |
2020/02/15(土) 23:32:30.86ID:f7hi9XcW0
色コードといえば、RGBとかHSVとかCYMKとか習うと思うけど、これらは数学的にいうと、(ベクトル空間みたいな)色空間上の位置を持った点を意味する。
色の近さは色空間での2点間の距離の長さ。というわけで、色空間と距離の定義しだい。
0799デフォルトの名無しさん (ワッチョイ 8689-RqZf)
垢版 |
2020/02/16(日) 00:14:57.82ID:KR6y1seH0
思った以上に難しそうだな…
16進数だからC-AとC-Bを行い絶対数の小さい方が似てる色くらいに思ってたぜ
0802デフォルトの名無しさん (ワッチョイ 46ca-MwwC)
垢版 |
2020/02/16(日) 03:32:24.89ID:Tw+Vg2AB0
色の近さの判断基準が分からんとな。
とにかくRGBをHSVなりに変換したとして、
色相(H)が近ければ濃さ(S)や明るさ(V)はどうでもいいのか?
どうでもよくないならそれぞれのパラメータの重みを決める必要があるな。
0806デフォルトの名無しさん (ブーイモ MMa7-mtzg)
垢版 |
2020/02/21(金) 10:38:09.06ID:uhz6TO4QM
csvをアップロードして中身読み込んで確認画面を出して問題なければDBに登録する仕組み作ってるんですけど
ページ間のデータ渡しって2Mくらいのそれなりに大きいデータでもセッションで大丈夫ですか?
0807デフォルトの名無しさん (オイコラミネオ MM47-1Tph)
垢版 |
2020/02/21(金) 11:04:55.83ID:KI0NB2iSM
セションの中身はディスクに書いてるんだろうから、2MBくらいなら保存自体の問題は無いんじゃね。
でも不要になったらセッションからさっさと削除しないと、毎回そのデータがメモリにロードされることになる。
セッションとは別に一時ファイルに書き出してそのファイル名をセッションで保持するのがスマートな気がするけど、一時ファイルの掃除の方法を別途考えないといけないのが面倒だな。
0810デフォルトの名無しさん (ワッチョイ 8f89-sS5o)
垢版 |
2020/02/23(日) 17:03:54.18ID:LPteoL8J0
preg_match_allを使ってリンク先が画像のURL取得したいんだけど正規表現がわかりません。

これを↓
<a href="http://img.hoge/001.jpg"; target="_blank">
こうしたい↓
http://img.hoge/001.jpg
作ってみたのがこれ↓
preg_match_all('/href="(.*?)(jpg|jpeg|png)?"/', $html, $imgurllist);

わかる方いらっしゃいました教えて下さい。
0813デフォルトの名無しさん (ワッチョイ a3a7-icXw)
垢版 |
2020/02/23(日) 18:39:43.25ID:p2aTkQco0
なんでもかんでも正規表現でやらんほうがいいよ
ちゃんとしたの書くの難しいし何より自分がわからないのは良くない
多少時間はかかるかもしれないが
getElementsByTagName('a')->getAttribute('href')でa hrefのリストとってきて
1個ずつpathinfo['extension']を見ていく感じ
pathinfo['extenstion']の?以降を除外してstrtolowerで拡張子小文字にした上で
in_arrayあたりで比較すればいいんでは?
0820デフォルトの名無しさん (ワッチョイ ffad-C6+A)
垢版 |
2020/02/23(日) 21:13:29.11ID:0sUq9sLC0
>>818
自分が有能と勘違いしてるプログラマにありがちだな
教えて→こんなこともわからないの?底辺!→はよ教えて→考える力が身につかないよ!自分でやれ!→はよ教えて→無言で逃走
0821デフォルトの名無しさん (ワッチョイ 6fda-Nz9x)
垢版 |
2020/02/23(日) 21:37:24.28ID:rIVuphj20
先輩が書いたコードを見ると $_SERVER などの取得する値に対して
urldecode やら isset やらで本当にその値か正しいものかどうか、セットされてるかどうか
毎度調べてるようなのですが、正しくない場合の事例が書いてあるサイトってありますか?

また、この手のエスケープや存在確認やらがまとめてあるサイトもあれば教えていただけますでしょうか。
自分では追っかけきれず、毎度先輩に迷惑掛けてしまっている状態で申し訳ないっす…
0823デフォルトの名無しさん (ワッチョイ 3308-p4c1)
垢版 |
2020/02/24(月) 11:46:26.32ID:/D+Ss1rU0
>>821
$_SERVERで取れるのは環境変数
環境変数って言うぐらいだから、その値が必ずある保証なんてないし、めちゃくちゃな値をセットする事もできる

例えば
$_SERVER['HTTP_USER_AGENT']
とかな。自分でめちゃくちゃな値をセットして自分で実験してみたらいい

isset()なんか使わんけどねw
あるか無いか分からない時は getenv() 使えばいい

urldecode()にいたっては検証用の関数ですらない
URLエンコードされたデータをデコードしてるだけ

なんていうかHTTPの基礎から理解できてない
とりあえずGoogle Chromeのデベロッパツールでも眺めてHTTPの流れから理解した方がいいんじゃね?
0824デフォルトの名無しさん (ワッチョイ 3308-p4c1)
垢版 |
2020/02/24(月) 11:58:40.79ID:/D+Ss1rU0
>>818
ペチパーはクソ正規表現をネットに載せるな!って昔からよく馬鹿にされるからなぁ…

まずは>>813のようにHTMLをパースする別の手段を検討すべき
その上であえて正規表現を選ぶってのなら別にいいけどさ
0825デフォルトの名無しさん (ワッチョイ 3308-p4c1)
垢版 |
2020/02/24(月) 12:00:32.05ID:/D+Ss1rU0
>>810
くそ適当に書くけど

$html = '<a href="http://img.hoge/001.jpg"; target="_blank">';

preg_match_all('/href\s*=\s*([\'"])(.+?\.(?:jpe?g|png))\\1/i', $html, $match, PREG_SET_ORDER);
print_r($match);

・大文字小文字の考慮
・スペース文字の考慮
・シングルクォートで挟むのかダブルクォートで挟むのかの考慮

正規表現を使うならせめてこれぐらいはしようよw
0827デフォルトの名無しさん (ワッチョイ 8f89-sS5o)
垢版 |
2020/02/24(月) 12:27:06.58ID:bCyGnyrg0
>>810です。
皆様ありがとうございます。
勉強不足であると実感しました。
URL取得はうまくいきました。
0831デフォルトの名無しさん (ワッチョイ 3308-p4c1)
垢版 |
2020/02/24(月) 19:35:47.79ID:/D+Ss1rU0
>>830
上のタブでNetworkを選んでHeadersのところを見る

Request Headersに書かれてるのが、ウェブサーバに対するHTTPリクエストの内容

例えばそこにAccept-Encoding: gzip とあれば
ウェブサーバがそれを見てコンテンツをgzip圧縮してレスポンスとして返す
そしてウェブブラウザがそれをデコードして元に戻す

User-Agentなんかも書かれてるはず


Accept-EncodingにせよUser-Agentにせよあくまでも自称であり、
そこには嘘でもめちゃくちゃな文字列でもなんでも書けるんだよ
だから値を信用したら駄目ってこと
0832デフォルトの名無しさん (ワッチョイ 3308-p4c1)
垢版 |
2020/02/24(月) 19:42:59.09ID:/D+Ss1rU0
>>830
自分でHTTPクライアントを作ってみるのが一番いい
fsockopen()やstream_socket_client()あたりでサーバに接続して
HTTPの命令を送ってレスポンスを受け取るみたいなコードを書けばHTTPの流れは一発で理解できる

「PHP stream_socket_client HTTP/1.1」とか適当にググったら、たぶんサンプルコードは見つかるはず
0833デフォルトの名無しさん (ワッチョイ ff2c-lQWV)
垢版 |
2020/02/24(月) 20:05:32.49ID:ZFXUbFog0
漏れは、5ch の投稿から、画像のリンクだけを取り出すために、
Ruby で、こういうモジュールを作っている

module MyUtility
require 'uri'

@@EXTS = %w(png jpg jpeg gif) # 画像の拡張子

# 画像の拡張子かどうか?
def check_picture_extname? ( picture_url )
return false if picture_url.empty?

begin
uri = URI.parse picture_url
rescue # 半角以外の文字
return false
end

file_name = File.basename(uri.path) # ファイル名
file_extname = File.extname(file_name) # 拡張子
return false if file_extname.empty?

# . を削除して、小文字にする
file_extname.delete!(".").downcase!

@@EXTS.include? file_extname # 含まれている?
end

module_function :check_picture_extname? # 公開
end
0838デフォルトの名無しさん (ワッチョイ 4f89-x1Qw)
垢版 |
2020/03/07(土) 21:24:50.43ID:0OcB8lvE0
質問です。
テキストファイルにキーワードが書いてあり、
それを読み込んで一致する文字列があったらtrueを返します。
しかし、たまに一致箇所があるにも関わらずスルーされる場合があります。
なぜでしょうか?
判定は↓のような感じです。
strpos($str,'キーワード') !== false
0839デフォルトの名無しさん (ワッチョイ 9fad-j73r)
垢版 |
2020/03/07(土) 22:30:19.72ID:olnFzWkU0
>>838
再現性のある最小コードをどうぞ
$strとキーワードじゃエスパーじゃないと分からん
0841デフォルトの名無しさん (ワッチョイ 4f89-x1Qw)
垢版 |
2020/03/07(土) 23:48:46.74ID:0OcB8lvE0
すみません。
解決しました。
原因は、テスト用のフォルダのパスのままになっていたことと
試運転時のデータが一部使われていた事により
一部検出されていないというおかしな状態になっているということでした。
0843デフォルトの名無しさん (ワッチョイ 4bda-R/kF)
垢版 |
2020/03/08(日) 16:38:04.82ID:o6nDRKvt0
die();
exit();
exit は言語構造です。 status を指定しない場合は括弧なしでコールできます。

って今知ったわー
0844デフォルトの名無しさん (ワッチョイ 86da-drwQ)
垢版 |
2020/03/13(金) 02:12:30.03ID:iVXMMcFW0
foreach ($this->_db->query($sql) as $v) {...}

query()やprepare()で準備した文はexecute()必須だと思ってましたが
↑の記述ではexecute()なしでSQL文を実行できているようでした
何故でしょうか?
0846デフォルトの名無しさん (ワッチョイ 69f1-ZSAD)
垢版 |
2020/03/13(金) 13:42:16.08ID:3oUhS72l0
->
=>

がよく混同する。
どれがどの用法かを一発で覚える方法ある?
数ヵ月以上使っていなかったり他言語やってたりすると覚えるのは困難。
0847デフォルトの名無しさん (ワッチョイ 86da-drwQ)
垢版 |
2020/03/14(土) 09:55:43.61ID:Vu/3uGwv0
>>845
どうも
$sql のSQL文は下記なのですが、直接実行できるときとできない場合の
見分け方ってありますでしょうか?
$sql = "select answer, count(id) as c from answers group by answer";

bindValue() とかをかましているときに execute() 使っているようなので
プレースホルダの置換しなければおk的な感じなのでしょうか?
0849デフォルトの名無しさん (ブーイモ MM8d-ZSAD)
垢版 |
2020/03/14(土) 12:06:04.05ID:ftz/XzuIM
>>846
いまだ自己解決しません
0850デフォルトの名無しさん (ワッチョイ 068c-WOeG)
垢版 |
2020/03/14(土) 19:01:35.17ID:B3THKCTN0
>>846
->これはアロー演算子だから
オブジェクトとかクラスとか呼び出したときにメソッドを呼び出すときに使うから
クラス名->メソッドとかで
=>これは普通の演算子以下とか以上とかで使うやつだから
0852デフォルトの名無しさん (ブーイモ MM8d-ZSAD)
垢版 |
2020/03/14(土) 19:58:46.89ID:hEp1GdU0M
>>850
このウソつきめ
0853デフォルトの名無しさん (ワッチョイ 7d02-FfQu)
垢版 |
2020/03/14(土) 20:34:45.23ID:GFwOalat0
>>850
You are a liar!
0854デフォルトの名無しさん (ワッチョイ 068c-WOeG)
垢版 |
2020/03/15(日) 12:42:37.91ID:dxrxQoIU0
>>850
間違ってたわ、=>これは配列で添字で関係持たせるときに使うやつだったわ
謝罪しておきます
0856デフォルトの名無しさん (ワッチョイ 69d2-WWFo)
垢版 |
2020/03/16(月) 05:40:39.73ID:3OE3knP80
>>846
-> は「の」
=> は「は」
0857デフォルトの名無しさん (ワッチョイ 69f1-5Ayy)
垢版 |
2020/03/16(月) 10:12:02.17ID:n/UZHZ/90
>>856
その説明ではわかりません。

まず
・象は鼻は長い
・象の鼻は長い
の違いを教えてください
0860デフォルトの名無しさん (ワッチョイ 1389-xsY/)
垢版 |
2020/03/22(日) 17:15:31.58ID:R2yf6A3f0
質問いいでしょうか?
ローカル環境XAMPPで動かしています。
外付けHDDから画像を表示させようとしたところ見つからないというエラーが出ました。
[an error occurred while processing this directive] 要求された URL は本サーバでは見つかりませんでした。 もし手入力で URL を入力した場合は、綴りを確認して再度お試し下さい。 [an error occurred while processing this directive]

リンクをコピーで確認したところURLの前に「http://localhost」が勝手に追加されていました。
これのせいで上手く表示されていないようです。
なんとかして画像を表示させる方法はないでしょうか?
0863デフォルトの名無しさん (ワッチョイ 1389-xsY/)
垢版 |
2020/03/22(日) 18:26:04.76ID:R2yf6A3f0
ウ〜ンやっぱ無理か
一時的にコピーくらいしか思いつかんな
データとして貼り付けるにして多いし重すぎる
0866デフォルトの名無しさん (ワッチョイ 1389-xsY/)
垢版 |
2020/03/22(日) 22:18:36.23ID:R2yf6A3f0
>>865
フルパスでやってる
ドライブ跨ぐと駄目なんだろうな
0868デフォルトの名無しさん (ワッチョイ fbda-ED79)
垢版 |
2020/03/22(日) 22:54:04.30ID:D4yHaglA0
相乗りで質問させてください。

>>867 のリンク先に書いてあるような設定を済ませて、chromeでは〇〇〇.localhostといった
URLで開けるようになったのですが、それ以外のブラウザではエラーが出てしまい開けません。
改善方法はありますでしょうか?

PHPと関係ないかもしれませんが、該当スレも見当たらず…
どうかご回答よろしくお願いいたします。
0871デフォルトの名無しさん (ワッチョイ 8b2c-cvBQ)
垢版 |
2020/03/23(月) 07:16:27.59ID:jGS2rL5b0
Windows 10, WSL, Ubuntu 18.04 で、Ruby なら、Linux 側で、
1-liner で、Rubyで作られた遅いウェブサーバー、WEBrick が起動する

ruby -run -e httpd . -p 8080

そのフォルダに、index.html があれば、
Windows側から、これでブラウザでアクセスできる

http://localhost:8080

Linux側も、C ドライブ内にあるからかな?

アクセスするサーバーが、どのドライブのどのフォルダ内を、
カレントディレクトリとして起動したか
0872デフォルトの名無しさん (オイコラミネオ MM55-94HG)
垢版 |
2020/03/23(月) 21:22:44.81ID:w/tA8drNM
2ch風の掲示板を作ってます。
datファイルで一行に名前・メール・メッセージと管理用のIDやらを
記述するやり方で、レスアンカーやurlをループ処理の中で出力時に
aタグで囲む方法が思い付きません。

正規表現でメッセージから有無の判定はできましたが、そこから先で詰まってます。
ヒントをください。
0876デフォルトの名無しさん (ワッチョイ b6da-Cd0d)
垢版 |
2020/03/25(水) 23:42:46.36ID:YJCiq0GG0
>>874
下記記述で行けました。
本当にありがとうございました(涙)
preg_replace('/&gt;&gt;([0-9]{1,3})/', '<a href="#$1">>>$1</a>', $message);

ちなみにセキュリティに対して理解が浅すぎるのですが、渡ってくる文字列に対して警戒していればおkで
置換でa要素を使ったり、HTMLエンティティ対象の文字列をそのまま書いても大丈夫なのでしょうか?
0877デフォルトの名無しさん (ワッチョイ b1a7-B4Y8)
垢版 |
2020/03/26(木) 08:37:27.85ID:uQPl4pkP0
5chはテキストログで1レス1行が都合が良さそうなのと区切り文字が必要になるので
そのへんの改行(<br>)と区切り(<>)考慮するとエスケープ済みのほうが扱いやすい
ただ欠点としてはログサイズが肥大する
もちろん必要最小限のエスケープでもできるけどめんどくさいので完全再現じゃないが

ログ保存時
$message = preg_replace('/\r?\n/', '<br>', htmlspecialchars($_POST['message'], ENT_QUOTES, 'UTF-8'));

出力時
$message = preg_replace(['/&gt;&gt;([0-9]{1,3})/', '%(https?://[^\s&]+)%'], ['<a href="#$1">&gt;&gt;$1</a>', '<a href="$1">$1</a>'], $message);

とかなんじゃないかなと
リンクつける仕様上一旦エスケープしたのを戻す箇所があるので
そこでXSSを成立させないよう注意してコーディングする必要がある
エスケープ済みの文字は&lt;や&quot;のように&がつくので
[^\s&]のとこのように&でぶったぎるのが簡単
ちなみにurlの複数パラメータでも使われる&の扱いは面倒なので適当だけど
>>835のように&でリンク切れてるの見る限り5chも適当なのでおkってことで
0878デフォルトの名無しさん (ワッチョイ b6da-Cd0d)
垢版 |
2020/03/26(木) 22:20:23.54ID:pJp2pNNg0
>>877
詳しくありがとうございます。
5chのログの内容は最初にチェックしてたはずなのに、すっかり忘れてました。
再度確認したところ、エスケープ処理済みな上にタグまで付いてました…

てっきり出力前にエスケープするのがPHPのルールだと思ってたのですが、
まさか事前にエスケープしておくとは…

出力時のpreg_replaceも配列にすれば一回で済むのですね…
レスアンカーとリンクで分けてました

>>835のリンクについては、専ブラで見てたので気づきませんでした。
直リン避けも考慮してhttps://まで見て、後は半角英数なら置換対象に
してしまおう!…って感じで雑に考えてました。
preg_replace('/(h?ttps?:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:@&=+$,%#]+)/', '<a href="$1">$1</a>', $replaceMessage);

凄く参考になりました。
どうもです。
0879デフォルトの名無しさん (ワッチョイ 09da-Cd0d)
垢版 |
2020/03/29(日) 10:25:07.65ID:wUzzaaBN0
文字列と多次元配列の値に対して一括で処理できるメソッドで質問です。

下記メソッドで$hogeに多次元配列が渡ってきたと仮定しまして、
値が配列であれば再起処理でメソッドが再度呼び出されるそうです。

私の考えでは、再起処理で多次元配列の中の値が配列ではなかったときは、
Aの文字列の方に流れるのではと思っていたのですが、実際は@に流れるようです。

多次元配列の中の文字列にis_array()を掛けてもfalseなのですが、どういった理由で
@に流れるのでしょうか?

function test($hoge) {
 // 配列の場合
 if (is_array($hoge)) {
  foreach ($hoge as $key => $value) {
   // 再起処理
   if (is_array($value)) {
    test($value);
   }
   // @配列の中の値が配列でない場合
   else {
    ...
   }
  }
  return;
 }
 // A文字列の場合
 return;
}
0880デフォルトの名無しさん (ワッチョイ b1d2-pf+t)
垢版 |
2020/03/29(日) 12:47:17.78ID:XdbgZgVO0
@は再帰呼び出しで、Aは再帰の終了条件だね。
配列の中に配列があったときは@が呼ばれるようになってる。
再帰を一度じっくり勉強したほうがいいよ。誤字も含めて。
0881デフォルトの名無しさん (ワッチョイ 09da-Cd0d)
垢版 |
2020/03/29(日) 14:07:51.77ID:wUzzaaBN0
>>880
誤字失礼しました。

どうにも理解できなくて、再度質問しようと文字に起こしていたところ自己解決できました。
Aは文字列専用の終了条件で@は配列専用の終了条件だったようです。

再帰処理の際に値が文字列なのに、何で配列判定で true が出るのだろう?
というところが疑問だったのですが、
本来であれば配列の中の配列である [] で再帰処理されるところを、その中の値Bで
再帰処理されていると勘違いしておりました。

ご迷惑おかけしました。

$hoge = [
 'piyo1',
 'piyo2',
 [
  // B
  'piyo3'
 ]
];
0882デフォルトの名無しさん (ワッチョイ adda-Cd0d)
垢版 |
2020/03/29(日) 15:05:54.62ID:r8VR5IyJ0
書き方としては終了条件を早期returnして終了するべき(そうじゃないとひどく読みにくい)

一般化するなら

function apply_recursively($target, callable $callback) {
if (!is_array($target)) {
return $callback($target);
}

return array_map(function ($target) use ($callback) { return apply_recursively($target, $callback); }, $target);
// return array_map(fn($target) => apply_recursively($target, $callback), $target); // -> for PHP >= 7.4.0
}
0883デフォルトの名無しさん (ワッチョイ a9ca-Emx9)
垢版 |
2020/03/29(日) 19:30:19.50ID:KCykJRwi0
>>879
foreach 直後の if は不要で無条件に test($value) を行い、
Aは else にして @ に書いてた処理を書き、
関数の引数は function hoge(&$value) で参照で受けとるようにし、
foreach も foreach($hoge as &$value) にする。
こうしないと動かなくない?
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況