Сведения о вопросе

GANGST1ER

06:22, 10th August, 2020

Теги

php   mysql   session    

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

Просмотров: 437   Ответов: 10

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

Edit: Да, Я дезинфицирую данные, так что не может быть никакой инъекции SQL, которая находится дальше в коде.



  Сведения об ответе

COOL

16:06, 28th August, 2020

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

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


  Сведения об ответе

appple

13:30, 16th August, 2020

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

$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 - это поле массива.. который содержит значение для этого поля.

EDIT: исправлены некоторые синтаксические ошибки :P но вы поняли идею.


  Сведения об ответе

repe

03:47, 21st August, 2020

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

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

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

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


  Сведения об ответе

DO__IT

12:27, 11th August, 2020

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

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

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

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


  Сведения об ответе

prince

04:25, 21st August, 2020

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

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

Кстати , у кого-нибудь еще есть проблемы с вводом ] в markdown? Я должен вставить его туда.


  Сведения об ответе

lourence

07:12, 15th August, 2020

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

Что касается правки, я исправил написание efficient , а также удалил "what is the".. Поскольку это действительно не требуется, поскольку тема говорит все это.

Вы можете просмотреть историю редактирования (которая красиво подчеркивает фактические изменения), нажав на текст "edited a min ago" в нижней части вашего вопроса.


  Сведения об ответе

SEEYOU

13:48, 17th August, 2020

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

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

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

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

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


  Сведения об ответе

ASER

07:12, 25th August, 2020

@Anders - есть что-то вроде 50-75 столбцов.

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


  Сведения об ответе

SSESION

06:33, 17th August, 2020

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

Затем оберните пользовательские данные в класс. Modifyng $_SESSION непосредственно выглядит несколько грязновато. Если вы хотите сохранить данные в dictionary—which, вы все равно можете это сделать, даже если вы поместите их в отдельный класс.

Можно также реализовать цикл, который повторяется по всем столбцам, получает их имена и копирует данные на карту с теми же именами ключей. Таким образом, ваш внутренний ключ variables—named by в именах столбцов базы данных dictionary—and всегда будет одним и тем же. (Это также имеет обратную сторону изменения имени переменной при изменении имени столбца в базе данных, но это довольно распространенный и хорошо принятый компромисс.)


  Сведения об ответе

park

11:00, 9th August, 2020

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться