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