Jump to content
  • 0

Две проблемы: запрос к БД и сортировка и $_POST запрос


Stahanovec
 Share

Question

Первая проблема вот в чем: на странице нужно рассортировать все фотки пользователей (у которых они есть) по дате от самых новых до самых старых. в БД колонка с датой и временем 'addphototime', тип колонки - 'datetime'.

пробую вывест с помощью следующего кода:

$new = mysql_fetch_array(mysql_query("SELECT photo FROM users WHERE photo IS NOT NULL ORDER BY addphototime DESC"));
foreach ($new as $value){
echo '<img src="'.$value.'_tumb'.'">';
//var_dump для отладки просто
echo var_dump($new);
}

но выводятся только 2 фотки и то одного и того же пользователя с самой последней датой (если ASC поставить, то с самой ранней соответственно)

когда добавляешь фотку выполняется вот такой запрос:

mysql_query("UPDATE users SET photo='".$uploadfile."', addphototime=NOW() WHERE uniq_id='".$r['uniq_id']."' ");

————-

Вторая проблема такая: на сайте выскакивает случайная фотки и нужно угадать возраст человека по фотке, справа от фотки форма с выбором возраста в виде сетки, каждая ячейка это кнопка <input type="submit" name="answer">. Ну так вот, если при первом заходе на сайт сделать выбор, выскакивает следующая фотка (как и должно быть), но потом просто при обновлении страницы все равно отправляюстся данные $_POST['answer'] предыдущего варианта, т.е. можно просто сто раз обновить страницу, при этом обработчик считает, что ему 100 раз дали вариант ответа.

пробовал убивать переменную с помощью

unset($_POST['answer']);

но не работает.

Link to comment
Share on other sites

13 answers to this question

Recommended Posts

  • 0

hint: Если сделать колонку timestamp, она будт обновляться автоматически при insert или update

В остальных фотках это поле точно не null?

echo var_dump($new)

var_dump сам работает как echo, так что echo тут не нужен.

Вторая проблема решается разве что редиректом после обновления. Но проще передавать кроме возрасте ещё и ID картинки. И не учитывать две подряд одинаковых.

Edited by Int
Link to comment
Share on other sites

  • 0
hint: Если сделать колонку timestamp, она будт обновляться автоматически при insert или update

В остальных фотках это поле точно не null?

нет, у остальных фотки точно не null, на главной странице должна выводится случайная фотка и все работает как надо.

Вторая проблема решается разве что редиректом после обновления. Но проще передавать кроме возрасте ещё и ID картинки. И не учитывать две подряд одинаковых.

а вот тут поподробней, если можно.

если редиректом делать, то у меня такой вариант есть: при отправке формы записывать в переменную, допустим $_SESSION['ans'], значение true.

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

правильно расписал?

а насчет второго способа не очень ясно.

имеем форму, отправляем вариант ответа, а вместе с ним в скрытом поле ID картинки (т.е. пользователя?)?

т.е. при отправке формы не только выводим результат игры но еще и проверяем: соответствует ли ID картинки (который в сессию записывается) нынешнему ID картинки, если нет, то просто код не выполняется. все так?

Link to comment
Share on other sites

  • 0

1. Насколько я понимаю, то у вас выбирается всего одна строка. Ну и, видимо, если одна запись в БД == одной фотке, то так всё и должно быть — у вас mysql_fetch_array возвращает массив с двумя элементами (индексы «0» и «photo»), имеющими одно значение. Для выборки всех записей надо зацикливать вызов mysql_fetch_array, а ещё лучше вообще использовать mysql_fetch_assoc.

2. Надо делать редирект. unset «убивает» переменную, но при обновлении страницы всё равно отсылается массив $_POST. Используйте header("Location: ..."); ну или, в крайнем случае, яваскриптовый редирект.

Link to comment
Share on other sites

  • 0

В случае редиректа:

$bla=$_POST['blabla'];
function1($bla);
header('Location: '.basename($_SERVER['SCRIPT_NAME']));
die;

В случае проверки ID (фотки):

if (!isset($_SESSION['fotoid'])) $fotoid=0;
else $fotoid=$_SESSION['fotoid'];
$newfotoid=$_POST['fotoid'];
if ($newfotoid != $fotoid)
{
function1($bla);
$_SESSION['fotoid']=$newfotoid;
}

Edited by Int
Link to comment
Share on other sites

  • 0
1. Насколько я понимаю, то у вас выбирается всего одна строка. Ну и, видимо, если одна запись в БД == одной фотке, то так всё и должно быть — у вас mysql_fetch_array возвращает массив с двумя элементами (индексы «0» и «photo»), имеющими одно значение. Для выборки всех записей надо зацикливать вызов mysql_fetch_array, а ещё лучше вообще использовать mysql_fetch_assoc.

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

