|
|
|
| Здравствуйте! Вопрос состоит в следующем. На странице есть текст загадки и кнопки "вперёд и назад". Нужно по нажатии кнопки вперёд заменить текст загадки следующей загадкой. Базу данных я создал называется Zagadki, там 3 поля (ID, Vopros, Otvet). Я думаю можно к ID прибавлять или отнимать 1, а вот куда вставить этот код не пойму.
Вот сам запрос, который переходит на следующую загадку.
<?php
session_start();
$id_zag = 0;
function buttons()
{
$zag = $zag + 1;
include ('mysql.php');
// делаем запрос к БД
// и ищем берём 1-ю загадку
$query = "SELECT *
FROM `zagadki`
WHERE `id`=$zag
LIMIT 1";
$sql = mysql_query($query) or die(mysql_error());
// если есть
if (mysql_num_rows($sql) == 1)
{
// то мы ставим об этом метку в сессии
$row = mysql_fetch_assoc($sql);
$id_zag = $row['id'];
$zagadka = $row['vopros'];
$otvet = $row['otvet'];
print '<h3>Загадка ' . $id_zag . ' <br> ' . $zagadka . ' <br> ' . $otvet . '</h3>';
}
}
?>
|
А сама кнопка находится в другом файле. Выглядит так:
<a href="buttons_next.php"><img src="Imgs/vpered .png" width="119" height="58"
longdesc="buttons_next.php" /></a></td>
|
Естественно при переходе к этому файлу, там ничего нету. Подскажите, как правильно сделать. | |
|
|
|
|
|
|
|
для: Pegas31
(08.01.2010 в 17:30)
| | buttons_next.php?id=номер загадки. Почитайте о постраничной навигации.
А зачем LIMIT 1 в запросе? | |
|
|
|
|
|
|
|
для: sim5
(08.01.2010 в 17:46)
| | это не постраничная навигация, страница та же. Меняется только текст загадки, путём вызова из SQL таблицы. | |
|
|
|
|
|
|
|
для: Pegas31
(08.01.2010 в 19:37)
| | А чем принцип (механизм) постраничной навигации отличается от запросов вашей задачи? | |
|
|
|
|
|
|
|
для: Pegas31
(08.01.2010 в 17:30)
| | >>Я думаю можно к ID прибавлять или отнимать 1
если у вас id автоинкремент и вы будете удалять записи, думаю, это не лучший вариант | |
|
|
|
|
|
|
|
для: Pegas31
(08.01.2010 в 17:30)
| | Есть простой способ вперед-назад. Так, как подсказал sim5
buttons_next.php?id=номер_текущей_загадки
|
а в запросе так:
SELECT *
FROM `zagadki`
WHERE `id` > $id
ORDER BY `id` ASC
LIMIT 1
|
и наоборот. | |
|
|
|
|
|
|
|
для: Николай2357
(09.01.2010 в 06:55)
| | Я такого не подсказывал. В начале и конце нужно получать как минимум 2 записи, а между конечными значениями 3. | |
|
|
|
|
|
|
|
для: sim5
(09.01.2010 в 07:20)
| | Я имел ввиду гет параметр. Не запрос.
А получать как минимум 2 записи вовсе и не обязательно, если начинать с первой записи и идти по порядку. Главное в GET писать номер текущей, тогда вперед вытащит следующую, а назад предыдущую.
Совсем не нужны тут вычисления, применяемые при постраничной навигации.
Останется только как то обозначить начало и конец, чтоб за пределы не выскочить, но это дело техники уже. | |
|
|
|
|
|
|
|
для: Николай2357
(09.01.2010 в 08:12)
| | Если не удалять записи, и они у вас будут чинно по порядку идти, то кто бы спорил, в противном же случае, нужно получать id предыдущей и последующей записи. Вопрос стоит не о выводе, а именно о построении навигатора.
А автору нужно понять, что постраничная навигация, это не значит вывод страниц, кои являются чисто условным понятием, а навигация по контенту, который может быть различным, как и его выводимый объем. | |
|
|
|
|
|
|
|
для: sim5
(09.01.2010 в 08:16)
| | Если не удалять записи, и они у вас будут чинно по порядку идти
Да в том и дело, что нет. Перепрыгнет и через несколько пропущеных. Ведь запрос выдаст следующий существующий id от текущего. | |
|
|
|
|
|
|
|
для: Николай2357
(09.01.2010 в 08:55)
| | Автор вообще не соображает, что такое навигация, он ее сути не понимает. И если он "схлямзит" код постраничного вывода записей из базы, а ему потребется построить навигацию по документу, то сядет в лужу, хотя суть такой навигации ни чем не отличается от "постраничного" вывода записей из таблицы.
Нравится вам называть это прыганьем, да заради бога. Вот только запроса хватит и одного, и одним запросом и минимумом условий решить всю задачу, а не скакать и прыгать.
Вычислениями подобными в сложном навигаторе я никого и не заставляю заниматься. | |
|
|
|
|
|
|
|
для: sim5
(09.01.2010 в 09:10)
| | Ну запрос и так один.
Хотя по сути да, достать ближний слева и ближний справа одним запросом наверное красивее, чем делать "предохранитель"... Оптимизацией я слишком испорчен.) | |
|
|
|
|
|
|
|
для: Николай2357
(09.01.2010 в 09:18)
| | Вот именно. Но даже не в этом соль:
это не постраничная навигация, страница та же. Меняется только текст загадки, путём вызова из SQL таблицы.
Так может ответить только тот, кто не понимает самой сути навигации. Вот суть ее, прежде всего, ему и надо понять, прежде чем "обсасывать" конкретные запросы. | |
|
|
|
|
|
|
|
для: sim5
(09.01.2010 в 09:23)
| | Согласен, я в этом деле новичок. После Ваших объяснений понял наконец принцип навигации. Вот вопрос только возник Вы написали
buttons_next.php?id=номер_текущей_загадки
номер_текущей_загадки - это $id и её надо передавать в сеансе?
Я правильно понял?
Простите может вопросы покажутся глупыми, но я только учусь. | |
|
|
|
|
|
|
|
для: Pegas31
(09.01.2010 в 12:49)
| | Что за сеанс?
buttons_next.php?id=123
123 - у вас это придет в строке браузера, более нигде этот параметр хранить не вижу смысла.
И вот от этого id уже надо отталкиваться и искать предыдущую и последующую записи. | |
|
|
|
|
|
|
|
для: Николай2357
(09.01.2010 в 09:18)
| | А, кстати, как достать одним запросом ближайшую "слева" и ближайшую справа запись по id?
С sql очень напряжные отношения, никак с объединением не разберусь.
Что-то типа
<?php
SELECT id AS prev FROM polls WHERE `id` < '$id' ORDER BY id DESC LIMIT 1
UNION
SELECT id AS next FROM polls WHERE `id` > '$id' ORDER BY id ASC LIMIT 1
|
? | |
|
|
|
|
|
|
|
для: neadekvat
(09.01.2010 в 12:54)
| | Зачем это делать одним запросом? | |
|
|
|
|
|
|
|
для: Trianon
(09.01.2010 в 17:06)
| | Разве что для сокращения кода..строек на пять-шесть. | |
|
|
|
|
|
|
|
для: Николай2357
(09.01.2010 в 06:55)
| | Вот так написал:
<?php
session_start();
include ('mysql.php');
if (isset($_GET['next']))
{
// нужна следующая загадка
$query = "SELECT * FROM `zagadki` WHERE `id` > '$_SESSION[id_zag]' LIMIT 1";
}
$sql = mysql_query($query) or die(mysql_error());
// если есть
if (mysql_num_rows($sql) == 1)
{
$row = mysql_fetch_assoc($sql);
$id_zag_new = $row['id'];
$zagadka = $row['vopros'];
$otvet = $row['otvet'];
print '<h3>Загадка ' . $id_zag_new . ' <br> ' . $zagadka . ' <br> ' . $otvet . '</h3>';
}
?>
|
Если просто открываю файл в браузере (Денвером), показывает нужную запись, а если по нажатии кнопки
<a href="buttons_next?next.php"><img src="Imgs/vpered.png" width="119" height="58"
longdesc="buttons_next?next.php" /></a>
|
Ошибку выдаёт, в Денвере пишет что такой файл не найден.
В чём проблема подскажите пожалуйста. | |
|
|
|
|
|
|
|
для: Pegas31
(09.01.2010 в 15:22)
| | о.О Э?..
Ссылки должны быть та страницу, а после ? должен передаваться id нужной загадки
Ну вот, например, мы на странице с загадкой номер 10
Пусть в браузере адрес выглядит так:
mystery.php?id=10
Теперь ищем, какая же предыдущая
<?php
$id = intval($_GET['id']);
if (!id) $id = 1;
// выводим загадку, которая открыта ( то есть в данном случаи с id = 10 ).
// код код код
// ищем предыдущую загадку
$sql = "SELECT id FROM `zagadki` WHERE `id` < '$id' ORDER BY id DESC LIMIT 1";
$query = mysql_fetch_row( mysql_query( $sql ) );
$prev_mystery = $query[0]; // нашли, выводим ссылку
echo '<a href="mystery.php?id=' . $prev_mystery . '">Предыдущая загадка</a>';
?>
|
Что-то такое.. | |
|
|
|
|
|
|
|
для: neadekvat
(09.01.2010 в 16:36)
| | У меня они в 2-х файлах. Кнопка находится в файле zagadki.php, а сам запрос в buttons_next.php.
Так что не получится? Нужно всё в 1 файл засовывать? | |
|
|
|
|
|
|
|
для: Pegas31
(09.01.2010 в 23:50)
| | Нет, но если запрос в buttons_next.php, то логично, что файл zagadki.php должен подключаться именно в файле buttons_next.php, после запросов. | |
|
|
|
|
|
|
|
для: neadekvat
(10.01.2010 в 00:12)
| | а как его туда подключить?
надо функцию создавать и инклудом подключать?
я не совсем понял, если можно напиши плз | |
|
|
|
|
|
|
|
для: Pegas31
(10.01.2010 в 00:25)
| | Вопрос снимается так как автор тупанул
buttons_next?next.php - неправильно написал
надо - buttons_next.php?next
блин.
И сразу новый вопрос, меня после нажатия кинуло на страницу где был запрос, а мне надо чтоб я остался на той же странице, только загадка поменялась. | |
|
|
|
|
|
|
|
для: Pegas31
(10.01.2010 в 00:41)
| | Файл А - обработчик, который принимает параметры, обрабатывает их, делает запросы и тд
Файл Б служит только для вывода той информации, которая получена в файле А.
Соответсвтенно, все ссылки из файла Б будет вести на файл А, в свою очередь в файле А будет инклудироваться файл Б после проведения всех нужных операций.
Файл А:
<?php
$id = (int)$_GET['id'];
$sql = "";
$query = mysql_query( $sql );
$arr = mysql_fetch_assoc( $query );
include ('Файл_Б');
|
Файл Б:
<a href="Файл_А?id=<?php echo $id; ?>">Ссылка</a>
|
Суть понятна? | |
|
|
|
|
|
|
|
для: neadekvat
(10.01.2010 в 00:47)
| | Суть понятна. Так и сделал, но после нажатия на кнопку "вперёд", меня кидает на страницу
.../buttons_next.php?next, а там пусто. А мне надо остаться на странице .../zagadki.php, но с обновлённой загадкой. Я пробовал дописать в конце файла с запросом -
header('Location: zagadki.php');
exit;
выдал какую-то ошибку.
ещё использовал такой вариант
<script type="text/javascript">
window.location = "zagadki.php"
</script>
Но мелькает пустая страница, можно этого избежать как-то? | |
|
|
|
|
|
|
|
для: Pegas31
(10.01.2010 в 12:39)
| | Значит суть вам нифига не понятна.
Так, зачем вы разделили файлы? Может, есть смысл все-таки объединить их? | |
|
|
|
|
|
|
|
для: neadekvat
(10.01.2010 в 13:19)
| | в файле zagadki 180 строк и несколько подключенных модулей, если я туда запросы буду писать получится вобще каша. | |
|
|
|
|
|
|
|
для: Pegas31
(10.01.2010 в 13:40)
| | Значит подключайте туда еще файл с запросами, а ссылки делайте на zagadki.php | |
|
|
|
|
|
|
|
для: neadekvat
(10.01.2010 в 13:42)
| | А почему не выводит следующую загадку?
<?php
session_start();
include ('mysql.php');
function Draw_zagadka()
{
// делаем запрос к БД
// и ищем загадку
$query = "SELECT *
FROM `zagadki`
WHERE `id` > '$id_zag'
ORDER BY `id`
LIMIT 1";
$sql = mysql_query($query) or die(mysql_error());
// если есть
if (mysql_num_rows($sql) == 1)
{
// то мы ставим об этом метку в сессии
$row = mysql_fetch_assoc($sql);
$id_zag = $row['id'];
$zagadka = $row['vopros'];
$otvet = $row['otvet'];
$_SESSION[$id_zag] = $id_zag;
print '<h3>Загадка ' . $id_zag . ' <br> ' . $zagadka . ' <br> ' . $otvet . '</h3>';
}
}
if (isset($_GET['next']))
{
$id_zag_new = $_SESSION[$id_zag];
print '<h3>Загадка ' . $id_zag_new . ' <br></h3>';
// нужна следующая загадка
$query = "SELECT *
FROM `zagadki`
WHERE `id` > '$id_zag'
ORDER BY `id`
LIMIT 1";
$sql = mysql_query($query) or die(mysql_error());
// если есть
if (mysql_num_rows($sql) == 1)
{
$row = mysql_fetch_assoc($sql);
$id_zag = $row['id'];
$zagadka = $row['vopros'];
$otvet = $row['otvet'];
print '<h3>Загадка ' . $id_zag . ' <br> ' . $zagadka . ' <br> ' . $otvet . '</h3>';
}
Draw_zagadka();
/* ?>
<script type="text/javascript">
window.location = "zagadki.php"
</script>
<?
*/
}
?>
|
Я несколько раз вывожу на экран для проверки. Так вот здесь
if (isset($_GET['next']))
{
$id_zag_new = $_SESSION[$id_zag];
print '<h3>Загадка ' . $id_zag_new . ' <br></h3>';
пусто, как будто в переменной ничего нету. Я не пойму вроде в сессии всё как положено, а результат не сохраняется. | |
|
|
|
|
|
|
|
для: Pegas31
(10.01.2010 в 14:40)
| | 1. Зачем здесь функция?
2. В теле функции вставьте такой код:
echo 'id выводимой загадки - ' . $id_zag . '. Её и будем выводить';
И скажите, что же вы увидели. | |
|
|
|
|
|
|
|
для: neadekvat
(10.01.2010 в 14:56)
| | Так в теле оно всё выводится и id и текст короче всё что надо, а вот за пределами функции даже в переменной сессии не выводится (там пусто).
Мне надо чтоб функция была. Так как на чтранице zagadki я подключаю эту функцию для отображения 1 загадки, а уже по нажатии мы идём на GET 'next'. Если её втулить в функцию я не смогу перейти по кнопке
zagadki_zapros.php?next | |
|
|
|
|
|
|
|
для: Pegas31
(10.01.2010 в 15:04)
| | Вы сделали то, что я просил? Видимо, нет.
Интересно, как в функцию попадет значение переменной, если эта самая функция ни одного аргумента не принимает. | |
|
|
|
|
|
|
|
для: neadekvat
(10.01.2010 в 15:14)
| | зделал как вы написали, выдало сыыобщение с id загадки, которая выводится, но она у меня в функции итак выводилась, посморите print в теле функции. И аргументы она принимает как положено. Проблема состоит в том, что переменная $id_zag не сохраняет значение за пределами функции Draw_zagadka(). Не понимаю почему, я ведь её в сеансе сохранил.
А при входе в GET я принтом сразу проверил её и там пусто. Чё за проблема не пойму, подскажите плиз. | |
|
|
|
|
|
|
|
для: Pegas31
(10.01.2010 в 16:34)
| | Я вообще не понимаю, зачем вы сначала в функции что-то делаете, а потом вне функции то же самое
Да еще и в сессии сохраняете.
$_SESSION[$id_zag] = $id_zag; - и так зачем делаете то же не понятно. Потом чтобы оттуда что-то достать придется ведь через цикл делать. Ключ массива сессий должен быть постоянным, имхо. | |
|
|
|
|
|
|
|
для: neadekvat
(10.01.2010 в 16:39)
| | У меня в файле zagadki.php есть вызов функции Draw_zagadka(); для того чтобы вывести 1-ю загадку. А потом уже мы нажимаем на кнопки вперёд и назад. Я просто не могу выложить листинг файла zagadki так как там очнь много всего. Проблема в переменной $id_zag - это точно, я не поёму почему она вне функции не сохраняет значенте. И как мне сохранить там id | |
|
|
|
|
|
|
|
для: Pegas31
(10.01.2010 в 16:46)
| | Почитайте про функции, все ответы там. | |
|
|
|
|
|
|
|
для: Pegas31
(09.01.2010 в 15:22)
| | Ответ может немного запоздал, но все же.
>Вот так написал:
>
><?php
>
>if (isset($_GET['next']))
> .......................................
|
>
>
><a href="buttons_next?next.php"><img src="Imgs/vpered.png" width="119" height="58"
>longdesc="buttons_next?next.php" /></a>
>
|
>Ошибку выдаёт, в Денвере пишет что такой файл не найден.
>В чём проблема подскажите пожалуйста.
А вас не смущает что вы проверяете GET[NEXT], а передать пытаетесь NEXT.PHP? | |
|
|
|
|
|
|
|
для: tvv123456
(10.01.2010 в 18:22)
| | я уже это исправил | |
|
|
|
|
|
|
|
для: Pegas31
(10.01.2010 в 18:42)
| | А ну да не дочитал немного, сорри. | |
|
|
|
|
|
|
|
для: tvv123456
(10.01.2010 в 19:31)
| | Взял всё в один файл запихнул, вроде получше стало, однако загадка не заеняет предидущую, а пишется ниже. Вот отрывок кода:
<table width="100%" height="332" border="0" cellpadding="0" cellspacing="0">
<tr>
<td width="20%" height="332" align="center" valign="top"><img src="Imgs/ukazatel.png" alt="ukaz" width="191" height="328" border="0" usemap="#MapMapMap" />
<map name="MapMapMap" id="MapMapMap">
<area shape="poly" coords="8,273,36,239,42,249,147,213,157,248,49,273,52,288" href="poslovici.php" />
<area shape="poly" coords="24,162,136,162,136,148,173,173,139,198,137,187,24,197" href="games.php" />
<area shape="poly" coords="40,127,12,98,52,80,49,88,162,108,153,139,45,115" href="skazki.php" />
<area shape="poly" coords="22,40,133,24,133,12,171,26,143,58,138,48,27,73" href="zagadki.php" />
<area shape="poly" coords="21,39,21,38" href="#" />
</map></td>
<td width="80%" align="center" valign="top"><p class="стиль2">Загадки</p>
<table width="85%" height="268" border="0" cellpadding="0" cellspacing="0">
<tr>
<td height="164" colspan="2"><p align="center" class="стиль2">
<?
print '<h3> Флаг = '.$flag.'</h3><br>';
if ($flag == 0)
{
if (isset($_GET['next']))
{
print '<h3> Флаг 1 = '.$flag.'</h3><br>';
$query = "SELECT *
FROM `zagadki`
WHERE `id` > '$id_zag_new'
ORDER BY `id`
LIMIT 1";
$sql = mysql_query($query) or die(mysql_error());
// если есть
if (mysql_num_rows($sql) == 1)
{
$row = mysql_fetch_assoc($sql);
$id_zag = $row['id'];
$zagadka = $row['vopros'];
$otvet = $row['otvet'];
echo '<h3>Загадка ' . $id_zag . ' <br> ' . $zagadka . ' <br> ' . $otvet . '</h3>';
}
//Draw_zagadka();
$id_zag_new = $id_zag;
}
}
else
{
print '<h3> Флаг 2 = '.$flag.'</h3><br>';
include ("zagadki_zapros.php");
Draw_zagadka();
$flag = 0;
}
?>
</p></td>
</tr>
<tr>
<td colspan="2" valign="middle" class="стиль2"><div align="center">Ответ
<input name="otvet" type="text" id="otvet" maxlength="20" />
<input type="submit" name="proverka" id="proverka" value="Проверить" />
</div></td>
</tr>
<tr>
<td width="51%" align="right" valign="middle" class="стиль2">
<? print '<a href="zagadki.php?prev"><img src="Imgs/nazad.png" width="119" height="58"
longdesc="zagadki.php?prev" /></a>'?>
</td>
<td width="49%" align="left" valign="middle" class="стиль2">
<? print '<a href="zagadki.php?next"><img src="Imgs/vpered.png" width="119" height="58"
longdesc="zagadki.php?next" /></a>'?>
</td>
</tr>
</table>
<p class="стиль2"> </p>
</tr>
</table>
|
| |
|
|
|
|
|
|
|
для: Pegas31
(11.01.2010 в 19:29)
| | а вот реально, хрена тут гадать по кускам кода? Выложи все в архиве, чтоб можно было просто взять и переписать по-человечески. И тогда, сравнивая со своей кашей, ты поймешь... надеюсь | |
|
|
|
|
 5.9 Кб |
|
|
для: kosta_in_net
(12.01.2010 в 02:18)
| | выкладываю 2 файла, которых должно хватить для полного представления проблемы. | |
|
|
|
|
 1.5 Кб |
|
|
для: Pegas31
(12.01.2010 в 21:34)
| | 2-й | |
|
|
|
|
|
|
|
для: Pegas31
(12.01.2010 в 21:34)
| | напомню, на одной странице должна замениться загадка, без генерирования другой страницы.
Если это возможно. | |
|
|
|