我有一个提交脚本,我用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,但它返回一个1,这是第一条记录的主键中使用的整数。
发布于 2012-06-20 02:53:07
在while循环声明的末尾有一个不应该出现的;。不确定这是否是导致问题的原因,因为您没有说明上面的代码做了什么。如果;不是问题所在,请更新问题。
您的while循环声明应该如下所示:while($row = mysql_fetch_row($result)) {
此外,正如Marc B在对您的问题的评论中如此圆滑地提出的那样,您应该转义任何直接进入查询的用户输入。
最简单的方法是在第一次使用$survey之前使用$survey = mysql_real_escape_string($survey),作为启动或切换到PDO/MySQLi并使用input binding (prepared statements)。Here are the prepared statements docs for PDO。为了保护自己,我们可以也应该做更多的事情,但以上是一个很好的开始。
https://stackoverflow.com/questions/11107450
复制相似问题