2. Надо делать редирект. unset «убивает» переменную, но при обновлении страницы всё равно отсылается массив $_POST. Используйте header("Location: ..."); ну или, в крайнем случае, яваскриптовый редирект.

через header() не получится, так как обработчик это тот же самый файл, через яваскрипт посмотрю вариант

Int, смотрю код и вникнуть не могу вообще. вот например (см. комменты):

$bla=$_POST['blabla'];
//выполняем функцию
function1($bla);
//и далее редирект?вообще не понял, у меня обработчик находится в одном файле с формой, так что заголовки отправить никак не получится, если только наверно что-то в сессию должно отправлятся, а в header.php уже проверка должна идти.
header('Location: '.basename($_SERVER['SCRIPT_NAME']));
die;

я делал вот так: после отправки POST'a записывал в сессию значение true в переменную. далее в header.php проверяю наличие в переменной сессии значения true, если есть делаю редирект на ту же страницу.

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

Edited by Stahanovec
Link to comment
Share on other sites

  • 0

Ааааааааа, так ещё результат надо вывести

<?
session_start();
if (isset($_POST['blablabla'])) //Обработка голосования
{
process();
$_SESSION['result']='угадал'
header('location: rtfm.ru');
}
?>
<!DOCTYPE >
<html>
........
if (isset($_SESSION['result'])) {echo $_SESSION['result']; unset($_SESSION['result']);}

Ну что-то типа этого

Edited by Int
Link to comment
Share on other sites

  • 0

1. Как-то так надо делать

$q=mysql_query("SELECT `photo` FROM `users` WHERE `photo` IS NOT NULL ORDER BY `addphototime` DESC");
while ($r=mysql_fetch_assoc($q))
echo '<img src="'.$r['photo'].'_tumb'.'">';

2. Всегда можно сделать редирект в этот же скрипт. Например, прописав дополнительный альяс на скрипт через какой-нибудь mod_rewrite или, хотя бы, делать отправку формы по адресу «/script.php?send», а редирект делать просто header('Location: /script.php');

Link to comment
Share on other sites

  • 0
Ааааааааа, так ещё результат надо вывести

<?
session_start();
if (isset($_POST['blablabla'])) //Обработка голосования
{
process();
$_SESSION['result']='угадал'
header('location: rtfm.ru');
}
?>
<!DOCTYPE >
<html>
........
if (isset($_SESSION['result'])) {echo $_SESSION['result']; unset($_SESSION['result']);}

Ну что-то типа этого

странно, делаю так почти так, но но пашет:

<?
session_start();

if(isset($_POST['answer'])){
$_SESSION['result'] = $_POST['answer'];
header("Location: index.php");

=====================

if(isset($_SESSION['result'])){
...
if($_SESSION['result'] == $_SESSION['user']['age']){
$_SESSION['gender'][0] = ucfirst($_SESSION['gender'][0]);
echo "<li><strong style=\"color: green;\">Правильно! Вы угадали!</strong></li>
<li>".$_SESSION['gender'][0]." действительно ".$_SESSION['user']['age']."</li>";
if($_SESSION['avg'][0] != 0){
echo "<li><strong>Средний возраст:</strong> ".round($_SESSION['avg'][0], 2)."</li>";
}
else {
echo "<li><strong>Средний возраст:</strong> нет данных</li>";
}
echo "</ul>\n";
}
}
//далее еще несколько таких же блоков, только с разными условиями равенства или неравенства
...
unset($_SESSION['result']);
}
else{
echo '<p>Здравствуйте, вас приветствует сайт......</p>';
}

когда нажимаю на кнопку, то просто страница перезагружается, при том результаты не выводятся

может через AJAX попробовать это сделать?

1. Как-то так надо делать

$q=mysql_query("SELECT `photo` FROM `users` WHERE `photo` IS NOT NULL ORDER BY `addphototime` DESC");
while ($r=mysql_fetch_assoc($q))
echo '<img src="'.$r['photo'].'_tumb'.'">';

а вот это мне помогло очень, работает! Спасибо большое!

Edited by Stahanovec
Link to comment
Share on other sites

  • 0

скобка после header стоит, просто сюда не скопировалась. добавил exit().

еще подправил немного. вроде пашет как надо.

спасибо большое!

еще есть вопрос один по javascript, знаю что не по теме, но все же может знает кто:

<script type="text/javascript">
function replace(){
document.getElementById('comment').value='';
}
</script>
<form id="comments" action="index.php" method="post">
<input type="text" id="comment" name="comment" value="Оставьте свой коммент..." size="50" onclick="replace()" />
<input type="submit" name="sendcom" value="Отправить" />
</form>

событие onclick не работает, сначала работало, потом вдруг перестало. понятие не имею в чем дело.

надо чтобы при нажатии на текстовое поле value становился пустым

Edited by Stahanovec
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy