С Новым годом! Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/41: Рейтинг темы: голосов - 41, средняя оценка - 4.76
 Аватар для Ph_mx
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 38

Вывод информации из БД используя сессию

29.10.2012, 02:37. Показов 8186. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
добрый вечер!
возник вопрос-при авторизации на сайте, я создаю сессию, где хранятся мои e-mail и password,
PHP
1
2
3
4
5
function cleanMemberSession($login, $password) {
  $_SESSION["email"]=$email;
  $_SESSION["password"]=$password;
  $_SESSION["loggedIn"]=true;
}
их я и могу вывести на главной странице после,
PHP
1
2
3
checkLoggedIn("yes");
print("<b>".$_SESSION["email"]."</b><br>\n");
print("Ваш пароль: <b>".$_SESSION["password"]."</b><br>\n");
но не могу вывести из БД имя и фамилию, которые соответствуют этой связке пароль\мыло
как мне составить запрос к MySQL, который бы выводил мне эти данные?
что то типа этого
PHP
1
2
$username = mysql_query("SELECT name FROM users WHERE email='".$_SESSION['email']."'",$db);
$name = mysql_fetch_array($username);
Добавлено через 2 часа 22 минуты
дурак, не заметил переменной на подключение к БД. возник другой вопрос-изменение данных в чем ошибка
PHP
1
2
3
4
5
6
7
8
9
function updPass($password) {
 
  global $db;
 
  $query="UPDATE users SET password = $_POST[$password]";
  $result=mysql_query($query, $db) or die("Died inserting pass into db.  Error returned if any: ".mysql_error());
 
  return true;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.10.2012, 02:37
Ответы с готовыми решениями:

Определить средний балл студентов, успешно сдавших сессию, используя двумерный массив
Помогите пожалуйста! Карма +100000. Задан двумерный числовой массив из 25 строк и 7 столбцов, в котором записаны оценки на сессии...

ID клиента и его вывод через сессию
Такое дело! Есть код: session_start(); if (isset($_SESSION) == '' ){ $conn = mysql_connect(&quot;localhost&quot;, &quot;xxx&quot;,...

Вывод блока один раз за сессию
Привет! Ребят, подскажите, как реализовать следующее: Нужно, чтобы выводилось всплывающее окно один раз за сессию и после...

15
 Аватар для Andruhin
142 / 142 / 27
Регистрация: 19.12.2011
Сообщений: 250
29.10.2012, 22:04
Цитата Сообщение от Ph_mx Посмотреть сообщение
PHP
1
2
3
4
5
6
7
8
9
function updPass($password) {
 
  global $db;
 
  $query="UPDATE users SET password = $_POST[$password]";
  $result=mysql_query($query, $db) or die("Died inserting pass into db.  Error returned if any: ".mysql_error());
 
  return true;
}
Запрос
MySQL
1
UPDATE users SET password = $_POST[$password]
заменит у всех существующих пользователей пороль, на пароль переданный в посте.
Чтобы заменить пароль конкретного пользователя нужно использовать первичный ключ, например
MySQL
1
UPDATE users SET password = $_POST[$password] WHERE user_id = $user_id
Хотелось бы добавить:
  1. Пароли не хранят в базе данных в чистом виде. Обычно в базу записывают хеш пароля (md5, sha1 и т.п.), и при вводе пользователем пароля при авторизации сравнивают хеши, а не пароли в чистом виде.
  2. Нельзя передавать в SQL запрос не проверенные данные сразу из глобального массива. Это серьезная дыра в безопасности, через которую злоумышленники могут подсунуть SQL-инъекцию.
1
 Аватар для Ph_mx
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 38
29.10.2012, 23:14  [ТС]
спасибо) насчет мд5 - у меня стоит защита типа
PHP
1
$password=md5($password.$salt)
как тогда обойти передачу данных из глобального массива? неужели чем то типа
PHP
1
$_POST[$password]=$pass
следовательно
SQL
1
UPDATE users SET password = $pass WHERE user_id = $user_id
так можно?
0
 Аватар для fa2m
356 / 280 / 22
Регистрация: 27.08.2012
Сообщений: 855
29.10.2012, 23:20
Цитата Сообщение от Ph_mx Посмотреть сообщение
PHP
1
$_POST[$password]=$pass
Вы хотели сказать:
PHP
1
$pass = $_POST[$password];
так?
Не обязательно вводить дополнительную переменную, просто проверьте $_POST разными функциями, типа trim, strip_tags (там ещё какая-то кавычки удаляет, не помню точно )
1
 Аватар для Ph_mx
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 38
29.10.2012, 23:59  [ТС]
возник вопрос как мне решить данную проблему
PHP
1
2
3
4
5
6
7
8
9
10
function updEmail($email) {
  global $link;
  $id = mysql_query("SELECT id FROM users WHERE email='".$_SESSION['email']."'",$link);
  $user_id = mysql_fetch_array($id);
$mail=$_POST[$email];
  $query="UPDATE users SET email = '$mail' WHERE id = '$user_id'";
  $result=mysql_query($query, $link) or die("Died inserting email info into db.  Error returned if any: ".mysql_error());
 
  return true;
}
выдает ошибку Died inserting email info into db. Error returned if any: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE id = 'Array'' at line 1, оно то в принципе понятно, что он не принимает массивы в качестве информации, но как бы мне тогда по-другому решить проблему?
0
 Аватар для fa2m
356 / 280 / 22
Регистрация: 27.08.2012
Сообщений: 855
30.10.2012, 00:08
PHP
1
2
3
4
5
6
7
8
9
10
11
12
function updEmail($email) {
* global $link;
* $id = mysql_query("SELECT id FROM users WHERE email='".$_SESSION['email']."'",$link);
 
* $user_id = mysql_fetch_array($id, MYSQL_NUM);
  $user_id = $user_id[0];
 
$mail=$_POST[$email];
* $query="UPDATE users SET email = '$mail' WHERE id = '$user_id'";
* $result=mysql_query($query, $link) or die("Died inserting email info into db. *Error returned if any: ".mysql_error());
return true;
}
1
 Аватар для Ph_mx
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 38
30.10.2012, 21:17  [ТС]
спасибо большое за помощь!) возник еще вопрос- эта функция меняет e-mail в БД, но он используется в сессиях.. получается, что после смены мыла сессия недействительна, как усовершенствовать функцию, чтоб она обновляла емайл в сессии?
0
1178 / 1128 / 94
Регистрация: 31.05.2012
Сообщений: 3,060
30.10.2012, 21:26
а что мешает просто присвоить новый емаил?
PHP
1
$_SESSION['email'] = $_POST['email'];
А по поводу дыры в безопасности, передайте в новом email апостроф a'dmin@site.ru
и у вас будет ошибка.

И зачем по мылу выбирать юзера? Храните его ID в сессии, и выбирать при обновлении мыла не чего не нужно, сразу обновляйте. Поиск по ID типа INT гораздо быстрее чем поиск по varchar.
1
 Аватар для Ph_mx
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 38
30.10.2012, 22:08  [ТС]
спасибо за совет, теперь озадачился, как модифицировать сессии возникают ряд вопросов,
пример функция авторизации
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
if(isset($_POST["submit"])) {
  field_validator("email", $_POST["email"], "email", 4, 30);
  field_validator("пароль", $_POST["password"], "string", 7, 15);
  if($messages){
    doIndex();
    exit;
  }
 
    if( !($row = checkPass($_POST["email"], $_POST["password"])) ) {
        $messages[]="Неправильный e-mail или пароль";
    }
 
  if($messages){
    doIndex();
    exit;
  }
 
  cleanMemberSession($row["email"], $row["password"]);
 
  header("Location: main.php");
} else {
  doIndex();
}
вопрос встает в 18 строчке-как мне правильнее получить id пользователя, чтоб отправить его в cleanMemberSession?
и соответственно пример из регистрации
PHP
1
2
3
4
5
6
7
if(empty($messages)) {
    newUser($_POST["email"], $_POST["password"], $_POST["name"], $_POST["surname"],$_POST["sity"],$_POST["prof"]);
    cleanMemberSession($_POST["email"], $_POST["password"]);
 
    header("Location: main.php");
 
  }
3 третья строчка: функция cleanMemberSession получает переменные из форм, помогите пожалуйста, как получить сначала id из базы, а потом уже его использовать в сессии? заранее спасибо)
0
1178 / 1128 / 94
Регистрация: 31.05.2012
Сообщений: 3,060
30.10.2012, 22:40
ну наверное так
PHP
1
cleanMemberSession($row["id"], $row["email"], $row["password"]);
Ну и соответсвенно переписать функцию
PHP
1
2
3
4
5
6
function cleanMemberSession($id, $login, $password) {
  $_SESSION["id"]=$id;
  $_SESSION["email"]=$email;
  $_SESSION["password"]=$password;
  $_SESSION["loggedIn"]=true;
}
а две последних переменных сессии вообще ен нужны.
паролль зачем вам в сессии?
а проверку на то авторизован ли эзер можно так сделать

