【问题标题】:Most efficient way to get data from the database to session将数据从数据库获取到会话的最有效方法
【发布时间】:2010-09-06 17:57:00
【问题描述】:

什么是获取大量数据的最快方法(想想高尔夫)和最有效的方式(想想性能)从 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 注入,这在代码中更进一步。

【问题讨论】:

    标签: php mysql session


    【解决方案1】:

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

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

    编辑:

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

    【讨论】:

      【解决方案2】:

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

      或者,换句话说,为什么需要优化这个?您有性能问题吗?

      您现在正在做的是直截了当的方法,除非您遇到一些具体问题,否则我真的看不出有什么理由要采取不同的做法。

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

      【讨论】:

        【解决方案3】:

        尝试使用 json 为例:

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

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

        澄清:

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

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

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

        顺便说一句 是否有其他人在输入 ] 时遇到问题?我必须把它粘贴进去。

        【讨论】:

          【解决方案4】:

          @Unkwntech 看起来你是对的,但是跟随一个谷歌,它导致了 here 看起来你可能想要更改为 mysql_real_escape_string()

          至于编辑,我更正了 efficient 的拼写,并删除了“what is the”。因为这并不是真正需要的,因为主题说明了一切。

          您可以通过单击问题底部的 "edited a min ago" 文本来查看编辑历史记录(很好地突出显示实际更改)。

          【讨论】:

            【解决方案5】:

            尝试使用 json 为例:

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

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

            是否有其他人在将 ] 输入 Markdown 时遇到问题?我必须把它粘贴进去

            是的,它被窃听了。

            【讨论】:

              【解决方案6】:
              @Anders - 大概有 50-75 列。

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

              【讨论】:

                【解决方案7】:
                与其说它会导致性能问题,不如说我希望代码看起来更简洁。

                然后将用户数据包装在一个类中。直接修改 $_SESSION 看起来有些脏。如果你想将数据保存在字典中——即使你把它放在一个单独的类中,你仍然可以这样做。

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

                【讨论】:

                  【解决方案8】:

                  我想出了这个,它似乎工作。

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

                  【讨论】:

                    【解决方案9】:

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

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

                    【讨论】:

                      【解决方案10】:

                      最高效:

                      $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 但你明白了。

                      【讨论】:

                        猜你喜欢
                        • 2018-07-21
                        • 2010-10-19
                        • 1970-01-01
                        • 1970-01-01
                        • 2017-08-10
                        • 2012-03-22
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多