X



【PHP】下らねぇ質問はここに 9
レス数が1000を超えています。これ以上書き込みはできません。
0981デフォルトの名無しさん (ワッチョイ 6fef-zhOP)
垢版 |
2018/11/25(日) 09:04:25.92ID:dabdOdKd0
>>978
ありがとうございます。
判定がtrueになり続けてしまうということなのですね。

もう一つ質問があります。

class A{
private $B;

public function __construcr($C){
$this->B=$C;
}

というコードなのですが、classAのフィールドで変数$Bを宣言して
関数のコンストラクタの$thisで、変数$Bに引数を代入してますが
この時、変数Bの$が取れているのはどういう仕様なのでしょうか?
0984デフォルトの名無しさん (ワッチョイ e3ab-zhOP)
垢版 |
2018/11/26(月) 18:28:25.99ID:vghby52J0
$db=getDb();
$opDB=$db->prepare('SELECT * FROM sample WHERE id=?');
$opDB->bindValue(1,$_GET['id'] ?:1);

このコードから質問お願いします。
2行目の id=? は、ワイルドカードのようなものですか?
3行目のbindValueの一つ目のパラメータの1は、何を指しているのでしょうか?
0987デフォルトの名無しさん (ワッチョイ 73e9-Kv/S)
垢版 |
2018/11/27(火) 14:57:55.52ID:aBLKPQ100
>>984
>>986
SELECT * FROM sample WHERE id=?
というSQLの中で使われている「?」はプリペアドステートメントというもの
http://php.net/manual/ja/pdo.prepared-statements.php

?だと理解し難いなら名前付き(例えば今回なら :id とか)にした方が理解しやすいと思う


$hoge = $_GET['id'] ?: 1;

はエルビス演算子という三項演算子を省略した書き方
可読性が悪いのであんまり使わない方が良いと思う

・同じ事を三項演算子で書くなら
$hoge = ($_GET['id']) ? $_GET['id'] : 1;

・同じ事をif文で書くなら
if ($_GET['id']) {
  $hoge = $_GET['id'];
} else {
  $hoge = 1;
}

だが、このケースでは、こんな書き方をしてはいけない。
(続く)
0988デフォルトの名無しさん (ワッチョイ 73e9-Kv/S)
垢版 |
2018/11/27(火) 14:59:13.82ID:aBLKPQ100
(続き)
$_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;
}

このケースでエルビス演算子をこんな使い方するような糞コードは、あんまり参考にしない方がいい
0989デフォルトの名無しさん (ワッチョイ 73e9-Kv/S)
垢版 |
2018/11/27(火) 15:06:26.62ID:aBLKPQ100
>>977も読んだが、エルビス演算子の使い方といい
いったい何を参考にしてこんなコードを書いてるんだろうか

もし本を参考にしてるなら焼き捨てた方がいいレベルで酷い

クイズ的に質問してるなら面白いけどw
0990デフォルトの名無しさん (ワッチョイ c39e-qSu8)
垢版 |
2018/11/27(火) 16:49:32.78ID:BR30Kh7X0
演算子の説明だけだとシンプルで理解しやすいけど実用性ではクソ
実用性重視の説明だと本来説明したいもの以外の説明で蛇足だらけで
紙面使いすぎでクソ
というジレンマなんやろ
0991デフォルトの名無しさん (ワッチョイ 6fe7-sCK9)
垢版 |
2018/11/27(火) 18:08:09.22ID:MA03kwvb0
$input = trim(fgets(STDIN));
while($input)

echo $input;

これってwhileの式のところでは$inputの中が空かって判断してるの?そういう機能がついてるのか?
0992デフォルトの名無しさん (ワッチョイ cf80-fhi1)
垢版 |
2018/11/27(火) 18:52:40.99ID:DSo9/Qg/0
>>984
SELECT * FROM sample WHERE id=?

id=? は、placement。
? の所に、値が入る

SQL injection 対策

例えば、単純な文字列をつなげて、問い合わせると、
? が「1; DROP TABLE 何々」とか、クラッカーに入力されると、

「SELECT * FROM sample WHERE id=1; DROP TABLE 何々」のように、
; で、危険なSQL文をつなげてくる

placement で、SQL文をつなげられないようにしている
0994デフォルトの名無しさん (ワッチョイ 6fe7-sCK9)
垢版 |
2018/11/27(火) 19:53:06.64ID:MA03kwvb0
while分の中では$inputをbool型にして判定してるわけか?
0995デフォルトの名無しさん (ワッチョイ ffd2-f63u)
垢版 |
2018/11/27(火) 22:02:27.91ID:7ygBETe/0
空文字がFalse判定されることを利用して
空行入力で終わるようにしてるんだろうけど
ゼロとかもFalse判定されて終わっちゃうんじゃないか
試してないけど
0997デフォルトの名無しさん (ワッチョイ e3ab-zhOP)
垢版 |
2018/11/28(水) 12:52:07.66ID:yr9LfNgh0
>>987
ありがとうございました。プレイスホルダなのですね。
prepareでSQLを用いて、プレイスホルダを使うとき、
SQL文の中で、左から数えたプレイスホルダの順番を、
bindValueのカッコ内の数値で指定してバインドする、ということもわかりました。
?:や??:の解説もありがとうございました。

>>989
独習phpというテキストを使っています。

>>992
ありがとうございます。
prepareステートメントが悪意ある入力に対策しているとテキストにも書いてありました。

皆様、ありがとうとざいました。
今のテキストを読み終えたら、もう少しテキストを吟味して、違うテキストを探してみようと思います。
0999デフォルトの名無しさん (ワッチョイ 73e9-Kv/S)
垢版 |
2018/11/28(水) 15:17:38.93ID:zpzfEtE+0
すまんw 大嘘書いたww
>>998のコードだと trim() によって string型にキャストされるから永久ループするわwww

while (($input = fgets(STDIN)) !== false) {
echo $input;
}

が正しいが場合によっては

while (($input = trim(fgets(STDIN))) !== '') {
echo $input;
}

が期待した動作なのかもしれない
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 342日 23時間 9分 23秒
レス数が1000を超えています。これ以上書き込みはできません。

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