Самый эффективный способ получить данные из базы данных в сессию - PullRequest
2 голосов
/ 25 августа 2008

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

Ответы [ 10 ]

1 голос
/ 23 февраля 2012

Наиболее эффективно:

$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, но вы поняли.

1 голос
/ 25 августа 2008

Я придумал это, и это, кажется, работает.

while($row = mysql_fetch_assoc($result))
 {
    $_SESSION = array_merge_recursive($_SESSION, $row);
 }
0 голосов
/ 25 августа 2008

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

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

0 голосов
/ 25 августа 2008
@ Андерс - есть что-то вроде 50-75 столбцов.

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

0 голосов
/ 25 августа 2008
Это не так сильно, что вызывает проблемы с производительностью, но я бы хотел, чтобы код выглядел немного чище.

Затем оберните данные пользователя в классе. Модификация $ _SESSION напрямую выглядит несколько грязной. Если вы хотите сохранить данные в словаре - это можно сделать, даже если вы поместите их в отдельный класс.

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

0 голосов
/ 25 августа 2008

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

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

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

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

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

0 голосов
/ 25 августа 2008

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

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

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

0 голосов
/ 25 августа 2008

Попробуйте использовать 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'];

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

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

0 голосов
/ 25 августа 2008

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

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

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

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

0 голосов
/ 25 августа 2008

ОК, это не отвечает на ваш вопрос, но разве ваш текущий код не оставляет вас открытым для SQL-инъекций?

Я могу ошибаться, никогда не работал в PHP, просто видел использование строк в SQL, и зазвонил сигнал тревоги!

Edit:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...