4

コードを mysql_query スタイルのコマンドから PDO スタイルに移行したところ、問題が発生しました。古いコードは次のようになります。

$query_list_menu = "SELECT ".$_GET['section_name']." from myl_menu_hide_show WHERE id='".$_GET['id']."'";

そして、更新されたコードは以下のようになります。どうやらそれは機能していません。$_GET['section_name']データベースのフィールド名を表す文字列に格納します。しかし、変数として渡すと問題があると思います。以下のコードは有効ですか? ありがとう。

$query_list_menu = "SELECT :section_name from myl_menu_hide_show WHERE id=:id";
$result_list_menu = $db->prepare($query_list_menu);
$result_list_menu->bindValue(':section_name', $_GET['section_name'] , PDO::PARAM_STR);
$result_list_menu->bindValue(':id', $_GET['id'] , PDO::PARAM_INT);  
$result_list_menu->execute();
4

2 に答える 2

11

$_GET['section_name']列名が含まれている場合、クエリは次のようになります。

$query_list_menu = "SELECT " . $_GET['section_name'] . " from myl_menu_hide_show WHERE id=:id";

与える:

$query_list_menu = "SELECT :section_name from myl_menu_hide_show WHERE id=:id";
$result_list_menu = $db->prepare($query_list_menu);
$result_list_menu->bindValue(':id', $_GET['id'] , PDO::PARAM_INT);  
$result_list_menu->execute();

その理由は、列の実際の名前をクエリに含める必要があるためです。これをパラメーターに変更したため、あまり意味がありません。

$_GET['section_name']また、このように直接使用すると、SQL インジェクションが可能になるため、重大なセキュリティ リスクになることも付け加えておきます。$_GET['section_name']クエリを作成して実行する前に、列のリストと照合しての値を検証することをお勧めします。

于 2012-07-06T09:04:38.790 に答える