php mysql テーブル名を変更してSQLを発行したい

pokdonの日記

ホームページを作ってるだけのプロのプログラマーじゃなく、日曜プログラマーなのであまり宛にされても困りますがΣ(;゚∀゚)ノ

table名にプレースホルダー(バインド変数)が使えず、用途によってテーブル名の変更ができずどうすればいいのか困ってる。そんな人達が、インターネットを覗いてると結構躓いてる人がいるので簡単な方法を・・・。
結論から言うとプレースホルダは使えないです。
だからといって

$samplestr="sample";
$sqlstr = "SELECT * FROM ".$samplestr;
$stmt = $pdo -> prepare($sqlstr);
$stmt -> execute();

これだとデータベースエラーが出て実行できません。
ただし、例外的に

$sqlstr = "SELECT * FROM ".$_POST['tablename'];
$stmt = $pdo -> prepare($sqlstr);
$stmt -> execute();

だとSQLが通ります。ただこれは、攻撃してください。と言わんばかりのソースコードになります。(;´д`)

なのである意味本来の正攻法でtable名の変更をします。
用はプレースホルダーを利用せず直接変数をぶちこむ方法です。

$samplestr="sample";
$sqlstr = "SELECT * FROM $samplestr";
$stmt = $pdo -> prepare($sqlstr);
$stmt -> execute();

ポイントは、クォーテーションとクォーテーションの間に変数名を書くのではなく、クォーテーションの中に直接変数名を書くのがポイントです。
これでケース次第でtable名が変更できるだけでなく、諸事情でプレースホルダーを利用できなかったwhere句にもそのまま対応できます。

ただもちろん、この手の形だとセキュリティに問題があるので。

$samplestr="sample";
if(FALSE !== strpos($samplestr,"sample") and  (strlen($samplestr) < 8)){
	$sqlstr = "SELECT * FROM $samplestr";
	$stmt = $pdo -> prepare($sqlstr);
	$stmt -> execute();
//}

こんな感じに余計なデータが入り込まないように条件をしっかり組んでおく必要があります。

ちなみにそんな感じにできるのでテーブル自体の作成もできます。SQLは、phpMyAdmin(MariaDB)のGUIから拾ったものをそのまま貼り付けられます。

$create_BBS = "CREATE TABLE `$create_table_name` (
`uni` int(4) NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT 'ユニーク',
`date` varchar(20) DEFAULT NULL COMMENT '日付',
`name` varchar(20) NOT NULL COMMENT '名前',
`message` text NOT NULL COMMENT 'メッセージ',
`ipaddress` varchar(20) NOT NULL COMMENT 'IPアドレス',
`delete_ipa` varchar(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='掲示板のテーブルです' ROW_FORMAT=COMPACT;";

$res = $pdo->query($create_BBS);

こんな感じでクエリが通ります。
これで製作の幅が広がりますが、やり方次第で諸刃の剣になるのでお互い注意しましょう。

(>_<)

以上Pokdonからでした。

コメント

PAGE TOP
タイトルとURLをコピーしました