【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 のような悩みはなくなります
また、何より後で読んだときに「アレ?」って悩まなくて良いです。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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