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)在您第一次使用之前使用$survey,作为开始或切换到 PDO/MySQLi 并使用输入绑定(准备好的语句)这是 PDO 的准备好的语句文档。可以而且应该做更多的事情来保护自己,但以上是一个好的开始。

于 2012-06-19T18:53:07.373 回答