如何创建动态“$ stop1 = $ _ POST ['stop1'];”用于在表中插入数据的变量和mysql查询

时间:2012-09-29 13:28:58

标签: php phpmyadmin

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
");

3 个答案:

答案 0 :(得分: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,
}

所以如果你是从“街1和街2”改为“街1-2”,重命名将自动影响所有停靠的公交车,依此类推。

答案 1 :(得分:1)

您可以使用 extract extract($_POST)可以提供所需的一切。

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

但不要忘记逃避用户输入。

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

答案 2 :(得分: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);
}