1

同じ問題に関するいくつかの質問があります。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で行われていないように思われるため、これを確認する方法を理解する必要があります。

4

0 に答える 0