PHP
1
2
3
4
5
6
7
8
9
function cleanMemberSession($id, $login) {
  $_SESSION["id"]=$id;
  $_SESSION["email"]=$email;
} 
 
finction is_logged()
{
    return !empty($_SESSION["id"]);
}
Добавлено через 2 минуты
а функция newUser путсь возвращает ID из базы как раз.
вы же наверное вставляете запись с помощью INSERT? тогда просто в конце так
PHP
1
2
3
4
5
function newUser (...)
{
    ...
    return mysql_insert_id();
}
тогда остаётся так
PHP
1
2
3
4
5
6
7
if(empty($messages)) {
    $id = newUser($_POST["email"], $_POST["password"], $_POST["name"], $_POST["surname"],$_POST["sity"],$_POST["prof"]);
    cleanMemberSession($id, $_POST["email"]);
 
    header("Location: main.php");
 
  }
1
 Аватар для Ph_mx
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 38
31.10.2012, 02:04  [ТС]
Лажа какая то выходит, не могу понять в чем проблема- после регистрации данные из базы выводит, а после авторизации нет

Добавлено через 29 минут
о, все решил)

Добавлено через 1 час 8 минут
ан нет, не решил) как бы усовершенствовать проверку авторизации, что б выкидывало на главную страницу, с тех страниц, где нужно быть зарегистрированным
до этого я использовал функцию
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function checkLoggedIn($status){
  switch($status){
    case "yes":
      if(!isset($_SESSION["loggedIn"])){
        header("Location: login.php");
        exit;
      }
      break;
    case "no":
      if(isset($_SESSION["loggedIn"]) && $_SESSION["loggedIn"] === true ){
        header("Location: members.php");
      }
      break;
  }
  return true;
}
теперь я использую эту, но он не выкидывает
0
1178 / 1128 / 94
Регистрация: 31.05.2012
Сообщений: 3,060
31.10.2012, 02:10
Я ж писал сделайте функцию
PHP
1
2
3
4
finction is_logged()
{
    return !empty($_SESSION["id"]);
}
и проверяйте
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function checkLoggedIn($status){
  switch($status){
    case "yes":
      if(!is_logged()){
        header("Location: login.php");
        exit;
      }
      break;
    case "no":
      if(is_logged()){
        header("Location: members.php");
      }
      break;
  }
  return true;
}
ну или прям там просто поменяйте перееннуюю по которой проверяете
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function checkLoggedIn($status){
  switch($status){
    case "yes":
      if(!isset($_SESSION["id"])){
        header("Location: login.php");
        exit;
      }
      break;
    case "no":
      if(isset($_SESSION["id"]) && $_SESSION["id"] === true ){
        header("Location: members.php");
      }
      break;
  }
  return true;
}
Вот только ещё такой момент, после отправки заголовка о переадреации, нет смысла дальше как правило работать скрипту, по этому добавляйте exit или die сразу после отправки header
1
 Аватар для Ph_mx
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 38
31.10.2012, 16:18  [ТС]
СПАСИБО нечеловеческое))!!!

Добавлено через 12 часов 41 минуту
Друзья,спасибо огромное всем за помощь!
к сожалению, снова озадачу вас вопросами. Зешил разбить страницу на несколько кусков таким методом
PHP
1
2
3
4
5
6
7
8
9
10
11
<?php
    if ($set == 'yes'){
    include 'profile_set.php';
 exit ;
}
   
if ( $ava == 'yes' ){
    include 'profile_ava.php';
 exit ;
}
?>
этот код находится в том месте, где должны отображаться данные
выше находятся ссылки
HTML5
1
2
3
4
5
<ul>
    <li><a href="profile.php?set=yes">данные</a></li>
    <li><a href="profile.php?ava=yes">аватарка</a></li>
         
    </ul>
первая ссылка должна подключит файл profile_set.php
он выглядит примерно так
PHP
1
2
3
4
5
6
7
8
9
10
<form action="<?php print $_SERVER["PHP_SELF"]; ?>" method="POST">
 
<table>
<tr><td>Изменить e-mail:</td><td><input type="text" name="email" class="input" value="<?php print $umail["email"];?>" maxlength="30" ></td></tr>
<tr><td></td><td><input name="submitEmail"  type="submit" value="Изменить e-mail"></td></tr>
<tr><td>Пароль:</td><td><input type="password" name="password" class="input" value="" maxlength="30"></td></tr>
<tr><td>Повторить пароль:&nbsp; &nbsp;</td><td><input type="password" name="password2" class="input" value="" maxlength="30" ></td></tr>
<tr><td></td><td><input name="submitPass"   type="submit" value="Изменить пароль"></td></tr>
</table>
</form>
но файл не подключается, в чем может быть проблема?
0
1178 / 1128 / 94
Регистрация: 31.05.2012
Сообщений: 3,060
31.10.2012, 18:35
PHP
1
$set = isset($_GET['set']) ? $_GET['set'] : '';
1
 Аватар для Ph_mx
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 38
31.10.2012, 19:04  [ТС]
спасибо)! все заработало
0
 Аватар для Ph_mx
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 38
03.11.2012, 08:37  [ТС]
Еще раз всем привет) возникают постоянно вопросы и,уж простите пожалуйста, начинаю доставать вас)
на этот раз возникла проблема с массивами и БД)
суть проблемы: вот этим простим скриптом я вывожу всех пользователей "сайта"
peoples.php
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
 
 $result = mysql_query("SELECT id, name, surname, avatar FROM users ORDER BY id ",$link); 
            $myrow = mysql_fetch_array($result);
        
        
            do
            {?>
            </br><table>
            <tr><?php
            
            printf("<td width=80px height=80px ><img alt='аватар' width='80px' height='80px' src='/avatars/%s'></td><td width=150px></td><td ><a href='member.php?id=%s'>%s %s</a></td></tr>",$myrow['avatar'],$myrow['id'],$myrow['name'],$myrow['surname']);
            ?></table><?php}
            while($myrow = mysql_fetch_array($result));
 ?>
