【问题标题】:PHP save array to SQL issuePHP将数组保存到SQL问题
【发布时间】: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_* functionsThese extensions 已在 PHP 7 中删除。了解PDOMySQLiprepared 语句并考虑使用 PDO,it's really not hard
  • @JayBlanchard 我知道它很容易被注入,但该网站并没有广泛分布,但仅限于受信任的人,所以我不想让它对攻击有强大的抵抗力。我将尝试准备好的语句并让您知道它是否有效,但即使出于好奇,我也想知道为什么这发生在当前代码中。感谢您的 cmets。
  • 仅供参考,SQL 注入不是“攻击”,它是在运行时导致语法错误并使O'Hara 呼叫 IT 人员的错误。
  • SQL 注入可以被利用,但即使没有,您仍然会冒可能导致意外行为和错误消息或最终用户功能降级的错误风险,这些很容易避免。

标签: php mysql arrays array-push


【解决方案1】:

数据库不一定将新记录存储在表的末尾。他们还可以重用由先前删除释放的空间。

此外,无论出于何种原因,顺序似乎都是随机的。特别是当你过滤(where子句)或join其他表时,顺序可能会受到影响,因为MySQL使用特定的索引来过滤或join,并且通常会以该顺序返回实际数据。

无论是什么原因,如果您查询数据,您可能会以任意随机顺序获取该数据。如果您需要特定顺序的信息,请通过在查询中添加 ORDER BY 子句来强制执行该顺序。

【讨论】:

    猜你喜欢
    • 2016-03-13
    • 2016-07-10
    • 2010-12-31
    • 1970-01-01
    • 2012-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多