【PHP】下らねぇ質問はここに書き込みやがれ 14

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 0f97-W3aP)
垢版 |
2022/09/20(火) 16:46:23.39ID:Sb2Kpzh+0
!extend::vvvvv:1000:512
!extend::vvvvv:1000:512
★スレ立て時 ↑ が3行以上になるようコピペ

PHPに関する質問スレです

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

次スレは>>980以降
VIPQ2_EXTDAT: default:vvvvv:1000:512:: EXT was configured
VIPQ2_EXTDAT: default:vvvvv:1000:512:: EXT was configured
2022/09/23(金) 12:52:58.86ID:hnZdjJ3nd
1乙
2022/09/24(土) 13:08:46.11ID:BHAYvVt70
>>1
8.2
4デフォルトの名無しさん (ワッチョイ 1251-w3Il)
垢版 |
2022/09/28(水) 15:20:22.87ID:kZGixsXA0
try catch構文がなぜか機能しない(´・ω・`)
単純なゼロ除算をキャッチさせてみるだけでも、catch構文のほうに行かず停止してしまう。
try {
$num = 5/0;
} catch ( Exception $ex ) {
//例外時の処理
}

JavaやC#だったら、こういうふうに書けばどんな種類の例外でも拾ってくれますが、PHPの場合ちょっと違うのですか?
2022/09/28(水) 15:46:24.05ID:Jk2txA1W0
\Exceptionにしたら動くかも?
6デフォルトの名無しさん (ワッチョイ 1251-w3Il)
垢版 |
2022/09/28(水) 15:59:48.05ID:kZGixsXA0
>>5
ありがとうございます。動きました!
PHPだと例外の型の区別方法がよく分からないです。デバッグしてみると全部Exception型?

Javaとかだったらcatch構文で、例外オブジェクトの型の違いでこうやって分けられたのですが。
catch(HogeException) {
//HogeExceptionの例外処理
} catch(FugaException) {
//FugaExceptionの例外処理
}

PHPの場合どうやって分岐しますか?
エラーコードやエラーメッセージを拾って分ける処理をさしあたり書いて意図したとおりに動いてもいますが、これが正しいやり方ではないような気がします。
2022/09/28(水) 18:16:57.90ID:48qufCUu0
phpでも複数catch出来る
ゼロ除算を他の例外と分けたいならDivisionByZeroErrorやArithmeticErrorあたり
2022/09/28(水) 18:34:37.92ID:o0cHd3Tq0
公式覗いてみた?

一応動くやつ書いてみた

class MyException extends Exception { }
class MyOtherException extends Exception { }

class Test {
public function testing() {
try {
// throw new MyException();
throw new MyOtherException();
} catch (MyException $e) {
var_dump(get_class($e));
} catch (MyOtherException $e) {
var_dump(get_class($e));
}
}
}

$foo = new Test;
$foo->testing();
9デフォルトの名無しさん (ワッチョイ 1251-w3Il)
垢版 |
2022/09/29(木) 09:00:43.80ID:+9krd1sq0
>>7-8
ありがとうございます。それができることは分かりました。
とりあえず\Exceptionで一緒くたにcatchしてみてデバッグし、出てきた例外の「正確な型名」の調べ方が分からないです。

「PHP 例外 型 種類」のようにぐぐっても、ありがなゼロ除算の例外の型名すら、いま教えてもらうまでわからなかったです。
JavaならArithmeticException、C#ならDivideByZeroException、といった型名はちょっと調べればわかりますが、PHPの場合はその資料が無いようで。
2022/09/29(木) 09:08:50.12ID:aAavqPwL0
>>9
何度同じこと言わせるの?
公式読めよ
https://www.php.net/manual/ja/reserved.exceptions.php
11デフォルトの名無しさん (ワッチョイ 1251-w3Il)
垢版 |
2022/09/29(木) 10:11:17.58ID:+9krd1sq0
>>10
ありがとうございます。その資料が欲しかったです。
ぐぐって検索するだけで、公式を丁寧にたどることをしなかったのが悪かったです。
2022/09/29(木) 12:31:32.34ID:cPkvua8F0
>>11
PHPは公式が素晴らしくよく出来てるから、新参素人がQiita等にイキって書く意味がなく、ググッてもヒットしない。
だから、君のレベルなら、まず公式を全部頭から一通り読むのが一番早いよ。(下の例とその下のNotesも含めて)
数日かかるかもしれないが、急がば回れが完全に成立する。

ちなC#もほぼ公式しか要らないほどよく出来てはいるが、あれはリファレンスであって、頭から読む読み物としては成立してない。
これはJS(MDN)もで、MDNは地味に読み物ページも充実しつつあるが、一部逆にリファレンスとしては使いにくくなってる面もある。
Javaの状況は知らんが、そもそも出所不明のコード例をググる必要がある世界観が異常だと気づくべき。
この点はPHPが完全に正しい。
13デフォルトの名無しさん (ワッチョイ dee7-tX/F)
垢版 |
2022/09/29(木) 20:16:25.66ID:E6cxSExy0
実機環境がPHP7.3のプロジェクトのおしごとがあるんだけど
WindowsのXAMPPは 7.4 と 8.1 しかない

ちょいとPHPUNITを動かす用のローカルのPHPは 7..4 でもいいよね?
2022/09/29(木) 20:53:29.90ID:D9meFc200
vagrant+virtualboxなりdockerなり仮想環境でも作った方が良さそうだけどね
2022/09/29(木) 21:14:41.27ID:aAavqPwL0
探せよ...
https://sourceforge.net/projects/xampp/files/XAMPP%20Windows/
2022/09/30(金) 16:30:44.38ID:anKKL5Vh0
入力された値が正しいかどうかをデバックしているのですが、
左辺と右辺の変数の値の評価が期待しているものと違うことを確認しました。

6番目のリストは「1」となることを期待していますが、
そうはなりませんでした。

なぜ、そうなってしまうか、想定できそうな原因ありますでしょうか。
ちなみにphpのバージョンは7.3になります。

-----
phpコード
<pre>
print "<ul>";
print "<li>".$id;
print "<li>".$_POST['login_id'];
print "<li>".($id===$_POST['login_id']);
print "<li>".$pw;
print "<li>".$_POST['pass'];
print "<li>".($pw===$_POST['pass']);
print "</ul>";
</pre>
-----

ブラウザの表示
・1234
・1234
・1
・test
・test

-----
2022/09/30(金) 16:58:56.18ID:tV+EdovX0
>>16
多分スペースとか改行とか入ってんかな
"---$pw---"
みたいに前後に目印入れて出してみたら
18デフォルトの名無しさん (ワッチョイ d697-uxQy)
垢版 |
2022/09/30(金) 17:15:04.25ID:anKKL5Vh0
ありがとうございます。
こういうことでしょうか?
実行すると以下のようになります。
----
phpコード
print "<ul>";
print "<li>".$id;
print "<li>".$_POST['login_id'];
print "<li>".($id===$_POST['login_id']);
print "<li>"."---".$pw."---";
print "<li>".$_POST['pass'];
print "<li>".($pw===$_POST['pass']);
print "</ul>";

----
ブラウザ表示
・1234
・1234
・1
・---test---
・test



ちなみに以下のように変えても結果は変わりません。

print "<li>".($pw===$_POST['pass']);

print "<li>".($pw==$_POST['pass']);
2022/09/30(金) 17:18:39.83ID:3aBoBWM+0
>>16
宿題は自分でやれ
2022/09/30(金) 17:22:10.31ID:tV+EdovX0
>>18
POST側も確認しなきゃ意味ないだろ
2022/09/30(金) 17:22:47.09ID:NBzDpu1o0
bin2hex($pw)

bin2hex($_POST['pass'])
で表示してみたら違いが分かるかも?
2022/09/30(金) 17:26:43.54ID:anKKL5Vh0
$_POST側も目印を入れました。
実行すると以下のようになります。
----
phpコード
print "<ul>";
print "<li>".$id;
print "<li>".$_POST['login_id'];
print "<li>".($id===$_POST['login_id']);
print "<li>".$pw;
print "<li>"."---".$_POST['pass']."---";
print "<li>".($pw==$_POST['pass']);
print "</ul>";

----
ブラウザ表示
・1234
・1234
・1
・test
・---test---
2022/09/30(金) 17:31:33.96ID:anKKL5Vh0
>>21

ありがとうございます!
違いが出てきました。!!!
bin2hex()を調べてみます。

----
phpコード
print "<ul>";
print "<li>".$id;
print "<li>".$_POST['login_id'];
print "<li>".($id===$_POST['login_id']);
print "<li>".bin2hex($pw);
print "<li>".bin2hex($_POST['pass']);
print "<li>".($pw==$_POST['pass']);
print "</ul>";

----
ブラウザ表示
・1234
・1234
・1
・74657374
・2074657374
2022/09/30(金) 17:36:24.68ID:NBzDpu1o0
0x20(スペース)が入っているね
トリムしてもいいならtrim()で前後のスペースを除去する事も可能
2022/09/30(金) 17:36:47.30ID:HxNT59pn0
POSTがおかしいね
' test'になってる
2022/09/30(金) 17:44:13.43ID:anKKL5Vh0
おっしゃるとおりです。
フォームに半角スペースが含まれていました。

これに気づかず数時間ハマってました。
ありがとうございました。

----
ブラウザ表示
・1234
・1234
・1
・74657374
・74657374
・1
2022/09/30(金) 18:20:29.34ID:3aBoBWM+0
>>26
やってる事がおかしい事に気づけ
IDEでブレークポイント当てれば1分で自力解決出来た案件だ
そもそもprintではデバッグにならないし、<li>も駄目だし
2022/09/30(金) 21:41:08.05ID:anKKL5Vh0
そうですね。
これを機にSublimetextから、ちゃんとしたIDE環境で作業するよう考えてみます。
vscodeがいいのかな。
2022/09/30(金) 22:25:09.62ID:3aBoBWM+0
>>28
実際のソース変更は慣れたエディタを使いつづけて問題ないが、
ブレークポイント当ててステップ実行出来るデバッグ環境は立ち上げておくべき
一般的にはVSCodeでいいんじゃね?呪文が必要らしいが(以下参照)
https://atmarkit.itmedia.co.jp/ait/articles/1809/11/news028.html
2022/10/02(日) 00:51:15.34ID:Omlyv0OK0
Ruby on Rails では、組み込みRuby・ERB で、HTML ファイルを書く

文字列を結合して、HTML片を作ってはならない。
相手が、script タグなどを送ってきて、それで危険なJavaScript を実行されてしまうから

だから逆に、<% 〜 %>, <%= 〜 %> を使って、HTML内にRubyの構文を書く

<% price = 2500 * 1.05 %>
<p>
本の値段は<%= price %>円です。
</p>

こうすると、< > & " など、HTMLの特殊文字がエスケープされて、scriptタグも実行されない
31デフォルトの名無しさん (ワッチョイ cf97-o1nH)
垢版 |
2022/10/03(月) 22:50:16.95ID:ZWE2UPrr0
mysqliで、queryメソッドに格納するクエリ文なのですが。
文字列の囲いはどっちがいいですかね。。

$insert = "INSERT INTO product(product_id,product_code,product_name,price,category_id) VALUES(21,2000,\"三菱えんぴつ\",100,1)";

$insert = "INSERT INTO product(product_id,product_code,product_name,price,category_id) VALUES(21,2000,'三菱えんぴつ',100,1)";
2022/10/03(月) 22:57:13.59ID:IWMZiHvT0
どちらでも好きな方で
https://dev.mysql.com/doc/refman/5.6/ja/string-literals.html
2022/10/03(月) 23:12:19.96ID:G1EEp94o0
>>31
外側をシングルクォートにしますかね
うっかり変数展開を使わないよう鉄下駄を履くイメージで
2022/10/04(火) 00:00:28.28ID:nXyy/Qec0
mysqliを使わずにPDOを使いprepare()などを使った方が良いのでは?
2022/10/04(火) 00:03:57.15ID:m1wIfZza0
完全に内部処理だけの場合だと
別にプレースホルダー使う必要ってないの?
念には念を入れておくべきなの?
2022/10/04(火) 00:18:31.66ID:GRVyRRF90
>>35
プリペアドステートメント(プレースホルダ)の「本来の役割」はデータ部分を除くSQLを事前コンパイルしてデータをバインドすることによりパフォーマンスを向上させることです
そのため、パフォーマンス観点で使うことがあります

内部処理というのが何を指すのか不明ですが、セキュリティ観点で見た場合、文字リテラルをわざわざ変数に入れてバインドする必要はないです
ただ、変数に入っているものであれば文字連結でSQLを作るよりプリペアドステートメントを使用することをおすすめします
プリペアドステートメントを使用すれば、引用符は自動で付加されるので >>31 のような悩みはなくなります
また、何より後で読んだときに「アレ?」って悩まなくて良いです。
2022/10/04(火) 00:44:39.24ID:77RhElC90
>>35
外部に公開しない内部専用の鯖でもSQLインジェクション対策が必要かという意味なら、必要だよ。
悪気はなくとも、意図的でなくとも、フォームに間違った内容をコピペする事はある。
その場合に偶々変な文字列が入ってたらDBが破壊される事があります、では駄目だろ。
2022/10/04(火) 02:02:08.77ID:m6zUfl020
ありがとうございます。
参考になりました。
39デフォルトの名無しさん (ワッチョイ cf97-o1nH)
垢版 |
2022/10/04(火) 02:03:00.45ID:m6zUfl020
もう一つ質問させてください。

MVCについて学習していて、二つの捉え方がありそうで混乱しています。
@Modelは関数やクラスの定義を記述する。Controllerはその実行場所。
AModelはデータベースへの命令とビジネスロジックの実行場所。Controllerはユーザーと直接アクセスする処理の実行場所。
どちらがより正しい捉え方なのでしょうか?
2022/10/04(火) 14:16:20.93ID:fqSkVIi/0
内部処理だけというのは、
DBから読み込んだ結果を
impodeして新しく、
WHERE IN 文を作ってる場合などです。

元がDBの値なので、ずれたり不正な値はないはずですが、どうなのでしょうか
SQLインジェクションの心配はでるのでしょうか

高速化の意味として使用するのはわかりました。
あくまで素朴な疑問で。
2022/10/04(火) 14:25:51.27ID:GRVyRRF90
>>40
>>36 でも書いたけど
OK
$sql = "INSERT INTO product(product_id,product_code,product_name,price,category_id) VALUES(21,2000,'三菱えんぴつ',100,1)";
NG
$sql = "INSERT INTO product(product_id,product_code,product_name,price,category_id) VALUES(21,2000,'$val',100,1)";

$val の代入元に外部入力がないかを都度検証しなくてはならないのでプリペアドステートメントを使用するのが無難

ただ、'impodeして新しく、 WHERE IN 文を作ってる場合'ってのがそもそも正規化ができてないケースっぽいね^^;
2022/10/04(火) 14:33:14.85ID:GRVyRRF90
>>39
フレームワークを使用する前提だと思うけど、今どきのphpだとMVCで分類できないような設計になることが多い
クリーンアーキテクチャとかを調査してみるといい

フレームワークは Laravel だと思うので、「Laravel クリーンアーキテクチャ」あたりでググるとそれっぽい記事に当たれる
ただ、フレームワークの基礎概念がわかっていてもややこしいので、基本的になんちゃってクリーンアーキテクチャを採用することになると思う
2022/10/04(火) 14:50:31.74ID:kffIYV9Ia
ありがとうございます。
フレームワーク利用の前提でなく、素?のPHPです。
phpの学習のためにMVCを理解しようとしているので、
実務で構築するものとは、ちょっとズレているかもしれません。

疑問に思うのは、
例えば、入力バリデーションを実行するのは、Controllerなのかもしれませんが、
その関数は、Modelで定義するべきなのか?でもこれはビジネスロジックじゃないし。
とか思いました。

一方でModelは関数ライブラリみたいなものという意見もありました。
実務経験のあり皆様の知見をお借りしたいと思います。
2022/10/04(火) 14:58:12.02ID:GRVyRRF90
>>43
過ぎわかるけど、そのへんの厳密さはすぐに役に立たなくなる知見だよ
フレームワークと紐付けて学習することをおすすめします
2022/10/04(火) 14:58:57.95ID:GRVyRRF90
すまん。ミスw

過ぎわかるけど → すごいわかる
2022/10/04(火) 15:15:33.37ID:fqSkVIi/0
ありがとうございます。
脱線するけど、
*営業成績テーブル
 個人ID,成績
*部門テーブル
 部門ID,部門情報
*個人テーブル
 個人ID,部門ID,個人情報
こんな感じのテーブルで
A部門所属のデータをとるときにとるときに、
個人テーブルからA部門所属をとってから、
営業成績テーブルにWHERE INしてたんですけど、
どうしたらよかったんですかね。
テーブルがそもそもダメなのかな。
2022/10/04(火) 22:07:04.75ID:2XMnl95Q0
素直に結合
何のためのRDBかと
48デフォルトの名無しさん (ワッチョイ 435f-/mFx)
垢版 |
2022/10/04(火) 22:31:47.47ID:lI8qARGk0
test
49デフォルトの名無しさん (ワッチョイ 435f-/mFx)
垢版 |
2022/10/04(火) 22:32:03.64ID:lI8qARGk0
php疎い者です。
javascriptでよくある処理ですが、
現在表示しているページの<body>タグにクラス(.current)があるか否かで処理を分岐したいのですが、
これをPHPではどのように書いてよいのかわかりません。

・取得対象の現在のドキュメントのbodyタグの指定の仕方
・正規表現など使わずにgetElementsByTagNameのようなものがhtmlでも使えるのか
など、、
宜しくお願いいたします。
2022/10/04(火) 22:35:18.09ID:BwJYUobP0
現在表示しているページは、誰が作っているの?
51デフォルトの名無しさん (ワッチョイ 435f-/mFx)
垢版 |
2022/10/04(火) 23:35:33.89ID:lI8qARGk0
>>50
自分で作っているページです。
恐らく方法論として間違っているのだと思いますが、
後学の為に方法を知っておきたいです。
2022/10/04(火) 23:51:17.05ID:nXyy/Qec0
ん?サーバーで先にHTMLを生成するのだからその段階で判断基準があるでしょ?
それが無くて後から動的ならjavascriptでやるしか無い気がするのだが
2022/10/04(火) 23:52:48.63ID:CNGS9dK70
Ruby なら、Nokogiri, Selenium Webdriver などを使う。
PHP にも、そういうモジュールがあるのでは?

require 'nokogiri'

doc_1 = Nokogiri::HTML(<<EOT)
<html><body class="abc">あ</body></html>
EOT

doc_2 = Nokogiri::HTML(<<EOT)
<html><body class="current">い</body></html>
EOT

element_1 = doc_1.at_css( 'body.current' )
if element_1
puts element_1.content
elsif
p element_1
end
#=> nil

element_2 = doc_2.at_css( 'body.current' )
if element_2
puts element_2.content
elsif
p element_2
end
#=> い
54デフォルトの名無しさん (ワッチョイ 435f-/mFx)
垢版 |
2022/10/04(火) 23:55:32.56ID:lI8qARGk0
例えばスマホ/PCなど、表示条件によりbodyタグにphpでクラス付与するケースです。
phpの分岐条件をbodyのクラスで判定する事自体がナンセンスというか方法論として間違っているという事かと思いますが、
もしこのような方法がphpでもできるならば具体的にどのようなソースになるか知っておきたい感じです。

これに限らず、classのあるなしをphpでもできれば便利だなあと、、

とても煩雑で面倒で無意味な事であれば諦めます。。
2022/10/04(火) 23:55:56.42ID:L5kRkIm30
生成したサイトにスクレイピングするスクリプト書くとかしか無いんじゃない?
56デフォルトの名無しさん (ワッチョイ 435f-/mFx)
垢版 |
2022/10/04(火) 23:57:51.22ID:lI8qARGk0
>>53
ありがとうございます。
恐らく「PHP Simple HTML DOM Parser」などがそれに当たるかと思われますが、
ちょっと1回使いたいだけの場合にライブラリ使わずサクッとできないかと思い、質問しました。
57デフォルトの名無しさん (ワッチョイ 435f-/mFx)
垢版 |
2022/10/04(火) 23:59:21.33ID:lI8qARGk0
>>55
現在のページに対しfile_get_contentsなどを使うイメージでしょうか。
ありがとうございます。
2022/10/05(水) 00:03:03.19ID:W5I+dJQy0
>>39
Ruby on Rails のMVC では、
Model はデータベース・ビジネスロジック、
View はHTML、
Controller はルーティングなど、MV 以外

歴史的には、コントローラーの肥大化を防ぐために、
Skinny Controller, Fat Model を推奨した。
その結果、モデルが肥大化した

そこで今度は、モデルの処理を減らすために、
Form Object, Service Object へ処理を分けた

また表示処理は、Presenter へ分けた。
それで、Form Presenter, Model Presenter が出来た
2022/10/05(水) 00:06:29.81ID:j989iulk0
クライアント側でJavascriptなど使って書き換えしているときはどうするんだろう
60デフォルトの名無しさん (ワッチョイ 435f-/mFx)
垢版 |
2022/10/05(水) 00:10:18.85ID:4fLF3mVy0
>>59
今回は一旦そのケース(jsによる操作)はないという前提でお願います...
2022/10/05(水) 00:28:51.30ID:W5I+dJQy0
>>54
Ruby on Rails では、
<html><body></body></html> の部分は、レイアウトファイルと言う。
絵画でいう額縁の部分

body 内では、<%= yield %> で、各テンプレートファイルを読み込むようになっている。
だから、bodyタグを変える場合は、複数のレイアウトファイルを切り替える

<html><body class="abc">
<%= yield %>
</body></html>

<html><body class="xyz">
<%= yield %>
</body></html>

それか、Selenium Webdriver で、JavaScript で書いて、ブラウザに送信できる。
body要素を取得して、class属性を変更する
2022/10/05(水) 08:10:28.17ID:lxgtpcSQr
>>49
phpで生成する段階で分岐しないといけないならphpで分岐する

レンダリング後に分岐したいならjsで分岐するしかない
2022/10/05(水) 10:08:08.68ID:EybIMEvA0
>>61
RubyってマジでPHPそっくりなんだな
2022/10/05(水) 23:07:42.68ID:W5I+dJQy0
すべてのフレームワークは、Ruby on Rails を基本としているから、
初心者はRailsから始めるべき

JavaScript なんかは、Rubyの20年遅れ。
ES6(ES2015)で、ようやく辞書・クラス構文・テンプレート文字列などが出来たなど、Ruby化を進めた
2022/10/05(水) 23:15:54.32ID:W5I+dJQy0
Ruby は、JavaScript(JS), Python, PHP よりも、バグらない

Rubyの偽は、nil, false の2つだけ

一方、他の言語は、各型に偽がある。
空文字、0, 0.0、空配列など

これのおかげでバグるから、
JS などは、== 緩い等価演算子を使うなと言われて、=== 厳密等価演算子を使えとなった。
さらに、TypeScript も必須になった
2022/10/06(木) 12:50:00.65ID:tI414gt60
Rubyガイジは嫌われていることにそろそろ気付けよw
2022/10/07(金) 01:00:05.85ID:/3WJyx6k0
こういうのはエゴな正義感でやってるんやろ
自分がRubyを支えてるみたいなw
やらかしてることには自ら目をつぶるタイプ、しょうもない人間
2022/10/08(土) 19:37:21.57ID:juauNmJw0
$comment_info_msg_tag = '<div class="comment-information-messag">'.$comment_info_msg.'</div>'


これって変数$comment_info_msg_tagを呼び出した時
変数$comment_info_msgの中身がクラスcomment-information-messagの<DIV>タグを付けられて出てくるって事で合っていますか?
2022/10/08(土) 19:57:47.78ID:rIAKoGAI0
>>68
合ってない
文字連結で変数に代入してるだけ
プログラミングにおいて「呼び出し」とは関数呼び出しであって、PHPなら()が付く
2022/10/08(土) 20:14:34.77ID:rIAKoGAI0
てかその記述の意味が分からないのなら、煽り抜きでphp.netを最初から全部読んだ方がいい
基本中の基本中の基本中の基本位のレベルだぞそれ
2022/10/08(土) 21:32:53.78ID:rIAKoGAI0
CGIの時にfilter_input(INPUT_SERVER,'REMOTE_ADDR')で値が取れないという仕様バグに遭遇してるのだが、
一般的にこれはどう対処されてるんだ?

詳細は以下で、15年前かららしい。
https://www.php.net/manual/ja/function.filter-input.php#77307
原因は以下で、
https://www.php.net/manual/ja/function.filter-input.php#127415

要はENVとSERVERの値は鯖から渡されるが、
使わない場合は無駄なのでデフォでjitするが、CGIだとこれでは動かないらしい。
上記下側のURLによると auto_globals_jit をdisableにすれば直るらしいが、俺の実行環境(fastCGI)では駄目だった。
開発中はモジュールでやってたので気づかなかった。
本番環境(最安値帯のレンサバ)で動作テストする段階になって発覚。(今)
ターゲットは最安値~中間帯のレンサバなので、CGIを切る事も出来ない。
IDEがうるさいから全部filter_inputにしたのにこれかよ!というところ。

諦めて $_SERVER 直接アクセスにソース書き換えるしかないか、と思ってるが、
それ以外の解決策があればよろしく。
72デフォルトの名無しさん (ワッチョイ ca51-Tub1)
垢版 |
2022/10/11(火) 13:51:56.12ID:5Qn6fZG50
if ($sex == 0) {
$hoge = 'ちんこ';
} else if ($sex == 1) {
$hoge = 'まんこ';
}
return $hoge;


C系やJavaとは異なり、
変数hogeが初めて宣言されているのがif文の中なのに、if文から出たあとでその変数が見えてしまうことに戸惑っています。
「こういうもの」で慣れるしかないのですか?

何かありがちな注意点ってありますか?
イテレーターの中でしか使わない変数が残ってしまうことでの不安。
2022/10/11(火) 14:40:16.45ID:j0iSNFpd0
注意する
サポートするエディタを使う
デバッグする

ちなみに挙げてるコードも$sexが0,1以外ならいわゆる未定義になる可能性があって、
まあいいコードではないよね(すぐreturnするだけなら変数いらへんやん的なとこも)

ちなみに9からだとerrorになるらしい
今のPHPでは通っちゃうだけで、戸惑う感覚はなくさないほうがいいと思うよ
2022/10/11(火) 14:40:56.76ID:a24aUp+M0
気持ちが悪いなら未定義の変数をいきなり使うようなことはしなければ良いだけでは?
普通はそんな事しない訳だし
typoはどうしょうもないが
2022/10/11(火) 15:20:07.39ID:17+/w9Hg0
Ruby でも、if は、スコープを作らない。
C みたいに、{ } で囲むとスコープを作る言語もあるけど、動的言語では少ないかも

if true
a = 3
else
b = 5
end

p a, b #=> 3, nil
2022/10/11(火) 16:17:43.00ID:S+x+TbIN0
>>71
興味深い
かなり限定的な不具合だけど、結構基本的なとこだしそんなの残ってるんかなぁ...

手が空いたときに試してみたいと思うけど、環境揃えるのがめんどいからとりあえずissueであげてみては?

Symfonyは$_SERVERから取ってるっぽい
https://symfony.com/doc/current/components/http_foundation.html
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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