您需要评估所有变量以检查哪些是有效的 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 and Street 2”重命名为“Streets 1-2”,重命名将自动影响所有在此停靠的公交车,依此类推。