Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: _SESSION
 
 автор: Лена   (01.04.2010 в 16:13)   письмо автору
 
 

Из базы в цикле выбираются названия+описания книг. Весь список выводится на страницу.
Внутри цикла есть ссылка на скачивание книги.
Я хочу запомнить id книги в сессии и на следующей странице его использовать, чтобы знать,

какую книгу скачать. Проблема в том, что в сессию сохраняются все id`ы книг.
$arr[] = $row['id'];
$_SESSION = $arr;
print_r($_SESSION);
echo '<a href="common_files/upload2.php">Завантажити уривки з книги&quot;' . $row['title'] . 

'&quot;</a>';


файл common_files/upload2.php выглядит так:

session_start();
include('dbopen.php');
print_r($_SESSION);
$q = "SELECT * FROM books
//вот здесь нужно из сессии вытянуть нужный id, как это сделать?
WHERE id = " . $_SESSION;
//и дальше мы эту книгу отдаем на скачивание

В файле common_files/upload2.php $_SESSION приходит пустой.

И появляются ошибки вида:
[01-Apr-2010 15:08:04] PHP Notice: Unknown: Skipping numeric key 0. in Unknown on line

0[01-Apr-2010 15:08:04] PHP Notice: Unknown: Skipping numeric key 1. in Unknown on line

0[01-Apr-2010 15:08:04] PHP Notice: Unknown: Skipping numeric key 2. in Unknown on line 0

Может, это можн как-то реализовать по-другому?

  Ответить  
 
 автор: GeorgeIV   (01.04.2010 в 17:05)   письмо автору
 
   для: Лена   (01.04.2010 в 16:13)
 

$_SESSION['id'] = $row['id'];

WHERE id = " . $_SESSION['id'];

  Ответить  
 
 автор: Лена   (01.04.2010 в 17:41)   письмо автору
 
   для: GeorgeIV   (01.04.2010 в 17:05)
 

Так уже пробовала. Во второй файл приходит одно и то же значение, т.е. $_SESSION['id'] = какое-то число - вне зависимости от того, какую книгу выбрала для скачивания.

  Ответить  
 
 автор: sim5   (01.04.2010 в 17:50)   письмо автору
 
   для: Лена   (01.04.2010 в 17:41)
 

На странице А вы в сессию записываете номер (или это массив номеров?), а на странице В получаете этот номер из сессии:
1. каким образом у вас может что-то измениться на странице В, пока вы опять не обратитесь к странице А (если только там и произойдут изменения какие либо), либо явно не измените значение переменной, например, на странице В?
2. какая вообще ставится задача?

  Ответить  
 
 автор: Лена   (01.04.2010 в 23:14)   письмо автору
 
   для: sim5   (01.04.2010 в 17:50)
 

>2. какая вообще ставится задача?
Задача ставится такая.
Файл первый. В нем в цикле выводятся ссылки на скачивание книг.

<?php
session_start
();

//здесь идет запрос

for($i=0;$row mysql_fetch_assoc($res);$i++){
    if(
$row['archiver']!=''){
         
$arr = array();
           
$arr[] = $row['id'];
           
$_SESSION $arr;
           
//print_r($_SESSION);
    
echo '<a href="common_files/upload2.php">Завантажити уривки з книги&quot;' 

$row['title'] . '&quot;</a>';     
    }
}
?>



Файл второй.
Здесь идет скачка книги, какую выбрал пользователь.

<?php
session_start
();
include(
'dbopen.php');
//вот это выбирается нужная книга
$q "SELECT * FROM books
WHERE id = " 
//вот здесь надо сослаться на переменную сессии
$res mysql_query($q);
if(!
$res) exit(mysql_error());
$row mysql_fetch_assoc($res);
$filename '../' $row['archiver'];
//дальше пошла скачка книги
?>


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

  Ответить  
 
 автор: sim5   (02.04.2010 в 03:43)   письмо автору
 
   для: Лена   (01.04.2010 в 23:14)
 

И каким образом можно сослаться на переменную в сессии, если в ссылке не передается ничего?
И в сессии уж создайте переменную, которую и заполняйте в цикле, например:
$_SESSION['ids'] = array();
а то у вас все безликое получается.

P.S. Кстати:
$_SESSION = $arr;
//print_r($_SESSION);
а вы в сам файл сессии заглядывали хотя бы?

  Ответить  
 
 автор: Лена   (02.04.2010 в 11:50)   письмо автору
 
   для: sim5   (02.04.2010 в 03:43)
 

if($row['archiver']!=''){
$_SESSION['ids'] = array();
$_SESSION['ids'] = $row['id'];
print_r($_SESSION['ids']);
echo '<a href="common_files/upload2.php">Завантажити уривки з книги&quot;' . $row['title'] . '&quot;</a>'; }

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

>а вы в сам файл сессии заглядывали хотя бы?
В файл сессии заглядываю после каждого изменения.

  Ответить  
 
 автор: sim5   (02.04.2010 в 12:09)   письмо автору
 
   для: Лена   (02.04.2010 в 11:50)
 

Вот сомневаюсь, что вы заглядывали. Если как у вас:
$a = array(1,2,3);
$_SESSION = $a;
то файл сессии будет пуст, вы просто перназначили перменнную на одной странице, а на другой сессия стартуется заново.

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

  Ответить  
 
 автор: Лена   (02.04.2010 в 12:19)   письмо автору
 
   для: sim5   (02.04.2010 в 12:09)
 

>И каким образом тогда понять какой ссылке что получать, если все ссылки одинаковы?

У меня каждая ссылка со своим id, у меня задача выцепить этот id и передать его на другую страницу. Но. Я же не передаю одно id, я передаю массив, из которого надо выбрать нужное мне id.

  Ответить  
 
 автор: sim5   (02.04.2010 в 12:26)   письмо автору
 
   для: Лена   (02.04.2010 в 12:19)
 

Наверное моим очкам большая диоптрия нужна:
echo '<a href="common_files/upload2.php">Завантажити уривки з книги&quot;' . $row['title'] . '&quot;</a>';
Где в ссылках id?

P.S. Вообще зачем весь этот сыр бор, если в ссылках можно явно указать id? Если цель скрыть начто, то за этими id в массиве что-то должно числиться. Ничего не понятно...

  Ответить  
 
 автор: Лена   (02.04.2010 в 13:47)   письмо автору
 
   для: sim5   (02.04.2010 в 12:26)
 

id должно передаваться через сессию.Потому что это два разных скрипта.
Поэтому и явно указать id в common_files/upload2.php я не могу.

  Ответить  
 
 автор: sim5   (02.04.2010 в 13:55)   письмо автору
 
   для: Лена   (02.04.2010 в 13:47)
 

Да в сессию можно что угодно положить, вопрос не в этом. Как можно узнать, что "безликая" ссылка интересуются, например, элементом массива с индексом равным 8? Ладно бы в сессии одно значение, и одна ссылка не него, а то:
$a[0] = 1;
$a[1] = 3;
$a[3] = 5;
и
href=common_files/upload2.php
href=common_files/upload2.php
href=common_files/upload2.php

и что чему принадлежит?
Хотите скрыть id, указывайте, например, индексы массива в сессии в параметрах запроса, а волшебства не бывает.

  Ответить  
 
 автор: Лена   (02.04.2010 в 15:29)   письмо автору
 
   для: sim5   (02.04.2010 в 13:55)
 

>и что чему принадлежит?

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

  Ответить  
 
 автор: sim5   (02.04.2010 в 15:48)   письмо автору
 
   для: Лена   (02.04.2010 в 15:29)
 

Если к вам обратятся - "Подайте, пожалуйста", то сможете ли вы даже при наличии "волшебного" слова понять, что вас просят подать? Ведь нет. Тогда почему вы считаете, что по запросу common_files/upload2.php можно догадаться чего запрашивают?

>Как можно из приходящего массива выбрать только одно значение.

Массив ни из чего и ни куда у вас не приходит, вы его формируете в сесси на предыдущей странице. Хотите вы скрыть id, пожалуйста, формируйте массив так, чтобы он имел вид, например:

$_SESSION['ids'] = array(1=>125, 234, 187);

а в ссылках указываете индекс элемента нужного вам id:

common_files/upload2.php?i=1
common_files/upload2.php?i=2
common_files/upload2.php?i=3

Получаете:

$gid = isset($_GET['i']) ? (int)$_GET['i'] : 0;
$id = $_SESSION['ids'][$gid] ? $_SESSION['ids'][$gid] : 0;
echo $id;

Либо я просто не понимаю чего вы хотите.

  Ответить  
 
 автор: Лена   (02.04.2010 в 16:55)   письмо автору
 
   для: sim5   (02.04.2010 в 15:48)
 

Все правильно вы понимаете.
Пока не получилось.
Сделала:
for($i=0;$row = mysql_fetch_assoc($res);$i++){
//другой код
$_SESSION['ids'] = array();
$arr[] = $row['id'];
$_SESSION['ids'] = $arr;
//$_SESSION['ids'] = array(1=>125, 234, 187);
echo '<a href="common_files/upload2.php?up=' . $row['id'] . '">Завантажити уривки з книги&quot;' . $row['title'] . '&quot;</a>';
}

Индекс первого элемента в массиве сессии должен быть 1. А у меня 0, потому как цикл, который выводит из базы, идет с нуля. Как сделать, чтобы первый элемент в массиве сессий шел с 1?

  Ответить  
 
 автор: sim5   (02.04.2010 в 17:19)   письмо автору
 
   для: Лена   (02.04.2010 в 16:55)
 

$_SESSION['ids'] = array() нужно объявлять вне цикла.
$arr[] = $row['id'] и $_SESSION['ids'] = $arr - вообще не нужно.
в цикле:
$_SESSION['ids'][$i+1] = $row['id'];

Еще раз вопрос - зачем этот промежуточный массив в сессии, почему нельзя указать id как параметры в ссылках?

  Ответить  
 
 автор: GeorgeIV   (02.04.2010 в 10:05)   письмо автору
 
   для: Лена   (01.04.2010 в 23:14)
 

for($i=0;$row = mysql_fetch_assoc($res);$i++){ 
    if($row['archiver']!=''){ 
         $arr = array(); 
           $arr[] = $row['id']; 
           $_SESSION = $arr; 
           //print_r($_SESSION); 
    echo '<a href="common_files/upload2.php">Завантажити уривки з книги&quot;' .  

$row['title'] . '&quot;</a>';      
    } 

У вас в каждой итерации заново создается массив, в него записывается новое значение, т.е. у вас всегда будет в сессии массив из одного последнего элемента.
И все равно непонятно, где задается ID выбранной книги?

  Ответить  
 
 автор: Лена   (02.04.2010 в 11:48)   письмо автору
 
   для: GeorgeIV   (02.04.2010 в 10:05)
 

id книги тянется из базы.
Как мне сделать так, чтобы в сессии не последний элемент сохранялся, а текущий?

  Ответить  
 
 автор: GeorgeIV   (01.04.2010 в 18:07)   письмо автору
 
   для: Лена   (01.04.2010 в 17:41)
 

А где вы задаете ID выбранной книги?

  Ответить  
 
 автор: Trianon   (02.04.2010 в 18:01)   письмо автору
 
   для: Лена   (01.04.2010 в 16:13)
 

>Я хочу запомнить id книги в сессии и на следующей странице его использовать, чтобы знать,

Это плохая идея.
Разве только есть существенные факторы, которые препятствуют возможности передачи ключевой информации о книге в самом запросе.

Плохая, например (но необязательно ограничиваясь) тем, что может быть несколько процессов, параллельно заполняющих эту самую SESSION-переменную. И затирающих один другого.

  Ответить  
 
 автор: Лена   (02.04.2010 в 23:23)   письмо автору
 
   для: Trianon   (02.04.2010 в 18:01)
 

Идея плохая, согласна.
Объясняю и вам, и sim5, почему так делаю.
У меня есть файл index.php. В нем и идет блок ссылок на скачивание книг, ид`ы которых берутся из базы. Допустим, я передаю ид в ссылке: <a href='index.php?upl=$row['id']'></a>
И потом проверяю по условию: пришел гет-параметр, я даю книжку на скачивание.
Но. Чтобы отдать книгу, надо послать соответствующие заголовки. И у меня тут такая ситуация... У меня там выше уже есть вывод html и убрать его я никак не могу. Получается заголовки тогда у меня не отправляются. Значит, нужно делать переход на другой скрипт, который и даст возможность безболезненно отправлять эти заголовки.
Ерунда, конечно, получилась, согласна, но по-другому никак. И кстати до сих пор пока еще идея эта не сработала.

