【发布时间】:2016-02-12 14:58:33
【问题描述】:
我反复使用表单和保存页面将用户的答案保存到我的 sql 数据库中。最初我将答案保存到一个数组中,一旦达到目标,我使用循环将数组的所有值传递给数据库,更新页面的代码如下所示:
unset($_SESSION['myanswers']);
$_SESSION['myanswers'] = array();
$_SESSION['myanswers']=array(
"File"=>$_POST['file'],
"Rating"=>$_POST['like'],
"Repetitions"=>$_SESSION['reps'],
"degradation"=>$_POST['degradation']
);
$f1=$_SESSION['myanswers']['File'];
$r1=$_SESSION['myanswers']['Rating'];
$r2=$_SESSION['myanswers']['Repetitions'];
$the_id=$_SESSION['user_id'];
$the_deg=$_SESSION['myanswers']['degradation'];
array_push($_SESSION['answers'], $_SESSION['myanswers']);
if($_SESSION['counter']==goal){
require 'connect.php';
foreach( $_SESSION['answers'] as $key => $obj)
{
$f1=$obj['File'];
$r1=$obj['Rating'];
$r2=$obj['Repetitions'];
$the_id=$_SESSION['user_id'];
$the_deg=$obj['degradation'];
$sql = "INSERT INTO `array`(`id`, `file`, `rating`, `repetitions`, `degredation`) VALUES ('$the_id', '$f1', '$r1', '$r2', '$the_deg')";
mysql_query($sql);
}
header("Location: MyEndPage");
die();
}else{
header("Location: MyFormPage");
die();
}
此代码运行良好,但我需要立即保存所有答案,而不是在达到目标时。于是我把代码改成如下:
unset($_SESSION['myanswers']);
$_SESSION['myanswers'] = array();
$_SESSION['myanswers']=array(
"File"=>$_POST['file'],
"Rating"=>$_POST['like'],
"Repetitions"=>$_SESSION['reps'],
"degradation"=>$_POST['degradation']
);
$f1=$_SESSION['myanswers']['File'];
$r1=$_SESSION['myanswers']['Rating'];
$r2=$_SESSION['myanswers']['Repetitions'];
$the_id=$_SESSION['user_id'];
$the_deg=$_SESSION['myanswers']['degradation'];
require 'connect.php';
$sql = "INSERT INTO `array`(`id`, `file`, `rating`, `repetitions`, `degredation`) VALUES ('$the_id', '$f1', '$r1', '$r2', '$the_deg')";
mysql_query($sql);
if($_SESSION['counter']==goal){
header("Location: MyEndPage");
die();
}else{
header("Location: MyFormPage");
die();
}
这就是问题出现的时候,新条目总是保存在旧数据和新数据之间的同一位置。例如,如果在更改之前我保存了 5 个条目,它们在 sql 数组中的顺序将是这样的:
1,名称1,数据1
2、名称2、数据2
3、名称3、数据3
4、名称4、数据4
5、名称5、数据5
使用新代码重复添加新条目是有问题的,例如,如果我们添加条目 6、7、8,它们的添加方式如下:
1,名称1,数据1 | 1,名称1,数据1 | 1、名称1、数据1
2、名称2、数据2 | 2、名称2、数据2 | 2、名称2、数据2
3、名称3、数据3 | 3、名称3、数据3 | 3、名称3、数据3
4、名称4、数据4 | 4、名称4、数据4 | 4、名称4、数据4
5、名称5、数据6 | 5、名称5、数据6 | 5、名称5、数据6
6、名称6、数据5 | 7、名称7、数据7 | 8、名称8、数据8
--------------------- | 6、名称6、数据6 | 7、名称7、数据5
--------------------- | --------------------- | 6、名称6、数据6
由于某种原因,insert into 不会在 sql 数组的末尾进行,而是在使用旧代码收集的数据的末尾进行堆栈。我尝试对代码进行一些调整,但没有任何效果。
【问题讨论】:
-
如果可以的话,你应该stop using
mysql_*functions。 These extensions 已在 PHP 7 中删除。了解PDO 和 MySQLi 的 prepared 语句并考虑使用 PDO,it's really not hard。 -
@JayBlanchard 我知道它很容易被注入,但该网站并没有广泛分布,但仅限于受信任的人,所以我不想让它对攻击有强大的抵抗力。我将尝试准备好的语句并让您知道它是否有效,但即使出于好奇,我也想知道为什么这发生在当前代码中。感谢您的 cmets。
-
仅供参考,SQL 注入不是“攻击”,它是在运行时导致语法错误并使
O'Hara呼叫 IT 人员的错误。 -
SQL 注入可以被利用,但即使没有,您仍然会冒可能导致意外行为和错误消息或最终用户功能降级的错误风险,这些很容易避免。
标签: php mysql arrays array-push