题
获取大量数据(想想高尔夫)的最快方法是什么,以及从 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 注入,这在代码中更进一步。
解决方案
我想出了这个并且它似乎有效。
while($row = mysql_fetch_assoc($result))
{
$_SESSION = array_merge_recursive($_SESSION, $row);
}
其他提示
最有效:
$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'];
数据是数组的名称 - 用户名是数组字段。它保存该字段的值。
编辑:修复了一些语法错误:P 但你明白了。
好吧,这并不能回答你的问题,但是你当前的代码是否让你对 SQL 注入持开放态度?
我可能是错的,从来没有使用过 PHP,只是看到 SQL 中字符串的使用,警钟就开始敲响了!
编辑:
我并不是想篡改您的帖子,我只是纠正拼写错误,请不要回滚。
我不确定你所说的“大量数据”是什么意思,但在我看来你只是为一个用户初始化数据?如果是这样,我认为没有任何理由对此进行优化,除非您的数据库中有数百列,其中包含数兆字节的数据。
或者,换句话来说,为什么需要优化它?您有性能问题吗?
你现在正在做的是直接的方法,我真的看不出有任何理由以不同的方式做,除非你有一些具体的问题。
不过,将用户数据包装在用户对象中可能会对程序结构有所帮助。验证您的输入可能也是一个好主意。
尝试使用 json 例如:
$_SESSION['data'] = json_encode(mysql_fetch_array($result));
该功能的实现是否比他已经在做的更快?
还有其他人在进入 Markdown 时遇到困难吗?我必须把它粘贴进去
是的,它被窃听了。
@Anders - 有大约 50-75 列。
同样,除非这实际上导致您的应用程序出现性能问题,否则我不会费心优化它。但是,如果性能是一个问题,我会考虑最初只获取一些数据,并根据需要延迟加载其他列。
如果Unkwntech的建议确实有效,我建议你改变你的 SELECT
语句,这样它就不会抓取所有内容,因为您的密码列将是这些字段之一。
至于会话中是否需要保留这些东西,我说为什么不呢?如果您要在用户登录时检查数据库(我假设这会完成,不是吗?)无论如何,如果您计划的话,您也可以在会话中存储相当不敏感的信息(例如名称)在该人的整个访问过程中使用该信息。
与其说它会导致性能问题,不如说我希望代码看起来更干净一些。
然后将用户数据包装在一个类中。直接修改$_SESSION看起来有些脏。如果您想将数据保存在字典中,即使您将其放在单独的类中,您仍然可以这样做。
您还可以实现一个循环,迭代所有列,获取它们的名称并将数据复制到具有相同键名称的映射。这样,您的内部变量(按字典中的键命名)和数据库列名称将始终相同。(这也有一个缺点,即当您更改数据库中的列名称时,变量名称也会更改,但这是一个非常常见且广泛接受的权衡。)
尝试使用 json 例如:
$_SESSION['data'] = json_encode(mysql_fetch_array($result));
编辑稍后你再 json_decode
这 $_SESSION['data']
变量,你就得到了一个包含你需要的所有数据的数组。
澄清:
您可以使用 json_encode
和 json_decode
如果您想减少编写的代码行数。在问题的示例中,需要一行代码将数据库中的每一列复制到 SESSION 数组。您可以使用 1 by 来完成此操作,而不是使用 50-75 行代码来完成 json_encoding
将整个数据库记录转换为字符串。该字符串可以存储在 SESSION 变量中。稍后,当用户访问另一个页面时,SESSION 变量与整个 JSON 字符串一起存在。如果您想知道名字,可以使用以下代码:
$fname = json_decode($_SESSION['data'])['fname'];
此方法不会比逐行复制更快,但它将节省编码,并且更能抵抗数据库或代码中的更改。
顺便提一句还有其他人在进入 Markdown 时遇到困难吗?我必须把它粘贴进去。