PHPでデータベースよりデータを取得しています。
取得時にフィルタをかけたいのですが、変数の囲み方がわかりません。
PHP
1function getAll() 2{ 3 $objPdo = connect(); 4 $statement = 'SELECT * FROM t_sale_den WHERE holiday=false and business_day like $hani%'; 5 $stmt = $objPdo->prepare($statement); 6 $stmt->execute(); 7 return $stmt->fetchAll(); 8}
$haniの変数には日付が入っており、他の個所で下記のようにしたら正常に表示されます。
(〇年〇月が取得され一覧で表示されます。)
上記コードのシングルクォートをダブルクォートにするとエラーが出るので、$statement内の$haniを何かで囲むのかと思うのですが、さっぱりわかりません。
PHP
1$sql = "SELECT * FROM t_sale_den WHERE holiday=false and business_day like '$hani%'";
どなたかご教授をお願い致します。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

退会済みユーザー
2019/08/10 12:27
2019/08/10 22:50
2019/08/11 00:20

回答2件
0
LIKE はチョットめんどいですよ
以下、追記
まだクローズされていないので追記しておきます。
selectのWHEREで変数を使いたい
質問は「SELECT の WHERE のリテラルを変数として使いたい」と読み替えることができます。
リテラルを変数で表現するには、プリペアドステートメントを使用し、クエリの構文とデータを分離し、構文を改変できないようにした上で、データをバインドする方法が推奨されてます。
質問では、せっかく prepare() を使用しているにも関わらず、適切なプリペアードステートメントが記述でされていません。変数を SQL 文に埋め込んでいるため、構文の改変を許してしまっています。
正しい記述方法に関しては、PHP で MySQL 接続時に必要な知識(最小限版)を参照してください。
(余談:プリペアードステートメントで記述したクエリが DB でどの様にあつかわれるかは、「13.5 準備済みステートメントのための SQL 構文 - dev.mysql.com」の1番目のサンプルを見ておくと、イメージしやすいと思います。)
また、LIKE に関しても注意が必要です。
プリペアードステートメントを使用したデータバインドでは、エスケープやクオートは自動で判断されますが、ワイルドカード文字はその対象ではないため、自前でエスケープを記述する必要があります。
ワイルドカード文字はデータベースによって違いがあるため、データベースのマニュアルで必要な文字を確認しエスケープしてください。
本件が MySQL であれば、後方のみで使用しているので
bindValue(1, addcslashes($hani, '\_%') . '%', PDO::PARAM_STR);
のような記述になります。
エスケープが正しく行われていない場合、例えば $hani に「%01」のような値が突っ込まれると「%01%」をバインドしてしまい、意図した内容ではない検索が行われます。
DB 処理では、製作者の意図しない挙動を制限する必要があるのでワイルドカード文字に対してのエスケープは必須です。
参考記事で紹介している範囲は php でデータベース接続を扱うため必要なの最小限の知識なので、もっと詳しく説明している「PHPでデータベースに接続するときのまとめ」も併せて読むと良いです。
投稿2019/08/10 12:23
編集2019/08/17 22:31
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

退会済みユーザー
2019/08/10 12:26

退会済みユーザー
2019/08/10 12:30

退会済みユーザー
2019/08/10 12:33

退会済みユーザー
2019/08/10 12:37

退会済みユーザー
2019/08/10 12:38

退会済みユーザー
2019/08/10 12:39

退会済みユーザー
2019/08/10 12:39

退会済みユーザー
2019/08/10 12:40

退会済みユーザー
2019/08/10 12:41

退会済みユーザー
2019/08/10 12:42

退会済みユーザー
2019/08/10 12:43

退会済みユーザー
2019/08/10 12:44

退会済みユーザー
2019/08/10 12:45

退会済みユーザー
2019/08/10 13:00

退会済みユーザー
2019/08/10 13:52 編集

退会済みユーザー
2019/08/10 21:13

退会済みユーザー
2019/08/10 22:20 編集

退会済みユーザー
2019/08/10 22:17 編集

退会済みユーザー
2019/08/10 22:10

退会済みユーザー
2019/08/10 22:11

退会済みユーザー
2019/08/10 22:12

退会済みユーザー
2019/08/10 22:14

退会済みユーザー
2019/08/10 22:15

退会済みユーザー
2019/08/10 22:20

退会済みユーザー
2019/08/10 22:25

退会済みユーザー
2019/08/10 22:41

退会済みユーザー
2019/08/10 22:45

退会済みユーザー
2019/08/10 22:46

退会済みユーザー
2019/08/10 22:46

退会済みユーザー
2019/08/10 22:47

退会済みユーザー
2019/08/10 22:48

退会済みユーザー
2019/08/10 22:49

退会済みユーザー
2019/08/10 22:52

退会済みユーザー
2019/08/10 22:55

退会済みユーザー
2019/08/10 23:05

退会済みユーザー
2019/08/10 23:08

退会済みユーザー
2019/08/10 23:08

退会済みユーザー
2019/08/10 23:09

退会済みユーザー
2019/08/10 23:09

退会済みユーザー
2019/08/10 23:10

退会済みユーザー
2019/08/10 23:11

退会済みユーザー
2019/08/10 23:11

退会済みユーザー
2019/08/10 23:11

退会済みユーザー
2019/08/11 00:05

退会済みユーザー
2019/08/11 00:06

退会済みユーザー
2019/08/11 00:06

退会済みユーザー
2019/08/11 00:07

退会済みユーザー
2019/08/11 00:12

退会済みユーザー
2019/08/11 00:15

退会済みユーザー
2019/08/11 00:15

退会済みユーザー
2019/08/11 00:16

退会済みユーザー
2019/08/11 00:23

退会済みユーザー
2019/08/11 00:24

退会済みユーザー
2019/08/11 00:27

退会済みユーザー
2019/08/11 00:33 編集

退会済みユーザー
2019/08/11 00:34

退会済みユーザー
2019/08/11 00:34

退会済みユーザー
2019/08/11 00:35

退会済みユーザー
2019/08/11 00:38 編集

退会済みユーザー
2019/08/11 00:39

退会済みユーザー
2019/08/11 00:39

退会済みユーザー
2019/08/11 00:40

退会済みユーザー
2019/08/11 00:53 編集

退会済みユーザー
2019/08/11 00:50

退会済みユーザー
2019/08/11 00:54 編集

0
おす!
SQLの場合、数値以外の値はシングルクオートで囲むんだ。DBによって何で囲むべきか変わるからな。
それでよう、おめぇ、これ実行したらどうなると思う?
$hani = "'; DELETE FROM t_sale_den WHERE holiday IS NOT NULL; --"; $sql = "SELECT * FROM t_sale_den WHERE holiday=false and business_day like '$hani%'";
投稿2019/08/10 12:09
編集2019/08/10 12:14
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

退会済みユーザー
2019/08/10 12:17

退会済みユーザー
2019/08/10 12:32 編集

退会済みユーザー
2019/08/10 23:15

退会済みユーザー
2019/08/11 00:13

退会済みユーザー
2019/08/11 00:24

退会済みユーザー
2019/08/11 00:25

退会済みユーザー
2019/08/11 00:25

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。