>Плохая, например (но необязательно ограничиваясь) тем, что может быть несколько процессов, параллельно заполняющих эту самую SESSION-переменную. И затирающих один другого.

Как могут быть параллельные запросы, если информация из базы выбирается последовательно и последовательно заполняется массив SESSION?

  Ответить  
 
 автор: neadekvat   (02.04.2010 в 23:37)   письмо автору
 
   для: Лена   (02.04.2010 в 23:23)
 

Первая страница (index.php)
<a href="book.php?id=$id">Some Book</a>
<a href="book.php?id=$id">Some Book</a>
<a href="book.php?id=$id">Some Book</a>

Вторая страница (book.php)
<?php
$id 
intval($_GET['id']);
// запросы
?>
Чтобы скачать эту книгу, нажмите на ссылку ниже:
<a href="download.php?id=$id">Скачать</a>


И уже download.php только отдает книжку либо выводит предупреждение, что книжки не существует.
Такая схема не устраивает? И сессии ни к чему..

  Ответить  
 
 автор: Лена   (02.04.2010 в 23:43)   письмо автору
 
   для: neadekvat   (02.04.2010 в 23:37)
 

Я сначала так тоже думала делать. Но.
Мне, например, как пользователю неудобно сначала кликать по одной ссылке, потом по другой и только потом получать книгу. Удобней ведь кликнул один раз - и уже получил книгу.

  Ответить  
 
 автор: neadekvat   (02.04.2010 в 23:47)   письмо автору
 
   для: Лена   (02.04.2010 в 23:43)
 

Сделайте переадресацию, что-то вроде
"Скачивание файла начнется сиеминутно, если не началась - нажмите на ссылку" и редирект на скрипт, отдающий файл.
Если же и эту страницу надо упустить, тогда, пардон, о каком html-коде мы говорим, который вам там заголовок мешает послать?

  Ответить  
 
 автор: sim5   (03.04.2010 в 07:53)   письмо автору
 
   для: Лена   (02.04.2010 в 23:23)
 

А что нельзя поместить в индексный файл до любого вывода блок:
if($_GET['upl']) отдаем exit ?
Да и у вас, выше, обращение идет к другому скрипту. Что-то не так, похоже на то, будто вы пытаетесь получить 4 таким образом:
4 = 6-2+2-2, где явно есть лишние операции. Если через сессию удается, почему не должно работать напрямую?
upload - это загрузка на сервер, имя "девочке" неудачное выбрано ;-)

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования