質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%

Q&A

解決済

1回答

342閲覧

selectしてdbから引き出した値を再代入するには?

makun625

総合スコア27

0グッド

0クリップ

投稿2022/03/19 15:55

現在、dbから取ってきた値にhtmlspecialchars_decodeを使って文字をもとに戻してからjsに渡したいと思っているのですが、このやりかたでは$listにひとつしか値が入りません。どのようにやればうまくいきますでしょうか?

php

1$stmt=$this->pdo->prepare("SELECT * FROM word WHERE q LIKE :text ORDER BY RAND()"); 2 $stmt->bindValue("text","%$text%",\PDO::PARAM_STR); 3 $stmt->execute(); 4 while($row=$stmt->fetch()){ 5 $list=array( 6 "q"=>h::rs($row["q"]), 7 "a"=>h::rs($row["a"]) 8 ); 9 } 10 return $list;

h::rsというのがhtmlspecialchars_decodeのメソッドです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2022/03/19 23:32

$list という変数をループの中で毎回上書きしてるので当然でしょうね…。 ちなみに、データベースに格納する値を htmlspecialchars するのは良くないです。 https://teratail.com/questions/106765
makun625

2022/03/20 05:13

回答ありがとうございます。 ちょっと読んでも理解できなかったんですが、htmlspecirlchrsを使わないと例えばsql文を入力欄に書かれた場合データが消えたり上書きされたりとされると思ったんですが、べつのほうほうがあるんでしょうか? 無知ですみません。
guest

回答1

0

ベストアンサー

変数に上書きし続けているので、例えば下記のように配列で受け取ります。

$list

$list[]


ただその場合sqlインジェクションなどで不適切な値がdbに入ったりすることがあると見ました。
その対策としてHtmlspecialcharsがあるんじゃないのでしょうか?

色々勘違いされてそうなので別途まとめると
SQLで対応するのは「SQLとしてのエスケープ」で、「HTMLとしてのエスケープ」を行うhtmlspecialchars()は画面出力時(ブラウザアクセスを想定する場合)ではないです。

特殊文字を HTML エンティティに変換する

諸々含めて下記の記事が良く参照されています。
PHPでデータベースに接続するときのまとめ

また、バリデーション含めると下記のような記事が理解しやすいと思います。
サニタイズ/入力値検証/エスケープの考え方

つまりhtmlspecialchars_decodeは不要です。
私自身は使ったことなかったのですが、出番はゼロではないようです。
teratail:htmlspecialcharsとhtmlentitiesの疑問

投稿2022/03/20 03:34

編集2022/03/20 20:55
m.ts10806

総合スコア80852

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

makun625

2022/03/20 05:15

再出力する時にシングルクォートなどをそのまま出力したいです。
m.ts10806

2022/03/20 05:15

入力値そのまま保存していたらデコードの必要はないです
makun625

2022/03/20 05:42

ただその場合sqlインジェクションなどで不適切な値がdbに入ったりすることがあると見ました。 その対策としてHtmlspecialcharsがあるんじゃないのでしょうか?
m.ts10806

2022/03/20 09:37

SQLインジェクション対策はSQLのエスケープを行います。 通常はプリペアドステートメントでパラメータ込みのSQLを用意し、そのパラメータに値をバインドする形をとります。 htmlspecialcharsはXSS対策です。 下記のような記事も解説があります。 https://qiita.com/mpyw/items/b00b72c5c95aac573b71
makun625

2022/03/20 11:35

ということは上記コードであればHtmlspecialcharsを使わなくても文字列として値はDBに格納されるということでしょうか?
m.ts10806

2022/03/20 20:37

無関係です。 SQLとしてのエスケープが成されれば良いのです。
m.ts10806

2022/03/20 20:45

むしろhtmlspecialchars()はデータの加工を行うものなので、画面出力の時のみ行うべきものです。 そのあたり「バリデーション」含めた考え方は下記の記事が良くまとまっています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問