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

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

25.08.2008 08:23:14
10 ОТВЕТОВ

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

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

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

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

0
25.08.2008 08:27:37

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

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

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

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

0
25.08.2008 08:30:56

Попробуйте использовать 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
15.01.2016 15:26:29

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

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

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

0
23.05.2017 12:08:35

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

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

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

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

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

0
25.08.2008 08:35:34
@ Андерс - там что-то около 50-75 столбцов.

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

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

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

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

0
27.05.2010 16:57:26
РЕШЕНИЕ

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

while($row = mysql_fetch_assoc($result))
 {
    $_SESSION = array_merge_recursive($_SESSION, $row);
 }
1
25.08.2008 09:05:49

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

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

0
25.08.2008 10:23:55

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

$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
1.01.2013 20:17:15