同じ問題に関するいくつかの質問があります。SQLインジェクションを軽減するために、MySQL接続/コマンドの一部をPDOに更新しようとしています。私はこのコードを変換しようとしています:
$ulog = $_POST['driver'];
$_SESSION['user_id'] = $ulog;
$tablename_cc = "cc_".$ulog;
$tablename_db = "db_".$ulog;
$tablename_misc = "misc_".$ulog;
$tablename_cash = "cash_".$ulog;
$sql_cc = "SELECT * FROM " .$tablename_cc;
$sql_db = "SELECT * FROM " .$tablename_db;
$sql_misc = "SELECT * FROM " .$tablename_misc;
$sql_cash = "SELECT * FROM " .$tablename_cash;
$result_cc = mysql_query($sql_cc);
$result_db = mysql_query($sql_db);
$result_misc = mysql_query($sql_misc);
$result_cash = mysql_query($sql_cash);
次のコードに:
$tables = array($tablename_cc, $tablename_db, $tablename_misc, $tablename_cash);
$A = count($tables);
$result = array();
try {
$STH = $DBH->prepare('SELECT * FROM :table');
$i = 0;
while($i < $A) {
$STH->bindParam(':table', $tables[$i]);
$STH->execute();
$result[$i] = $STH->fetchAll();
$i++;
}
}
catch(PDOException $e) {
echo $e->getMessage();
}
ただし、構文エラーが発生し続けます。次の方法で試してみるとエラーはなくなりますが、SQLインジェクションを回避できないため、この方法はあまり役に立ちません。
try {
$i = 0;
while($i < $A) {
$STH = $DBH->query('SELECT * FROM ' .$tables[$i]);
$result[$i] = $STH->fetchAll();
$i++;
}
}
catch(PDOException $e) {
echo $e->getMessage();
}
この最後の方法は機能しますが、私の理解では、SQLインジェクションの軽減には役立ちません。そして、私が遭遇している2番目の問題は、これらのテーブルが存在しない場合があり、古い方法でのこれらの問題の回避策は、小さなチェックを行うことでした。
$result_cc = mysql_query($sql_cc);
if(mysql_num_rows($result_cc) != 0){}
ただし、この中間ステップはPDOで行われていないように思われるため、これを確認する方法を理解する必要があります。