Самый эффективный способ получить данные из базы данных в сеанс.

StackOverflow https://stackoverflow.com/questions/25767

  •  09-06-2019
  •  | 
  •  

Вопрос

Каков самый быстрый способ получить большой объем данных (например, гольф) и самый эффективный (например, производительность) — получить большой объем данных из базы данных 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, и зазвенел сигнал тревоги!

Редактировать:

Я не пытаюсь исказить ваш пост, я исправлял орфографическую ошибку, пожалуйста, не откатывайтесь назад.

Я не уверен, что вы подразумеваете под «большими объемами данных», но мне кажется, что вы инициализируете данные только для одного пользователя?Если да, то я не вижу смысла оптимизировать это, если в вашей базе данных нет сотен столбцов с несколькими мегабайтами данных.

Или, говоря по-другому, зачем вам это оптимизировать?У вас проблемы с производительностью?

То, что вы делаете сейчас, — это прямой подход, и я не вижу причин делать это по-другому, если только у вас нет каких-то конкретных проблем.

Однако упаковка пользовательских данных в пользовательский объект может помочь в структуре программы.Проверка введенных вами данных, вероятно, также является хорошей идеей.

@Unkwntech выглядит так, как будто вы правы, но следуя за Google, который светодиод здесь похоже, вы можете захотеть перейти на mysql_real_escape_string()

Что касается редактирования, я исправил написание эффективный а также удалил "что такое"..Так как это на самом деле не требуется, поскольку в теме все сказано.

Вы можете просмотреть историю изменений (в которой хорошо показаны фактические изменения), щелкнув значок "отредактировано минуту назад" текст внизу вашего вопроса.

Попробуйте использовать JSON, например:

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

Будет ли реализация этой функции быстрее, чем то, что он уже делает?

У кого-нибудь еще есть проблемы с вводом ] в уценку?мне нужно вставить это

Да, это прослушивается.

@Андерс, там около 50-75 столбцов.

Опять же, если это действительно не вызывает проблем с производительностью вашего приложения, я бы не стал его оптимизировать.Однако если производительность является проблемой, я бы рассмотрел возможность первоначального получения только некоторых данных и ленивой загрузки других столбцов по мере необходимости.

Если предложение Unkwntech действительно работает, я предлагаю вам изменить свой SELECT оператор, чтобы он не захватывал все, поскольку ваш столбец пароля будет одним из этих полей.

Что касается того, нужно ли вам хранить эти вещи в сеансе, я говорю, почему бы и нет?Если вы собираетесь проверять БД при входе пользователя в систему (я предполагаю, что это будет сделано тогда, нет?), в любом случае вы могли бы также хранить довольно неконфиденциальную информацию (например, имя) в сеансе, если вы планируете об использовании этой информации во время посещения человека.

Дело не столько в том, что это вызывает проблемы с производительностью, сколько в том, что мне бы хотелось, чтобы код выглядел немного чище.

Затем оберните пользовательские данные в класс.Изменение $_SESSION напрямую выглядит несколько грязно.Если вы хотите хранить данные в словаре — что вы все равно можете сделать, даже если поместите их в отдельный класс.

Вы также можете реализовать цикл, который перебирает все столбцы, получает их имена и копирует данные на карту с теми же именами ключей.Таким образом, ваши внутренние переменные, названные по ключу в словаре, и имена столбцов базы данных всегда будут одинаковыми.(Это также имеет недостаток, связанный с изменением имени переменной при изменении имени столбца в базе данных, но это довольно распространенный и общепринятый компромисс.)

Попробуйте использовать JSON, например:

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

РедактироватьПозже ты тогда json_decode тот $_SESSION['data'] переменная, и вы получите массив со всеми необходимыми данными.

Уточнение:

Вы можете использовать json_encode и json_decode если вы хотите уменьшить количество строк кода, которые вы пишете.В примере, рассматриваемом в вопросе, требовалась строка кода для копирования каждого столбца базы данных в массив SESSION.Вместо того, чтобы делать это с помощью 50-75 строк кода, вы могли бы сделать это с помощью 1 на json_encoding всю запись базы данных в строку.Эту строку можно сохранить в переменной SESSION.Позже, когда пользователь посещает другую страницу, переменная SESSION присутствует вместе со всей строкой JSON.Если вы затем хотите узнать имя, вы можете использовать следующий код:

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

Этот метод не будет быстрее, чем построчное копирование, но позволит сэкономить код и будет более устойчивым к изменениям в вашей базе данных или коде.

КСТАТИУ кого-нибудь еще есть проблемы с вводом ] в уценку?Мне нужно его вставить.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top