0

PHP で作成した送信スクリプトがあります。これは、私たちの組織で複数の調査で使用されています。調査は他のユーザーによって作成されます。スクリプトに送信すると、PHP はデータを MySQL の適切なテーブルに配置します。私が時々遭遇するエラーは、ユーザーがフォームを更新することです。フィールドを追加するか、入力の名前を変更しますが、スクリプトはすべてが同じであると想定しているため、それを考慮しません。そのため、新しいフィールドが追加されたときに対応できるようにする方法を見つけようとしています。ここに私が持っているものがあります:

 if( mysql_num_rows( mysql_query("SHOW TABLES LIKE '".$survey."'"))){

    echo "table exists";
    $sql = "SELECT * FROM " . $survey . ";";
    $result = mysql_query($sql)
        or die(mysql_error());
    $i=0;

    while($row = mysql_fetch_row($result));{
        echo $row[0];
        foreach($_POST as $k => $v){
            $i++;
            if($k != $row[$i]){
                $query = "ALTER TABLE " . $survey . " ADD " . $k . " VARCHAR(100);";
                mysql_query($query)
                    or die(mysql_error());
            }
        }
    }
}

私は JS で while ループを行うことに慣れているので、ここで i を使用しても機能するかどうかはわかりません (実際、機能しないことはわかっています... 機能しないため...)。私が言おうとしているのは、キーが現在のフィールド名と一致しない場合は、それをテーブルに追加するということです。$row を正しく返すにはどうすればよいですか?

スクリプトに送信すると、「重複する列名 'V4'」と表示されます

echo $row[0] がありますが、1 が返されます。これは、最初のレコードの主キーで使用される int です。

4

1 に答える 1

3

;whileループ宣言の最後に、あるべきではないがあります。上記のコードが何をするのかわからないので、それが問題を引き起こしているかどうかはわかりません。問題がない場合は、質問を更新して;ください。

whileループ宣言は次のようになります。while($row = mysql_fetch_row($result)) {

また、Marc Bは外交的に質問へのコメントにそれを入れているので、クエリに直接入るユーザー入力をエスケープする必要があります。

これを行う最も簡単な方法は$survey = mysql_real_escape_string($survey)、を最初に使用する前に、$surveyPDO / MySQLiの開始または切り替えとして使用し、入力バインディング(プリペアドステートメント)を使用することです。 PDOのプリペアドステートメントのドキュメントは次のとおりです。自分自身を守るためにもっと多くのことができ、そしてすべきですが、上記は良いスタートです。

于 2012-06-19T18:53:07.373 に答える