Как зайти в Даркнет?!
25th January, 01:11
5
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
893
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
912
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4350
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4395
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Наиболее эффективный способ получить данные из базы данных в сеанс
Каков самый быстрый способ получить большой объем данных (подумайте о гольфе) и самый эффективный (подумайте о производительности), чтобы получить большой объем данных из базы данных 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, которая находится дальше в коде.
Наиболее эффективный:
$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 но вы поняли идею.
Хорошо, это не ответ на ваш вопрос, но разве ваш текущий код не оставляет вас открытым для SQL инъекций?
Я мог ошибаться, никогда не работал в PHP, просто увидел использование струн в SQL и начал звонить сигнал тревоги!
Редактировать:
Я не пытаюсь вмешиваться в ваш пост, я исправлял орфографическую ошибку, пожалуйста, не откатывайтесь.
Я не уверен, что вы подразумеваете под "большими объемами данных", но мне кажется, что вы инициализируете данные только для одного пользователя? Если да, то я не вижу никаких причин для оптимизации этого, если только у вас нет сотен столбцов в вашей базе данных с несколькими мегабайтами данных в них.
Или, говоря иначе, зачем вам нужно это оптимизировать? У вас есть проблемы с производительностью?
То, что вы делаете сейчас,-это прямой подход, и я действительно не вижу причин делать это по-другому, если у вас нет каких-то особых проблем с этим.
Однако перенос пользовательских данных в объект пользователя может помочь некоторым в структуре программы. Проверка ваших входных данных, вероятно, также является хорошей идеей.
Попробуйте использовать 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? Я должен вставить его туда.
@Unkwntech Похоже, что вы правы, но после Google, который привел сюда , похоже, что вы можете изменить на mysql_real_escape_string()
Что касается правки, я исправил написание efficient , а также удалил "what is the".. Поскольку это действительно не требуется, поскольку тема говорит все это.
Вы можете просмотреть историю редактирования (которая красиво подчеркивает фактические изменения), нажав на текст "edited a min ago" в нижней части вашего вопроса.
@Anders - есть что-то вроде 50-75 столбцов.
Опять же, если это на самом деле не вызывает проблем с производительностью в вашем приложении, я бы не стал утруждать себя его оптимизацией. Если, однако, производительность является проблемой, я бы рассматривал только получение некоторых данных изначально и ленивую загрузку других столбцов по мере их необходимости.
Дело не столько в том, что это вызывает проблемы с производительностью, сколько в том, что я хотел бы, чтобы код выглядел немного чище.
Затем оберните пользовательские данные в класс. Modifyng $_SESSION непосредственно выглядит несколько грязновато. Если вы хотите сохранить данные в dictionary—which, вы все равно можете это сделать, даже если вы поместите их в отдельный класс.
Можно также реализовать цикл, который повторяется по всем столбцам, получает их имена и копирует данные на карту с теми же именами ключей. Таким образом, ваш внутренний ключ variables—named by в именах столбцов базы данных dictionary—and всегда будет одним и тем же. (Это также имеет обратную сторону изменения имени переменной при изменении имени столбца в базе данных, но это довольно распространенный и хорошо принятый компромисс.)
Если предложение Unkwntech действительно работает, я предлагаю вам изменить свой оператор SELECT , чтобы он не захватывал все, так как ваш столбец пароля будет одним из этих полей.
Что касается того, нужно ли вам держать этот материал в сеансе, я говорю, почему бы и нет? Если вы собираетесь проверить DB, когда пользователь входит в систему (я предполагаю, что это будет сделано тогда, нет?) в любом случае, вы можете также хранить довольно несекретную информацию (например, имя) в сеансе, если планируете использовать эту информацию в течение всего визита человека.