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

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

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

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

0回答

819閲覧

sqlインジェクションを防ぎたいです。

退会済みユーザー

退会済みユーザー

総合スコア0

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

2クリップ

投稿2021/01/23 09:39

編集2021/01/23 11:00

前提・実現したいこと

SQLで任意の条件に合致するデータの件数を取得したいです。
補足情報の画像がテーブルです。

該当のソースコード

PHP

1$tagName = htmlspecialchars($tagName); 2//dbからコメントの総数を取る 3$counts = $db->query('SELECT COUNT(*) AS cnt FROM article WHERE tag LIKE \''.$tagName.'%\''); 4$cnt = $counts->fetch();

修正後
データの数が取得できません。likeですが完全一致のみのデータ数を取得したいです。
count($rows)の値が1で、想定していた値は7で異なります。

PHP

1//dbからコメントの総数を取る 2$counts = $db->prepare('SELECT COUNT(*) AS cnt FROM article WHERE tag LIKE ?'); 3$counts->bindParam(1, $tagName, PDO::PARAM_STR,12); 4$counts->execute(); 5$rows = $counts->fetch(); 6$maxPage = ceil(count($rows) / 6); //切り上げ 7$page = min($page,$maxPage); //$page>$maxPageだったら $page = $maxPage 8

$tagNameには文字列が入っています。

補足情報(FW/ツールのバージョンなど)

イメージ説明

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

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

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

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

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

m.ts10806

2021/01/23 09:42

調べても何も出ませんか?
m.ts10806

2021/01/23 09:45 編集

というか、1つ前のコードから劣化してます。 https://teratail.com/questions/317912 なぜバインドやめて直接SQLに入れ込んだのかわからないですね。 折角できていってたものなのに。 わざわざPHPマニュアルのサンプルコード引用して回答したのに・・・ 理解できてないならそのように言ってもらえればよかったのですが。
退会済みユーザー

退会済みユーザー

2021/01/23 09:57

理解ができておらずエラーが取れなかったため、ほかの方法を調べていました。
m.ts10806

2021/01/23 10:21

「理解できてないのに解決済みにした」 という事態は異常です。
退会済みユーザー

退会済みユーザー

2021/01/23 10:28

すみませんでした。 他の方の解決策も試したのですがエラーが取れず、m.ts10806さんに示していただいた公式ドキュメントを読んでも理解できず、回答者様に聞き返すことが申し訳なかったので諦めてしまいました。
m.ts10806

2021/01/23 10:37 編集

回答した以上は、追加要件でもなければ、理解できるまで分かるまで付き合うつもりで投稿してる人のほうが多いです。 理解できないまま新たに同じ投稿されたほうがゲンナリします(私のコメントから伝わるでしょうか)。 そういう人はずっと初心者であるという印象です
m.ts10806

2021/01/23 10:36

ただPHPマニュアルは、いわば仕様書。最も正しいことが書いてあるドキュメントです。活用できるようになってください。 下手な例えや要約や解釈は本質的理解から離れるので、たいていは公式ドキュメントが参考として提示されます。 逆に言えばドキュメント活用できるようになると、初心者から脱せるということにもなります。
退会済みユーザー

退会済みユーザー

2021/01/23 10:50

公式ドキュメントを読み理解できるように頑張ります。
退会済みユーザー

退会済みユーザー

2021/01/23 10:57

質問内容を修正しました。ご教示ください。
退会済みユーザー

退会済みユーザー

2021/01/23 11:25 編集

$counts = $db->prepare('SELECT COUNT(*) AS cnt FROM article WHERE tag LIKE ?'); $counts->execute(array( $_REQUEST['searchTag'] )); $cnt = $counts->fetch(); これで動いたのですが、問題点などないでしょうか。
m.ts10806

2021/01/23 21:25

本件は「SQLインジェクションを防ぎたい」ですよね。 そもそもそれ自体がどんなもので、どういう攻撃手法があるのかを調べるのが先決では? 対策したいのでしたら、コードが先ではできません。
m.ts10806

2021/01/23 21:25 編集

というかそもそもLIKEの件、反映してないんですね。先日の回答が無駄に。
退会済みユーザー

退会済みユーザー

2021/01/25 06:07

ありがとうございました。
m.ts10806

2021/01/25 06:21

投げっぱなしで、これまでのことを役に立たせることもなく投稿した質問をクローズすることなく退会ですか。なんと無責任だこと。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問