0

那么我有一个问题,需要建议。

我目前正在上传一个包含产品数据的 csv 文件。可以有很多产品。我正在使用库读取 csv 文件,而不是将所有数据放入数组中。现在我遇到了一种情况,我被困住了如何解决这个问题。

斯堪里奥:

上传 csv 后,用户有一个包含 9 个特定列的表单。来自 csv 的所有列都应该进入一个数组,该数组将显示为下拉列表。在左侧,表单将包含特定字段,在每个字段之前的右侧,将有一个包含 csv 列名称的下拉列表。选择地图按钮后,将单击从数组中选择列并将其保存到表中。现在我不知道如何在用户选择要映射的列时保存数据而不保存到表中。我该怎么办?我应该把整个数组放在一个隐藏的字段中吗?请建议。

4

2 回答 2

1

现在我不知道如何在用户选择要映射的列时保存数据而不保存到表中。我该怎么办?我应该把整个数组放在一个隐藏的字段中吗?请建议。

您可以将它们存储在会话变量中,这样您存储的任何内容都会为每个用户单独保留,直到该用户注销或您的代码的某些部分明确删除它。(比如说,在您丢弃或永久保存数据库上的数据之后)。

希望您已经在使用会话,现在看看php.net 上的会话变量

注意:我从未使用过 codeigniter,但快速搜索显示它包含一个用于管理会话的类,在 FlashData 下查看,这似乎是执行此操作的“codeigniter 方式”。


编辑:

Codeigniter 会话变量有 4KB 的限制,这对您来说可能足够,也可能不够。如果不是,您总是使用以下替代方法之一:

  1. 使用数据库存储数据,并在会话变量中存储一些项目 id 和用户 id 以便能够检索它。

  2. 使用文件,您可以生成一个随机名称并将其存储在会话变量中,然后将您需要的任何内容存储在文件中。

如果您无法处理会话的结束,您可以将过期日期存储在数据库中并通过编程任务(您可以使用 crons 吗?)从临时表(或文件)中删除过期项目。

虽然,小心!我不知道codeigniter的安全性......但是,有一些风险。您可能希望添加一个隐藏的“令牌”字段,该字段具有与数据库表中的用户关联的随机唯一值以及与会话生命周期相匹配的到期日期。您应该在每次发送表单时创建一个新令牌,并在收到它后验证提交表单中的令牌是否与数据库中用户(由会话标识)的有效令牌匹配,如果是,则删除令牌并继续处理表格的其余部分。如果令牌不匹配或不再有效,则会话已过期,有人一直在弄乱 cookie,或者您在攻击中幸存下来(有人使用旧令牌重新创建帖子的情况)。

我再说一遍,我不知道代码编辑器的安全性。但如果我是那个框架的作者,它已经实现了令牌......所以,这个安全风险很可能已经被覆盖了。

您可以在 OWASP 了解有关跨站点请求伪造的更多信息。

于 2013-02-25T18:43:56.163 回答
0

为什么不将用户数据存储在会话中?这样,您可以将它从一个页面传递到另一个页面,而无需将其放入 HTML 中(用户可以轻松更改它)。

您最好的选择是会话或 cookie。Cookie 的局限性在于它们只能包含一定数量的数据,并且由于cookie 存储在客户端计算机上,因此您只能使用一定数量的 cookie。 您可以使用会话,这会将信息保存在服务器上。Codeigniter 将大小限制为 4kb。为此,您只需在 PHP 中添加

session_start()

到您希望使用会话变量的每个页面的顶部。

你应该清理你的用户输入。要设置会话变量,请使用赋值运算符 (=)。

$_SESSION['var'] = filter_input( INPUT_POST, 'field_name', FILTER_SANITIZE_FULL_SPECIAL_CHARS );

如果您使用 get,则可以使用 INPUT_GET。

如果用户没有提交表单,您可以通过 javascript 添加事件侦听器,当表单值填写完毕后,您可以将它们存储在 cookie 中并使用 PHP 从 cookie 中提取数据。

始终最好在服务器上清理和验证用户数据。

于 2013-02-25T20:54:28.203 回答