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

时间:2020-03-05 18:42:45  来源:igfitidea点击:

什么是最快的方式来获取大量数据(想想打高尔夫球),最高效(想想性能)来从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');
...

在有人问我之前,我确实需要"选择

编辑:是的,我正在清理数据,这样就不会再有SQL注入了,这在代码中更进一步。

解决方案

回答

好的,这不能回答问题,但是我们当前的代码是否不让我们接受SQL注入?

我可能是错的,从来没有在PHP中工作过,只是看到了SQL中字符串的使用,并且敲响了警钟!

编辑:

我不打算篡改帖子,我正在纠正拼写错误,请不要回退。

回答

我不确定我们所说的"大量数据"是什么意思,但是在我看来,我们只是为一个用户初始化数据?如果是这样,除非数据库中有数百个列,其中包含几兆字节的数据,否则我认为没有任何理由对此进行优化。

或者换句话说,为什么需要对此进行优化?我们是否遇到性能问题?

我们现在正在做的是简单明了的方法,除非我们有一些特定的问题,否则我真的看不出有任何理由做不同的事情。

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

回答

尝试使用json作为示例:

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

编辑
然后,我们再对$ _SESSION ['data']变量进行json_decode处理,就得到了一个包含所需数据的数组。

澄清:

如果要减少编写的代码行数,可以使用json_encode和json_decode。在问题的示例中,需要一行代码才能将数据库中的每一列复制到SESSION数组中。不用用50-75行代码来完成它,而是可以通过将整个数据库记录" json_encoding"成字符串来用1来实现。该字符串可以存储在SESSION变量中。稍后,当用户访问另一个页面时,SESSION变量与整个JSON字符串一起存在。如果我们想知道名字,可以使用以下代码:

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

此方法不会比逐行复制更快,但是它将节省编码,并且可以更有效地抵抗数据库或者代码中的更改。

顺便提一句
还有其他人在将[]放入减价时会遇到麻烦吗?我必须将其粘贴。

回答

@Unkwntech
看起来我们是正确的,但是跟随一个Google并带领了它,我们似乎可能想要更改为mysql_real_escape_string()

至于编辑,我更正了efficiency的拼写,并删除了" what is the"。.因为主题已经说明了一切,所以这并不是真正需要的。

我们可以通过单击问题底部的"分钟前编辑"文本来查看编辑历史记录(很好地突出显示了实际的更改)。

回答

Try using json for example:

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

该功能的实现是否比他已经完成的速度更快?

Does anyone else have trouble entering ] into markdown? I have to paste it in

是的,它有问题。

回答

@Anders - there are something like 50-75 columns.

同样,除非这实际上在应用程序中引起性能问题,否则我不会为优化它而费心。但是,如果性能存在问题,我会考虑只在最初获取一些数据,然后根据需要延迟加载其他列。

回答

It's not so much that it causing performance problems but that I would like the code to look a bit cleaner.

然后将用户数据包装在一个类中。修改$ _SESSION直接看起来有点脏。如果要将数据保存在字典中,即使将其放在单独的类中也仍然可以执行。

我们还可以实现循环遍历所有列,获取它们的名称并将数据复制到具有相同键名的映射的循环。这样,我们在字典和数据库列名称中由键命名的内部变量将始终相同。 (这还具有在数据库中更改列名时更改变量名的缺点,但这是一个非常普遍且公认的折衷方法。)

回答

我想出了这一点,它似乎可以工作。

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

回答

如果Unkwntech的建议确实可行,我建议我们更改SELECT语句,以使其不会捕获所有内容,因为密码列将是这些字段之一。

至于我们是否需要在会议中保留这些内容,我说为什么不呢?如果我们打算在用户登录时检查数据库(我假设这样做就可以了,是吗?),如果我们计划的话,也可以在会话中存储相当不敏感的信息(例如名称)在整个人的访问过程中使用这些信息。