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 andStreet2」から「Streets1-2」に変更した場合、名前の変更は、そこに停車するすべてのバスに自動的に影響します。

于 2012-09-29T13:37:00.510 に答える
1

extractを使用すると、 必要なものextract($_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 に答える