как мне отобразить уже на странице member.php?id= всю информацию(типа личной страницы) о пользователе? точнее, как отобразить то - понятно, а вот как отобразить страницу именно того, кого нажали в списке- не понятно.это, мол, две разные страницы и т.п.
буду сердечно признателен за помощь) и если не сложно, помогите присобачить к этому коду постраничную навигацию) по 10 записей на страницу, к примеру)

Добавлено через 1 час 8 минут
вроде насчет отображения страницы разобрался
PHP
1
2
3
if (isset($_GET['id'])) {
 $member_id = $_GET['id'];
 }
а вот насчет постраничной навигации что то очень тупо происходит
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.11.2012, 08:37
Помогаю со студенческими работами здесь

на структуры. Как определить сдавших сессию на 4 и 5 по ФИО и оценки по 4 предметам за последнюю сессию?
:scratch:

Вывод информации в texBox2 и texBox3 на основании информации texBox1
Ребята, начанающему чайнику требуется помощь в написании проги. Прога пишется под тач скрин монитор, ввод информации через монитор. ...

Ввод информации и вывод информации на экране
Используйте две переменные типа float, предложите пользователю ввести два числа и выведите на экран четыре строчки (сумма, разность,...

Вывод информации из БД при входе на сайт и вывод одного последнего добавленного блока
Здравствуйте! Немного столкнулся с проблемой: Есть небольшой сайт, пробный, есть задание: 1. Запрограммировать форму для отправки...

Передача информации, используя ключи
Два процесса обмениваются информацией через файлы. Нужно как-то согласовать её однозначное прочтение, для чего решил использовать ключи...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru