За последние 24 часа нас посетили 19546 программистов и 1604 робота. Сейчас ищут 993 программиста ...

Выборка из базы в зависимости от значений сессии

Тема в разделе "PHP для новичков", создана пользователем Olga-Li, 18 июл 2014.

  1. Olga-Li

    Olga-Li Новичок

    С нами с:
    26 сен 2013
    Сообщения:
    65
    Симпатии:
    0
    Помогите правильно сделать выборку.

    При загрузке файлов на сервер название ВСЕХ файлов сохраняются в БД(Mysgl) в поле' name',а так же название этих файлов сохраняются в сессию. Как правильно сделать выборку из базы,где значения поля 'name' совпадает со ВСЕМИ значениями в сессии.
    Дело в том,что в сессию например сохранено название трех файлов,у меня получается выбрать одно значение из 'name',которое было сохранено в сессию последним. А должно выбраться 3 значения.
    Выборка: $get_coords = mysqli_query($link, "SELECT * FROM cms_dnevnik WHERE name ='$value'");

    $value- это значение сессии
     
  2. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    IN()

    позвольте полюбопытствовать, а зачем писать и в сессию и в базу? А потом ещё и доставать из базы, основываясь на сессии?
     
  3. Olga-Li

    Olga-Li Новичок

    С нами с:
    26 сен 2013
    Сообщения:
    65
    Симпатии:
    0
    Затем ,когда картинки загружаются они выводятся из базы на страницу,когда страница закрывается сессия удаляется и при повторном просмотре страницы картинки не выводятся. Иначе картинки выводятся. Это одна из причин.

    Добавлено спустя 2 минуты 38 секунд:
    Можно конкретный пример с IN(); ?
    Я уже несколько вариантов пробовала.
     
  4. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    хм, если картинки загрузились только что и информация о них хранится в сессии, то что мешает вообще не дёргать базу для вывода?
    Если всё равно использовать связку сессия - база, то лучше хранить id записей в БД, а не имя. Хотя бы индекс будет использоваться.
    А при повторном посещении эти картинки уже не показываются?
     
  5. Olga-Li

    Olga-Li Новичок

    С нами с:
    26 сен 2013
    Сообщения:
    65
    Симпатии:
    0
    Потому что на одной странице,когда картинки загружаются они выводятся один раз,поэтому нужна сессия.
    А на другой странице они выводятся в любом случаи.

    Добавлено спустя 1 минуту 10 секунд:
    Вообщем без сессии никак и ваш вариант тоже уже был применен на практике.Не вариант!
     
  6. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    сдаюсь.
    но подумайте над тем что я выше написал
     
  7. Olga-Li

    Olga-Li Новичок

    С нами с:
    26 сен 2013
    Сообщения:
    65
    Симпатии:
    0
    А как же пример с IN(); ?
     
  8. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
  9. Olga-Li

    Olga-Li Новичок

    С нами с:
    26 сен 2013
    Сообщения:
    65
    Симпатии:
    0
    Люди,помогите!
     
  10. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    С именами неудобно, Luge дело говорит :) С ID было бы проще. А так что-то вроде этого, наверное:

    Код (PHP):
    1. $names = array ();
    2. // вот почему со строками не удобно, их экранировать надо.
    3. foreach ($_SESSIONS["fnames"] as $fname) {
    4.     $names[] = sprintf("'%s'", mysqli_real_escape_string($fname));
    5. }
    6. // а если бы в массиве были id, написали бы только эту строку
    7. $get_coords = mysqli_query($link, sprintf("SELECT * FROM cms_dnevnik WHERE name  in (%s)", implode(",", $names)));
    8.  
    9.  
    10.  
    Код не пробовал, но по идее должно сработать
     
  11. Olga-Li

    Olga-Li Новичок

    С нами с:
    26 сен 2013
    Сообщения:
    65
    Симпатии:
    0
    К сожалению с id не получается.
    Сейчас попробую ваш вариант,отпишусь!

    Добавлено спустя 6 минут 1 секунду:
    Вот мой вариант.
    Код (Text):
    1.  
    2. //сохраняем название файлов в сессию
    3. session_start();
    4.    
    5. $nam[]=$nazvanie;// $nazvanie-это название файлов
    6.  
    7.  
    8.  $_SESSION['nazvanie'][ sizeof($_SESSION['nazvanie']) ] = $nam; // записываем все названия файлов в сессию.
    9.  
    10. //вытаскиваем значения из сессии
    11.  
    12. {php}
    13.  
    14. session_start();
    15.  
    16. foreach ($_SESSION['nazvanie'] as $v) {
    17.    
    18.     foreach($v as $value){
    19.        
    20.       echo '<h3>' . $value. '</h3>' ;
    21.         }
    22. }
    23.  
    24. {/php}
    25. //Делаем выборку
    26.  
    27. {php}
    28.  
    29.  $get_coords = mysqli_query($link, "SELECT * FROM cms_dnevnik WHERE name ='$value'");
    30.        
    31.        
    32.         while($row = mysqli_fetch_array($get_coords)) {
    33.             $id = $row['id'];
    34.             $name = $row['name'];
    35.             $x = $row['x_pos'];
    36.             $y = $row['y_pos'];
    37.             $width= $row['width'];
    38.             $height= $row['height'];
    39.            
    40.            
    41.             if($width==0 AND $height==0){
    42.            
    43. echo '<div id="element" style="left:'.$x.'px; top:'.$y.'px;"><img id="img"   src="/components/dnevnik/image/'.$name.'"/></div>'; // выводим изображения в браузер.
    44.  
    45.             }
    46.             else{
    47. echo '<div id="element" style="left:'.$x.'px; top:'.$y.'px;"><img id="img"  style=" width:'.$width.'px; height:'.$height.'px;"  src="/components/dnevnik/image/'.$name.'"/></div>';
    48.  
    49.  
    50.     }
    51.            
    52.     }  
    53.        
    54. {/php}
    Что исправить?

    Добавлено спустя 2 минуты 27 секунд:
    Значения которые сохраняются в массив.
    Код (Text):
    1. Array ( [0] => Array ( [0] => 494b5036330ed1cd4c3cf2cf2dbd0d75.jpg ) [1] => Array ( [0] => 2e42aa5cb7b4a527981055f129bc4018.jpg ) [2] => Array ( [0] => e3028192ec5d39db16282ad66d519a03.jpg ) )
    Добавлено спустя 56 секунд:
    Хотелось бы свой код доработать и найти ошибки.
     
  12. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    А вот это зачем? У вас в сессии чёрт знает что творится в результате. Мой код предполагает, что в сессии массив имён файлов, а не массив массивов имён файлов...
     
  13. Olga-Li

    Olga-Li Новичок

    С нами с:
    26 сен 2013
    Сообщения:
    65
    Симпатии:
    0
    Отвечу почему!
    Вариант
    Код (Text):
    1. $names = array ();
    В этом случаи в сессию загружается значения файла,который был загружен последний

    Добавлено спустя 36 минут 46 секунд:
    mkramer,спасибо!
    Код (Text):
    1. $names = array ();
    действительно косяк.
    Сейчас в массиве передается только название файлов. Но только в этом варианте
    Код (Text):
    1.   $_SESSION['nazvanie'][ sizeof($_SESSION['nazvanie']) ] = $nazvanie;
    Но с выводом пока не разобралась.
     
  14. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Смысл хранить в сессии? Опиши задачу нормально, что реализуешь?
     
  15. Olga-Li

    Olga-Li Новичок

    С нами с:
    26 сен 2013
    Сообщения:
    65
    Симпатии:
    0
    Сейчас попробую описать!

    Добавлено спустя 5 минут 21 секунду:
    Загружаем картинки на одной странице,они выводятся на эту же страницу сразу же как загрузили.
    При повторном просмотре страницы ранее загруженные картинки уже не выводятся на эту страницу.
    Но можно загрузить другие картинки,они так же выводятся на страницу.
    При повторном заходе на страницу ничего не выводится и т.д
    Т.е один раз загружаем картинки они появляются,когда закрываем страницу они больше не появляются.
    Понятно?

    Добавлено спустя 1 минуту 52 секунды:
    А если сессию не использовать,то при повторном заходе на страницу выводятся все картинки,которые были загружены ранее
     
  16. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    Так как это всё уже несколько тем тянется, то давай с начала и по всем пунктам.

    1. Какой код заливает файлы?
     
  17. Olga-Li

    Olga-Li Новичок

    С нами с:
    26 сен 2013
    Сообщения:
    65
    Симпатии:
    0
    Должны выводится те картинки ,кот. были загружены перед тем,как страница закроется.

    Добавлено спустя 1 минуту 59 секунд:
    ЩАС НАПИШУ!
     
  18. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Вы, как и многие, не представляете (или не до конца понимаете) как PHP работает. Страница закроется-откроется - это всё не то. Т.е. грубо говоря схема работы, если я вас понял, должна быть такая:

    1. Пользователь выбрал в форме файлы и отправил на сервер
    2. Скрипт принял эти файлы, записал куда надо, поместил имена файлов в базу. Вот в этом месте вполне он может
    3. записать в сессию ID только что загруженных картинок.
    4. После этого произошла переадресация на скрипт, выводящий форму. Он, обнаружив ID недавно загруженных картинок в сессии, вывел их в браузер и стёр из сессии
     
  19. Olga-Li

    Olga-Li Новичок

    С нами с:
    26 сен 2013
    Сообщения:
    65
    Симпатии:
    0
    С загрузкой проблем нет.
    Часть кода:
    //Описание кода.Если файл перемещен в папку 'image' сохраняем название файлов в сессию. $nazvanie- это название файлов,кот загружаются в сессию и в БД в поле 'name'. Если все прошло успешно делаем редирект на страницу zapolnit.php

    Код (Text):
    1. if(rename($_SERVER['DOCUMENT_ROOT']."/components/dnevnik/img/".$nazvanie,$_SERVER['DOCUMENT_ROOT']."/components/dnevnik/image/".$nazvanie)){ // если файл переместился из img в image
    2.  
    3.  
    4.  
    5.   require_once($_SERVER['DOCUMENT_ROOT']."/components/dnevnik/config.php");// подключаемся к БД
    6.  
    7.  
    8.  $sql = "INSERT INTO cms_dnevnik (name,x_pos, y_pos) VALUES('$nazvanie','$x_coord','$y_coord')";//  Записываем название файла,координаты загрженного файла в таблицу "cms_dnevnik"
    9.  
    10.  
    11.  
    12.     mysqli_query($link, $sql); //если все прошло успешно
    13.    
    14.    
    15.      echo '<p style="color:green">Файл удачно загружен!</p>';
    16.      
    17.     session_start(); // сессия
    18.    
    19.  $_SESSION['nazvanie'][ sizeof($_SESSION['nazvanie']) ] = $nazvanie; // записываем все названия файлов в сессию.
    20.    
    21.  
    22.  
    23.    
    24.     header("Location: http://hudeem.ru/dnevnik/zapolnit"); // делаем редирект обратно на форму загрузки.
    25.    
    26.  
    27. }
    Файл zapolnit.php
    Получаем значения сессии
    Код (Text):
    1. {php}
    2.  
    3. session_start();
    4.  
    5.  
    6. foreach ($_SESSION['nazvanie'] as $value) {
    7.    
    8.     echo '<h3>'.$value.'</h3>';
    9.    
    10. }
    11. {/php}
    Выборка
    Код (Text):
    1. {php}
    2.  
    3. $get_coords = mysqli_query($link, "SELECT * FROM cms_dnevnik WHERE name ='$value'"); // делаем выборку
    4.  
    5.        
    6.         while($row = mysqli_fetch_array($get_coords)) {
    7.             $id = $row['id'];
    8.             $name = $row['name'];
    9.             $x = $row['x_pos'];
    10.             $y = $row['y_pos'];
    11.             $width= $row['width'];
    12.             $height= $row['height'];
    13.            
    14.            
    15.             if($width==0 AND $height==0){
    16.            
    17. echo '<div id="element" style="left:'.$x.'px; top:'.$y.'px;"><img id="img"   src="/components/dnevnik/image/'.$name.'"/></div>';
    18.  
    19.             }
    20.             else{
    21. echo '<div id="element" style="left:'.$x.'px; top:'.$y.'px;"><img id="img"  style=" width:'.$width.'px; height:'.$height.'px;"  src="/components/dnevnik/image/'.$name.'"/></div>';
    22.  
    23.  
    24.     }
    25.            
    26.     }  
    27.        
    28. {/php}
     
  20. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    mkramer, поделюсь сслками на такой случай, чтоб не перепечатывать постоянно http://phpfaq.ru/na_tanke и http://phpfaq.ru/newbie
    p.s. ЛС глянь

    Добавлено спустя 3 минуты 33 секунды:
    Olga-Li, нет. Это ерунда. Для начала давай сделаем нормальную обработку файлов. Вот пример формы и обработчика http://php.ru/manual/features.file-upload.post-method.html
     
  21. Olga-Li

    Olga-Li Новичок

    С нами с:
    26 сен 2013
    Сообщения:
    65
    Симпатии:
    0
    1)Пользователь выбрал в форме файлы и отправил на сервер
    2)Скрипт принял эти файлы, записал куда надо, поместил имена файлов в базу.
    3)записать в сессию ID только что загруженных картинок.
    4)После этого произошла переадресация на скрипт, выводящий форму и вывод загруженных картинок.
    5)Когда закрывается страница,удаляется сессия.

    Добавлено спустя 2 минуты 4 секунды:
    Luge,спасибо за ссылки,завтра буду тщательно читать! Начну с http://phpfaq.ru/newbie
     
  22. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    да понял я, понял. Но давай всё же сделаем всё правильно, а не «у меня так работает»
     
  23. Olga-Li

    Olga-Li Новичок

    С нами с:
    26 сен 2013
    Сообщения:
    65
    Симпатии:
    0
    Давай!

    Добавлено спустя 1 минуту 18 секунд:
    Как id загруженной картинки сохранить в сессию? Такой вопрос будет правильнее?
     
  24. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
  25. Olga-Li

    Olga-Li Новичок

    С нами с:
    26 сен 2013
    Сообщения:
    65
    Симпатии:
    0
    Код (Text):
    1. move_uploaded_file($temp,"image/".$nazvanie);
    $temp-временная папка
    $nazvanie-название загруженного файла