|
|
|
| Из базы в цикле выбираются названия+описания книг. Весь список выводится на страницу.
Внутри цикла есть ссылка на скачивание книги.
Я хочу запомнить id книги в сессии и на следующей странице его использовать, чтобы знать,
какую книгу скачать. Проблема в том, что в сессию сохраняются все id`ы книг.
$arr[] = $row['id'];
$_SESSION = $arr;
print_r($_SESSION);
echo '<a href="common_files/upload2.php">Завантажити уривки з книги"' . $row['title'] .
'"</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
Может, это можн как-то реализовать по-другому? | |
|
|
|
|
|
|
|
для: Лена
(01.04.2010 в 16:13)
| | $_SESSION['id'] = $row['id'];
WHERE id = " . $_SESSION['id']; | |
|
|
|
|
|
|
|
для: GeorgeIV
(01.04.2010 в 17:05)
| | Так уже пробовала. Во второй файл приходит одно и то же значение, т.е. $_SESSION['id'] = какое-то число - вне зависимости от того, какую книгу выбрала для скачивания. | |
|
|
|
|
|
|
|
для: Лена
(01.04.2010 в 17:41)
| | На странице А вы в сессию записываете номер (или это массив номеров?), а на странице В получаете этот номер из сессии:
1. каким образом у вас может что-то измениться на странице В, пока вы опять не обратитесь к странице А (если только там и произойдут изменения какие либо), либо явно не измените значение переменной, например, на странице В?
2. какая вообще ставится задача? | |
|
|
|
|
|
|
|
для: 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">Завантажити уривки з книги"' .
$row['title'] . '"</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'];
//дальше пошла скачка книги
?>
|
У меня появилась идея такая: нажимаем на ссылку - заходим на страницу отдельной книги и там уже идет скачивание. Так хуже, но как-то же надо сделать... | |
|
|
|
|
|
|
|
для: Лена
(01.04.2010 в 23:14)
| | И каким образом можно сослаться на переменную в сессии, если в ссылке не передается ничего?
И в сессии уж создайте переменную, которую и заполняйте в цикле, например:
$_SESSION['ids'] = array();
а то у вас все безликое получается.
P.S. Кстати:
$_SESSION = $arr;
//print_r($_SESSION);
а вы в сам файл сессии заглядывали хотя бы? | |
|
|
|
|
|
|
|
для: 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">Завантажити уривки з книги"' . $row['title'] . '"</a>'; }
На этой странице у меня в сессии то, что нужно.
На другой - последний элемент массива., который тянется из базы.
>а вы в сам файл сессии заглядывали хотя бы?
В файл сессии заглядываю после каждого изменения. | |
|
|
|
|
|
|
|
для: Лена
(02.04.2010 в 11:50)
| | Вот сомневаюсь, что вы заглядывали. Если как у вас:
$a = array(1,2,3);
$_SESSION = $a;
то файл сессии будет пуст, вы просто перназначили перменнную на одной странице, а на другой сессия стартуется заново.
Бог с ней с сессией. Допустим, у вас там массив, а на страницу вы выводите список ссылок, так ведь? И каким образом тогда понять какой ссылке что получать, если все ссылки одинаковы?
Даже если у вас и одна ссылка на странице, что из этого массива нужно будет взять при переходе по ней? | |
|
|
|
|
|
|
|
для: sim5
(02.04.2010 в 12:09)
| | >И каким образом тогда понять какой ссылке что получать, если все ссылки одинаковы?
У меня каждая ссылка со своим id, у меня задача выцепить этот id и передать его на другую страницу. Но. Я же не передаю одно id, я передаю массив, из которого надо выбрать нужное мне id. | |
|
|
|
|
|
|
|
для: Лена
(02.04.2010 в 12:19)
| | Наверное моим очкам большая диоптрия нужна:
echo '<a href="common_files/upload2.php">Завантажити уривки з книги"' . $row['title'] . '"</a>';
Где в ссылках id?
P.S. Вообще зачем весь этот сыр бор, если в ссылках можно явно указать id? Если цель скрыть начто, то за этими id в массиве что-то должно числиться. Ничего не понятно... | |
|
|
|
|
|
|
|
для: sim5
(02.04.2010 в 12:26)
| | id должно передаваться через сессию.Потому что это два разных скрипта.
Поэтому и явно указать id в common_files/upload2.php я не могу. | |
|
|
|
|
|
|
|
для: Лена
(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, указывайте, например, индексы массива в сессии в параметрах запроса, а волшебства не бывает. | |
|
|
|
|
|
|
|
для: sim5
(02.04.2010 в 13:55)
| | >и что чему принадлежит?
Вот это я и хочу узнать. Как можно из приходящего массива выбрать только одно значение. Ну сохраню я индексы массива в сессии, а дальше как? Другой скрипт получил этот массив с сессиями и как из него выбрать то, что нужно?
Получается нереальная задача.
Проще сделать переход на отдельную страницу книги и потом уже там давать ссылку на скачивание. | |
|
|
|
|
|
|
|
для: Лена
(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;
Либо я просто не понимаю чего вы хотите. | |
|
|
|
|
|
|
|
для: 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'] . '">Завантажити уривки з книги"' . $row['title'] . '"</a>';
}
Индекс первого элемента в массиве сессии должен быть 1. А у меня 0, потому как цикл, который выводит из базы, идет с нуля. Как сделать, чтобы первый элемент в массиве сессий шел с 1? | |
|
|
|
|
|
|
|
для: Лена
(02.04.2010 в 16:55)
| | $_SESSION['ids'] = array() нужно объявлять вне цикла.
$arr[] = $row['id'] и $_SESSION['ids'] = $arr - вообще не нужно.
в цикле:
$_SESSION['ids'][$i+1] = $row['id'];
Еще раз вопрос - зачем этот промежуточный массив в сессии, почему нельзя указать id как параметры в ссылках? | |
|
|
|
|
|
|
|
для: Лена
(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">Завантажити уривки з книги"' .
$row['title'] . '"</a>';
}
}
|
У вас в каждой итерации заново создается массив, в него записывается новое значение, т.е. у вас всегда будет в сессии массив из одного последнего элемента.
И все равно непонятно, где задается ID выбранной книги? | |
|
|
|
|
|
|
|
для: GeorgeIV
(02.04.2010 в 10:05)
| | id книги тянется из базы.
Как мне сделать так, чтобы в сессии не последний элемент сохранялся, а текущий? | |
|
|
|
|
|
|
|
для: Лена
(01.04.2010 в 17:41)
| | А где вы задаете ID выбранной книги? | |
|
|
|
|
|
|
|
для: Лена
(01.04.2010 в 16:13)
| | >Я хочу запомнить id книги в сессии и на следующей странице его использовать, чтобы знать,
Это плохая идея.
Разве только есть существенные факторы, которые препятствуют возможности передачи ключевой информации о книге в самом запросе.
Плохая, например (но необязательно ограничиваясь) тем, что может быть несколько процессов, параллельно заполняющих эту самую SESSION-переменную. И затирающих один другого. | |
|
|
|
|
|
|
|
для: Trianon
(02.04.2010 в 18:01)
| | Идея плохая, согласна.
Объясняю и вам, и sim5, почему так делаю.
У меня есть файл index.php. В нем и идет блок ссылок на скачивание книг, ид`ы которых берутся из базы. Допустим, я передаю ид в ссылке: <a href='index.php?upl=$row['id']'></a>
И потом проверяю по условию: пришел гет-параметр, я даю книжку на скачивание.
Но. Чтобы отдать книгу, надо послать соответствующие заголовки. И у меня тут такая ситуация... У меня там выше уже есть вывод html и убрать его я никак не могу. Получается заголовки тогда у меня не отправляются. Значит, нужно делать переход на другой скрипт, который и даст возможность безболезненно отправлять эти заголовки.
Ерунда, конечно, получилась, согласна, но по-другому никак. И кстати до сих пор пока еще идея эта не сработала.
>Плохая, например (но необязательно ограничиваясь) тем, что может быть несколько процессов, параллельно заполняющих эту самую SESSION-переменную. И затирающих один другого.
Как могут быть параллельные запросы, если информация из базы выбирается последовательно и последовательно заполняется массив SESSION? | |
|
|
|
|
|
|
|
для: Лена
(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 только отдает книжку либо выводит предупреждение, что книжки не существует.
Такая схема не устраивает? И сессии ни к чему.. | |
|
|
|
|
|
|
|
для: neadekvat
(02.04.2010 в 23:37)
| | Я сначала так тоже думала делать. Но.
Мне, например, как пользователю неудобно сначала кликать по одной ссылке, потом по другой и только потом получать книгу. Удобней ведь кликнул один раз - и уже получил книгу. | |
|
|
|
|
|
|
|
для: Лена
(02.04.2010 в 23:43)
| | Сделайте переадресацию, что-то вроде
"Скачивание файла начнется сиеминутно, если не началась - нажмите на ссылку" и редирект на скрипт, отдающий файл.
Если же и эту страницу надо упустить, тогда, пардон, о каком html-коде мы говорим, который вам там заголовок мешает послать? | |
|
|
|
|
|
|
|
для: Лена
(02.04.2010 в 23:23)
| | А что нельзя поместить в индексный файл до любого вывода блок:
if($_GET['upl']) отдаем exit ?
Да и у вас, выше, обращение идет к другому скрипту. Что-то не так, похоже на то, будто вы пытаетесь получить 4 таким образом:
4 = 6-2+2-2, где явно есть лишние операции. Если через сессию удается, почему не должно работать напрямую?
upload - это загрузка на сервер, имя "девочке" неудачное выбрано ;-) | |
|
|
|