すべての変数を評価して、どれが有効なSQLフィールドであるかを確認する必要があります。最も一般的なケースでは、POST名とSQL名が似ていない場合があります。
その時点で、変数を設定する必要さえありません。
小切手を追加したのescape
は、誰かがあなたを送ってくれたからです。
'; --
の値としてbusNumber
、クエリは次のようになります。
UPDATE table SET busNumber=''; --', status=...
「-」がコメントを開始するため、MySQLは次のように表示します。
UPDATE table SET busNumber=''; -- *all the rest ignored*
これにより、テーブル全体busNumber
の列が破損します。あなたはそうこれが起こらないようにしたいのです。PDOは、このような問題の防止に役立つ関数の優れた代替手段です。mysql_*
とにかく、あなたは使うmysql_*
ので:
$id = (int)$_POST['id'];
$fields = array( // ALL FIELDS EXCEPT ID
'status' => 'status',
...
);
$update = array();
// Since we're not using PDO we have to do a small check ourselves
foreach($fields as $sql => $post)
{
if (!isset($_POST[$post]))
$value = 'NULL';
else
{
// If you want to set the variable:
// ${$post} = $value;
// or
// ${$sql} = $value;
$value = mysql_real_escape($_POST[$post]);
if (!is_numeric($value))
$value = "'$value'";
}
$update[] = "$sql = $value";
}
$query = "UPDATE table SET " . implode(',', $update) . " WHERE id=$id";
mysql_query($query);
stop*
さらに、列を削除して別のテーブルに配置することにより、スキーマを正規化することは(パフォーマンス面およびメンテナンス面で)おそらく有用です。
CREATE TABLE busStops {
id_bus integer,
active boolean,
seq_no integer,
name varchar(200)
};
あるいは
CREATE TABLE busStops {
id integer not null primary key auto_increment,
name varchar(200)
// other geographical information
};
CREATE TABLE bus_has_stop {
id_bus integer,
id_stop integer,
sequenc integer,
}
たとえば、停車地の名前を「Street 1 andStreet2」から「Streets1-2」に変更した場合、名前の変更は、そこに停車するすべてのバスに自動的に影響します。