18/11/25 09:17:54.45 43hAniU60.net
$が取れていることで可変関数を使える仕様になっている
1034:デフォルトの名無しさん
18/11/26 15:12:38.13 aqdzSIAP0.net
>>985
ありがとうございます。
可変関数は、$変数に関数名を格納して使うものだと理解していました。
もう少し、可変関数に関して調べてみます。
1035:デフォルトの名無しさん
18/11/26 18:28:25.99 vghby52J0.net
$db=getDb();
$opDB=$db->prepare('SELECT * FROM sample WHERE id=?');
$opDB->bindValue(1,$_GET['id'] ?:1);
このコードから質問お願いします。
2行目の id=? は、ワイルドカードのようなものですか?
3行目のbindValueの一つ目のパラメータの1は、何を指しているのでしょうか?
1036:デフォルトの名無しさん
18/11/26 18:34:58.26 9UWiUoMZ0.net
一つ目:イイエ
二つ目:一つ目の?
1037:デフォルトの名無しさん
18/11/27 09:20:32.54 bFvRPa1H0.net
返答ありがとうございます。
id=? っていうのは、どういう働きをするコードなのでしょう
一つ目とか、bindValue(1,$_GET['id']);の、'1'です
1038:デフォルトの名無しさん
18/11/27 14:57:55.52 aBLKPQ100.net
>>987
>>989
SELECT * FROM sample WHERE id=?
というSQLの中で使われている「?」はプリペアドステートメントというもの
URLリンク(php.net)
?だと理解し難いなら名前付き(例えば今回なら :id とか)にした方が理解しやすいと思う
$hoge = $_GET['id'] ?: 1;
はエルビス演算子という三項演算子を省略した書き方
可読性が悪いのであんまり使わない方が良いと思う
・同じ事を三項演算子で書くなら
$hoge = ($_GET['id']) ? $_GET['id'] : 1;
・同じ事をif文で書くなら
if ($_GET['id']) {
$hoge = $_GET['id'];
} else {
$hoge = 1;
}
だが、このケースでは、こんな書き方をしてはいけない。
(続く)
1039:デフォルトの名無しさん
18/11/27 14:59:13.82 aBLKPQ100.net
(続き)
$_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;
}
このケースでエルビス演算子をこんな使い方するような糞コードは、あんまり参考にしない方がいい
1040:デフォルトの名無しさん
18/11/27 15:06:26.62 aBLKPQ100.net
>>980も読んだが、エルビス演算子の使い方といい
いったい何を参考にしてこんなコードを書いてるんだろうか
もし本を参考にしてるなら焼き捨てた方がいいレベルで酷い
クイズ的に質問してるなら面白いけどw
1041:デフォルトの名無しさん
18/11/27 16:49:32.78 BR30Kh7X0.net
演算子の説明だけだとシンプルで理解しやすいけど実用性ではクソ
実用性重視の説明だと本来説明したいもの以外の説明で蛇足だらけで
紙面使いすぎでクソ
というジレンマなんやろ
1042:デフォルトの名無しさん
18/11/27 18:08:09.22 MA03kwvb0.net
$input = trim(fgets(STDIN));
while($input)
{
echo $input;
}
これってwhileの式のところでは$inputの中が空かって判断してるの?そういう機能がついてるのか?
1043:デフォルトの名無しさん
18/11/27 18:52:40.99 DSo9/Qg/0.net
>>987
SELECT * FROM sample WHERE id=?
id=? は、placement。
? の所に、値が入る
SQL injection 対策
例えば、単純な文字列をつなげて、問い合わせると、
? が「1; DROP TABLE 何々」とか、クラッカーに入力されると、
「SELECT * FROM sample WHERE id=1; DROP TABLE 何々」のように、
; で、危険なSQL文をつなげてくる
placement で、SQL文をつなげられないようにしている
1044:デフォルトの名無しさん
18/11/27 19:01:55.97 aBLKPQ100.net
>>994
そのコードだと、trim(fgets(STDIN))の値が (bool) true であった場合に永久ループになるw
実際は
while ($input = trim(fgets(STDIN))) {
echo $input;
}
こう書くべき処理なのでは?
1045:デフォルトの名無しさん
18/11/27 19:53:06.64 MA03kwvb0.net
while分の中では$inputをbool型にして判定してるわけか?
1046:デフォルトの名無しさん
18/11/27 22:02:27.91 7ygBETe/0.net
空文字がFalse判定されることを利用して
空行入力で終わるようにしてるんだろうけど
ゼロとかもFalse判定されて終わっちゃうんじゃないか
試してないけど
1047:デフォルトの名無しさん
18/11/28 12:01:30.07 eIHsuPDh0.net
Ruby では、nil, false の偽が2つだけ。
一方、JavaScript, Python, PHP などは、偽が10個ぐらいあるから、超危険!
基本的に、Ruby 以外は、バグってどうしようもない
1048:デフォルトの名無しさん
18/11/28 12:52:07.66 yr9LfNgh0.net
>>990
ありがとうございました。プレイスホルダなのですね。
prepareでSQLを用いて、プレイスホルダを使うとき、
SQL文の中で、左から数えたプレイスホルダの順番を、
bindValueのカッコ内の数値で指定してバインドする、ということもわかりました。
?:や??:の解説もありがとうございました。
>>992
独習phpというテキストを使っています。
>>995
ありがとうございます。
prepareステートメントが悪意ある入力に対策しているとテキストにも書いてありました。
皆様、ありがとうとざいました。
今のテキストを読み終えたら、もう少しテキストを吟味して、違うテキストを探してみようと思います。
1049:デフォルトの名無しさん
18/11/28 15:13:42.98 zpzfEtE+0.net
>>997
そういう事
ただ>>998,999の言う通りなので
while (($input = trim(fgets(STDIN))) !== false) {
echo $input;
}
こう書くのが正しい
(なんか前にも似たような事を書いた気がするw)
1050:デフォルトの名無しさん
18/11/28 15:17:38.93 zpzfEtE+0.net
すまんw 大嘘書いたww
>>1001のコードだと trim() によって string型にキャストされるから永久ループするわwww
while (($input = fgets(STDIN)) !== false) {
echo $input;
}
が正しいが場合によっては
while (($input = trim(fgets(STDIN))) !== '') {
echo $input;
}
が期待した動作なのかもしれない
1051:デフォルトの名無しさん
18/11/28 17:09:43.57 Nb5yTkdM0.net
次スレ
【PHP】下らねぇ質問はここに書き込みやがれ 10
スレリンク(tech板)
1052:1001
Over 1000 Thread.net
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 342日 23時間 9分 23秒
1053:過去ログ ★
[過去ログ]
■ このスレッドは過去ログ倉庫に格納されています