SQL インジェクションについてまったく心配したくない場合は、準備済みステートメントを使用してください。
PHP で mysqli API と準備済みステートメントを使用すると、コードは次の例のようになります。手続き型スタイルを使用していることに注意してください。オブジェクト指向のスタイルも利用できます。
<?php
$link = mysqli_connect("localhost", "user", "password", "dbname");
/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
// taken from your example
$id = trim(strip_tags(strtoupper($_GET['id'])));
if(!is_numeric($id)) {
die('BAD id');
}
/* create a prepared statement */
if ($stmt = mysqli_prepare($link, "SELECT * FROM games WHERE ID =?")) {
/* bind parameters for markers */
mysqli_stmt_bind_param($stmt, "s", $id);
/* execute query */
$result = mysqli_stmt_execute($stmt);
/* bind result variables */
mysqli_stmt_bind_result($stmt, $col1, $col2, ...);
/* fetch values */
while (mysqli_stmt_fetch($stmt)) {
printf("%s %s\n", $col1, $col2, ...);
}
/* close statement */
mysqli_stmt_close($stmt);
}
/* close connection */
mysqli_close($link);
$id
SQL 構文とは別に、例のようなクエリ データを保持する準備済みステートメント。したがって、データを SQL 構文として解析することはできません。これが推奨される方法です。
PHP と MySQL でプリペアド ステートメントを使用する場合は、mysqli API または PDO_MySQL API を使用する必要があります。いずれにせよ、PHP 用の「古き良き」mysql API は非推奨であり、開発されていないため、それらのいずれかに変更する必要があります。