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

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

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

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

PHP

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

エスケープ処理

エスケープ処理とは、一連の文字や一文字に対して、一定の規則に従って別の意味を適用する処理過程です。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

2回答

1102閲覧

PHPによるbindValueとLIKEを使用した日付検索について

tikuwachan

総合スコア6

SQL

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

PHP

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

エスケープ処理

エスケープ処理とは、一連の文字や一文字に対して、一定の規則に従って別の意味を適用する処理過程です。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

0クリップ

投稿2023/03/14 02:43

実現したいこと

PHPでのデータベース検索をbindValueとLIKEを使用して実現したい

前提

Eclipse環境のPHPでWebアプリを作っています。
datetime型のカラムからLIKEで検索をかけた際、構文エラーが発生します。
下記はEclipseの変数ウィンドウで$sqlに入っている文字列です。
「SELECT count(*) AS カウント FROM :table WHERE inspectiondate LIKE :testdate ;」

発生している問題・エラーメッセージ

Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''テーブル名' WHERE inspectiondate LIKE '2023-03-14%'' at line 1

該当のソースコード

//$testdateには’2023-03-14’が入っています。 try{ $db=getDb(); $sql="SELECT count(*) AS カウント FROM :table WHERE inspectiondate LIKE :testdate;"; $stt = $db->prepare($sql); $stt->bindValue(':table',$tablename,PDO::PARAM_STR); $testdate=e($testdate);  →ここでhtmlspecialcharsを使用したエスケープ処理の関数にとぶ。 $stt->bindValue(':testdate ',"{$testdate}%",PDO::PARAM_STR); $stt->execute();   ⇒ここでエラーになり、下記のエラーキャッチにとびます。 if ($row = $stt->fetch(PDO::FETCH_ASSOC)) { if ($row['カウント'] != 0) { $coment='同日に測定を行っています。'; } } $db = NULL; } catch (PDOException $e) { die('エラーメッセージ:' . $e->getMessage()); }

試したこと

下記を2点を試しました。
(1)
コマンドプロンプトにて
SELECT count(*) AS カウント FROM テーブル名 WHERE inspectiondate LIKE '2023-03-14%';
でアクセスすると結果が取得可能。
(2)
問題の部分のbindValueを
$stt->bindValue(':testdate', addcslashes($testdate,'-%'),PDO::PARAM_STR);
に書き換えて実行。上記と同様の構文エラーが表示されます。

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

PHP 7.4.33
Apache/2.4.54 (Win64)
Eclipse Version: 2022-12 (4.26)
Windows 11 Pro(2022年10月にWindows10よりバージョンアップしました)

プログラムの初心者で、PHPを勉強しております。
お手数おかけしますが、ご教示よろしくお願い致します。

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

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

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

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

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

guest

回答2

0

ドキュメントを確認しましょう。

https://www.php.net/manual/ja/pdostatement.bindvalue.php
値をパラメータにバインドする

テーブル名やカラム名など「値」ではないものはバインドできません。

投稿2023/03/14 04:12

m.ts10806

総合スコア80731

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

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

tikuwachan

2023/03/14 04:32

m.ts10806様 いつもご教示ありがとうございます。 バインドの仕方、もう少し勉強しなければと思います。。
m.ts10806

2023/03/15 10:01

バインドの仕方というよりドキュメントの活用の仕方を覚えましょう。 それだけで自己解決できることも増えてきます。
guest

0

ベストアンサー

FROM :table

テーブル名はprepare処理でわたせません
ホワイトリストをつくって、合致した場合文字列として指定してあげてください

PHP

1$whitelist=['tbl_a','tbl_b','tbl_c']; 2$tablename='tbl_a'; 3 4if(in_array($tablename,$whitelist)){ 5 $sql="SELECT count(*) AS カウント FROM `$tablename` WHERE inspectiondate LIKE :testdate;"; 6 print $sql; 7} 8```

投稿2023/03/14 03:03

編集2023/03/14 03:22
yambejp

総合スコア114505

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

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

tikuwachan

2023/03/14 04:33 編集

yambejp様 いつもご指摘ありがとうございます。 SQL文に直接変数を埋め込んで渡したところ、結果を取得できることができました。
yambejp

2023/03/14 05:07

> SQL文に直接変数を埋め込んで もしテーブル名がユーザーから渡された値だとしたら、そのまま埋め込む前にかならずバリデーションが必要ですのでご注意ください。(たとえば例示したようなホワイトリスト方式)
tikuwachan

2023/03/15 03:13

yambejp様 ご教示ありがとうございます。 テーブル名は、前ページから「type="hidden"」でセッションの形のまま持ってきたものを使用しておりました。 教えていただいたホワイトリスト方式に変更したいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問