从数据库到会话获取数据的最有效方法

时间:2008-08-25 08:23:15

标签: php mysql session

获取大量数据(想想高尔夫)和最有效(思考性能)的最快方法是从MySQL数据库获取大量数据到会话而不必继续做我已经拥有的:

$sql = "SELECT * FROM users WHERE username='" . mysql_escape_string($_POST['username']) . "' AND password='" . mysql_escape_string(md5($_POST['password'])) . "'";
$result = mysql_query($sql, $link) or die("There was an error while trying to get your information.\n<!--\n" . mysql_error($link) . "\n-->");
if(mysql_num_rows($result) < 1)
 {
    $_SESSION['username'] = $_POST['username'];
    redirect('index.php?p=signup');
 }
$_SESSION['id'] = mysql_result($result, '0', 'id');
$_SESSION['fName'] = mysql_result($result, '0', 'fName');
$_SESSION['lName'] = mysql_result($result, '0', 'lName');
...

在有人问起之前,我确实需要'SELECT

编辑:是的,我正在清理数据,因此无法进行SQL注入,这在代码中更进一步。

10 个答案:

答案 0 :(得分:1)

我想出了这个,似乎有效。

while($row = mysql_fetch_assoc($result))
 {
    $_SESSION = array_merge_recursive($_SESSION, $row);
 }

答案 1 :(得分:1)

效率最高:

$get = mysql_query("SELECT * FROM table_name WHERE field_name=$something") or die(mysql_error());

$_SESSION['data'] = mysql_fetch_assoc($get);

完成。

现在存储在一个数组中。所以说一个字段就是你刚用的用户名:

echo $_SESSION['data']['username'];

Data是数组的名称 - username是数组字段..它保存该字段的值。

编辑:修正了一些语法错误:P但你明白了。

答案 2 :(得分:0)

好的,这不能回答你的问题,但是你当前的代码不会让你对SQL注入开放吗?

我可能是错的,从未在PHP中工作,只是在SQL中看到了字符串的使用并且铃声开始响起!

编辑:

我不是要篡改你的帖子,我正在纠正拼写错误,请不要回滚。

答案 3 :(得分:0)

我不确定“大量数据”是什么意思,但在我看来,你只是为一个用户初始化数据?如果是这样,我认为没有任何理由来优化它,除非你的数据库中有数百个列,其中包含几兆字节的数据。

或者,换句话说,为什么需要对此进行优化?你有性能问题吗?

你现在正在做的是直截了当的做法,除非你遇到一些具体问题,否则我真的看不出有任何理由这样做。

将用户数据包装在用户对象中可能会对程序结构有所帮助。验证您的输入可能也是一个好主意。

答案 4 :(得分:0)

尝试使用json例如:

$_SESSION['data'] = json_encode(mysql_fetch_array($result));

修改 稍后你会json_decode $_SESSION['data']变量,你得到一个包含你需要的所有数据的数组。

<强>澄清:

如果您想减少编写的代码行数,可以使用json_encodejson_decode。在问题的示例中,需要一行代码将数据库中的每个列复制到SESSION数组。您可以使用1 json_encoding将整个数据库记录转换为字符串,而不是使用50-75行代码。该字符串可以存储在SESSION变量中。稍后,当用户访问另一个页面时,SESSION变量将包含整个JSON字符串。如果您想知道名字,可以使用以下代码:

$fname = json_decode($_SESSION['data'])['fname'];

此方法不会比逐行复制更快,但它会保存编码,并且更能抵抗数据库或代码中的更改。

<强>顺便说一句 有没有其他人在进入降价时遇到麻烦?我必须将其粘贴。

答案 5 :(得分:0)

@Unkwntech 看起来你是对的,但跟着谷歌,导致here看起来你可能想要改成 mysql_real_escape_string()

至于编辑,我更正了高效的拼写,并删除了“是什么”。由于主题说明了所有内容,因此并不是真的需要。

您可以点击问题底部的"edited a min ago"文字,查看修改历史记录(可以很好地突出显示实际更改)。

答案 6 :(得分:0)

尝试使用json例如:

$_SESSION['data'] = json_encode(mysql_fetch_array($result));

该功能的实现是否比他现在所做的更快?

有没有其他人在进入降价时遇到问题?我必须将其粘贴到

是的,它被窃听了。

答案 7 :(得分:0)

@Anders - 有50-75列。

同样,除非这实际上导致应用程序出现性能问题,否则我不会为优化它而烦恼。但是,如果性能是一个问题,我会考虑最初获取一些数据,并在需要时延迟加载其他列。

答案 8 :(得分:0)

它并没有引起性能问题,但我希望代码看起来更清晰。

然后将用户数据包装在一个类中。 Modifyng $ _SESSION看起来有点脏。如果您想将数据保存在字典中 - 即使您将其放在单独的类中,您仍然可以执行该操作。

您还可以实现一个遍历所有列的循环,获取其名称并将数据复制到具有相同键名的映射。这样,您在字典和数据库列名中按键命名的内部变量将始终相同。 (当您更改数据库中的列名时,这也有改变变量名称的缺点,但这是一个非常普遍且被广泛接受的权衡。)

答案 9 :(得分:0)

如果Unkwntech的建议确实有效,我建议您更改SELECT语句,以便它不会抓取所有内容,因为您的密码列将是其中一个字段。

至于你是否需要在会议中保留这些东西,我说为什么不呢?如果您要在用户登录时检查数据库(我假设这样做,那么,不是吗?)无论如何,如果您计划,您还可以在会话中存储相当不敏感的信息(如姓名)在整个访问过程中使用该信息。