0
if(isset($_POST['id'])) {
    $id=$_POST['id'];
    echo $id;

    $busnumber=$_POST['busnumber'];
    $status=$_POST['status'];
    $startpoint=$_POST['startpoint'];
    $stop1=$_POST['stop1'];
    $stop2=$_POST['stop2'];
}

我想创建动态$stop2=$_POST['stop2'];和 mysql 查询:

$sql = mysql_query("
   UPDATE fromto 
   SET busNumber='$busnumber', status='$status', startPoint='$startpoint', 
     stop1='$stop1', stop2='$stop2', stop3='$stop3', stop4='$stop4', 
     stop5='$stop5', stop6='$stop6', stop7='$stop7'............... 
   WHERE id=$id
");
4

3 回答 3

3

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

于 2012-09-29T13:37:00.510 回答
1

您可以使用extractextract($_POST)提供您想要的一切。

if(isset($_POST['id'])) {
  extract($_POST);
  // ...

但不要忘记转义用户输入。

if(isset($_POST['id'])) {
  extract(array_map('mysql_real_escape_string', $_POST));
  // ...
于 2012-09-29T13:31:33.077 回答
0

你可以试试

$_POST['stop1'] = "xx";
$_POST['stop2'] = "vv";
$_POST['stop3'] = "33v";
$_POST['stop555'] = "55";
$_POST['stop777'] = "77";

$busnumber = $status = $startpoint = $id = 33;

$sql = "UPDATE fromto SET busNumber='$busnumber', status='$status', startPoint='$startpoint'";
$sql .= getStop();
$sql .= "WHERE id=$id";

echo $sql;

输出

UPDATE fromto SET busNumber='33', status='33', startPoint='33'stop1 = 'xx' ,stop2 = 'vv' ,stop3 = '33v' ,stop555 = '55' ,stop777 = '77' WHERE id=33

使用的功能

function getStop() {
    $stop = array_filter($_POST, function ($var) {
        return strpos($var, "stop") == 0;
    });
    array_walk($stop, function (&$var, $key) {
        $var = mysql_real_escape_string($var);
        $var = $key . " = '$var' ";
    }, $stop);
    return implode(",", $stop);
}
于 2012-09-29T13:41:36.140 回答