LINUX.ORG.RU

[PHP]Вопрос повторяется 2 раза

 


0

0

Я новичок в PHP, прошу сильно не пинать, пишу тест, такая ситуация что при отправки данных с формы вопрос повторяется 2 раза, не могу понять что за фигня :-(

<?php session_start();
$login=$_SESSION['name_id']; //принимаем логин
$max_row_user=$_SESSION['perem']; //принимаем переменную
$max_ver=$_SESSION['vers'];
require "mysql.php";
mysql_query("set names utf8");
$podr_user="select id_test from 1c_users where Fio='$login' LIMIT 1"; //ищем id_test
$id_user="select id_1cuser from 1c_users where Fio='$login' LIMIT 1"; //ищем id_пользователя
$user=mysql_query($id_user) or die ('Error $id_user' . mysql_error());
$no_fantazy=mysql_fetch_row($user);
$id=$no_fantazy[0]; //выбираем id
$podr_query=mysql_query($podr_user) or die('Error query podr' . mysql_error());
$podr=mysql_fetch_row($podr_query);
if ($podr[0]==1) {$nametest="для работников Аппарата Управления"; $id_test=1;} elseif ($podr[0]==4) {$nametest="для работников Механического завода";$id_test=4;} elseif ($podr[0]==2) {$nametest="для работников ЗМИК";$id_test=2;} elseif ($podr[0]==3) {$nametest="для работников ТИСМА"; $id_test=3;}
$_SESSION['nametest']=$nametest;
$max_kol_query=mysql_query("select count(*) from journal where id_user=$id") or die(mysql_error());
$max_kol=mysql_fetch_row($max_kol_query);
$quest_user="select vopros,id_vopros from vopros where id_test=$id_test and id_vopros not in (select id_vopros from journal where id_user=$id and id_test=$id_test and version=$max_ver) LIMIT 1";
if ($max_kol[0]<=$max_row_user )
{
$quest_query=mysql_query($quest_user) or die('Error query podr' . mysql_error());
while ($row = mysql_fetch_row($quest_query,MYSQL_ASSOC)) {
$array_vopros_id[]=$row['id_vopros'];
$array_vopros[]=$row['vopros'];  
}
srand ((float) microtime() * 10000000);
$input = $array_vopros_id;
$rand_keys = array_rand($input);
$id_vopros=$input[$rand_keys];
$query_vopros=$array_vopros[$rand_keys];
$quest_random=array_rand($array_vopros_id);
$query_report=mysql_query("select otvet from otvet inner join vopros on otvet.id_vopros=vopros.id_vopros where vopros.id_vopros=$id_vopros") or die('Error query report' . mysql_error());
//в отбор массива исключить уже имеющийся id_vopros
while ($row = mysql_fetch_assoc($query_report) ) {
$report[] = $row['otvet'];
}
$otvet_query="select id_otvet from otvet inner join vopros on otvet.id_vopros=vopros.id_vopros where vopros.id_vopros=$id_vopros"; //выбираем ответы соответствующие вопросам
$otvet_exec=mysql_query($otvet_query) or die('Error query true fatal' . mysql_error());
while ($orow = mysql_fetch_assoc($otvet_exec) ) {
$otvet[] = $orow['id_otvet'];
}
@$cont_otvet1="select otvet from otvet where id_otvet=$otvet[0]";
@$cont_otvet2="select otvet from otvet where id_otvet=$otvet[1]";
@$cont_otvet3="select otvet from otvet where id_otvet=$otvet[2]";
$cont_otvet1_exec=mysql_query($cont_otvet1) or die('Error query true fatal' . mysql_error());
$cont_otvet2_exec=mysql_query($cont_otvet2) or die('Error query true fatal' . mysql_error());
$cont_otvet3_exec=mysql_query($cont_otvet3) or die('Error query true fatal' . mysql_error());
$cont1=mysql_fetch_row($cont_otvet1_exec);
$cont2=mysql_fetch_row($cont_otvet2_exec);
$cont3=mysql_fetch_row($cont_otvet3_exec);
$radio=$_POST['radio'];
$Sub=$_POST['Sub'];
if (!isset($radio)) {
$radio=0;
}
$vopr_query="select id_vopros from otvet where id_otvet=$radio";
$vopr_exec=mysql_query($vopr_query);
$vopr=mysql_fetch_row($vopr_exec);
$vopros=$vopr[0];
if (!isset($vopros)) {
$vopros=0;
}
if (isset($Sub)) {
$query="insert into journal(id_otvet,id_user,id_vopros,id_test,version) values ($radio,$id,$vopros,$id_test,$max_ver)";
$query_exec=mysql_query($query) or die ('Error query_exec' . mysql_error());
echo "otvet_query - $otvet_query <br />"; echo "otvet - $otvet <br />"; echo "vopros - $vopros<br />"; echo "$podr_user <br />"; echo "id_user - $id_user<br />"; echo "user - $user<br />"; echo "quest_user - $quest_user<br />";
}
}
else
{
Header("Location: http://172.24.118.219/seans/statistic.php");
//Header("Location: http://127.0.0.1/seans/statistic.php");
echo "<hr>";
echo "Тест закончен";
echo "<hr>";
exit;
}
echo '
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
  <title>Тест</title>
  <meta name="generator" content="Amaya, see http://www.w3.org/Amaya/" />
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="Cache-Control" content="no-cache">
</head>
<body>
<script language=javascript>
var intLeft = 180; // Время в секундах
function GoPage() {
if (0 == intLeft) 
//location.replace("testing.php")
document.test.Sub.click()
else {
intLeft -= 1;
document.getElementById( "gotopage" ).innerHTML = intLeft + " ";
setTimeout("GoPage()", 1000);
}
}
</script>
</head>
<body onload="setTimeout(\'GoPage()\', 1000)">
<div class=promo align=center><br><br>
</div>
<br><br>
<center>
<h2>Время на вопрос: 
<b id=gotopage>
<script language=javascript>
document.write(intLeft);
</script>
</b>
</h2>'; 
echo "
    <form name=test method=POST action=testing.php>
    <p align=center><table border=1 width=600 bgcolor=#ffcc00>
      <col />
      <tbody>
	<tr>
	  <td><h1 style=text-align:center;margin-left:auto;margin-right:auto;>Тест  </h1><p align=center>$nametest</p></td>
	</tr>
	<tr>
	  <td><h3
    style=text-align:center;margin-left:auto;margin-right:auto;>Тестируемый
    </h3><p align=center><i>$login</i></p></td>
	</tr>
	<tr>
	  <td><p align=center> $query_vopros </font></p><br><p align=center>$image</p></td>
	</tr>
	<tr>
	  <td><p align=center><font FACE= Arial Black, Courier, Times New Romain, Courier New COLOR=black><input type=radio name=radio value=$otvet[0] />$cont1[0] </font></p></td>
	</tr>
	<tr>
	  <td><p align=center><font FACE= Arial Black, Courier, Times New Romain, Courier New COLOR=black><input type=radio name=radio value=$otvet[1] />$cont2[0]</font></td>
	</tr>
	<tr>
	  <td><p align=center><font FACE= Arial Black, Courier, Times New Romain, Courier New COLOR=black><input type=radio name=radio value=$otvet[2] />$cont3[0]</font></td>
	</tr>
      <tr>
      <td><p align=center> 
    <input name=Sub type=submit value=OK></p></td>
      </tbody>
    </table></p>
 </form>
</body>
</html>
";
?>
Помогите разобраться в этой каше, необходимо что бы вопрос выходил один раз и больше не повторялся. :-(

★★★★★

Ещё не поздно изучить какой-нить фреймворк...

Приведи минимальный пример демонстрирующий проблему.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

$quest_user=«select vopros,id_vopros from vopros where id_test=$id_test and id_vopros not in (select id_vopros from journal where id_user=$id and id_test=$id_test and version=$max_ver) LIMIT 1»;


Вообщем эта строка выбирает вопрос из таблицы в массив, Limit 1 я поставил спецом что бы отчетливей была видна проблема, потом из этого массива случайным образом выбирается вопрос и публикуется на форме. Но проблема в том что вопрос повторяется после нажатия ок, я не знаю как от этого избавится. Если limit 1 убрать тоон может повторится а может нет.

splinter ★★★★★
() автор топика

Последний раз я такое видел, когда какой-то чувак постучался в аську и попросил помочь исправить программу на бейсике. Там был такой же кодофарш =).

Deleted
()
Ответ на: комментарий от splinter

что сразу рычать начинаете

Ты бы его хоть отформатировал. Отступы там расставил, пробелы где надо добавил, где не надо - убрал. И т.п. Если ты это сделаешь, скорее всего и ошибки сам найдёшь. А в таком виде код читать просто сложно.

Deleted
()
Ответ на: комментарий от Deleted

Мне сказали «надо», я сказал нате.

splinter ★★★★★
() автор топика

> <font FACE=

Обожемой! Брось эту фублю!

Слушай, родной, а разве каких-нибудь туториалов по основам отладки своего и чужого говнокода в Сети уже нет? Ну там, как средуцировать мегауйму говнокода до одной бажной какашки, которая стабильно воспроизводит баг.

shimon ★★★★★
()
Ответ на: комментарий от splinter

> Опубликовал полный срипт потому что не знаю где заковырка.

Ты думаешь, мы тут сможем в таком полете мысли разобраться, если ты это писал и не можешь.

shimon ★★★★★
()
Ответ на: комментарий от shimon

Я думаю, тем, кто пишет *такой* код, явно не до туториалов по основам отладки.

tarcar
()
Ответ на: комментарий от lester_dev

> ААаааАААА!!! Что это?

+1. меня же теперь кошмары замучают!!11

isden ★★★★★
()
Ответ на: комментарий от VladimirMalyk

> ахренеть, и эти люди осмеливаются говорить что 1С для быдлокодеров.

не стоит судить глобально на основании частных случаев.

isden ★★★★★
()
Ответ на: комментарий от lester_dev

Я так понимаю все по ведру говна вылили, а толком ничего не сказали. Да я не программист, да это говнокод о чем я и предупредил всех заранее.

splinter ★★★★★
() автор топика
Ответ на: комментарий от tarcar

В него пишется все нормально,после первого сабмита добавляется вопрос ид пользователя версия теста ответ, дело в том что после этого в html-форме выходит опять этот же вопрос и только на 2-й раз по нажатию сабмит выводится следующий вопрос.

splinter ★★★★★
() автор топика
Ответ на: комментарий от splinter

>а толком ничего не сказали

Тут нереально что-то сказать:

1. Код настолько ужасен (отсутствие форматирование, смешение дизайна и кода и т.п.), что в нём разобраться беглым взглядом просто нереально. Абсолютно :)

2. Запустить и посмотреть что получится (чтобы хотя бы понять, в чём выражается проблема «при отправки данных с формы вопрос повторяется 2 раза») тоже не выйдет, так как отсутствует подключаемый файл mysql.php, отсутствует БД, ну и, опять же, даже при наличии всех данных простым пуском оно не решится, т.к. нужно будет настраивать БД и т.п...

В общем, никто за это не возьмётся :)

KRoN73 ★★★★★
()
Ответ на: Сразу же: от Deleted

Данные передаются методом POST из предыдущего срипта авторизации там стоит htmlspecialchar, пароль хранится в БД в md5.

splinter ★★★★★
() автор топика
Ответ на: комментарий от KRoN73

Спасибо за понимание :-) я постараюсь навести порядок и голове и в коде. :-)

splinter ★★★★★
() автор топика
Ответ на: комментарий от KRoN73

так как отсутствует подключаемый файл mysql.php

require «mysql.php»;

БД:

| 1c_users              |
| admins                |
| image                 |
| journal               |
| moder                 |
| otvet                 |
| session               |
| test                  |
| users                 |
| vopros                |
+-----------------------+
mysql> describe journal;
+------------+-----------+------+-----+-------------------+----------------+
| Field      | Type      | Null | Key | Default           | Extra          |
+------------+-----------+------+-----+-------------------+----------------+
| id_journal | int(9)    | NO   | PRI | NULL              | auto_increment |
| id_otvet   | int(6)    | YES  |     | NULL              |                |
| id_user    | int(6)    | YES  |     | NULL              |                |
| timedate   | timestamp | NO   |     | CURRENT_TIMESTAMP |                |
| id_vopros  | int(6)    | YES  |     | NULL              |                |
| id_test    | int(2)    | YES  |     | NULL              |                |
| version    | int(11)   | YES  |     | NULL              |                |
+------------+-----------+------+-----+-------------------+----------------+
mysql> describe vopros;
+-----------+----------+------+-----+---------+----------------+
| Field     | Type     | Null | Key | Default | Extra          |
+-----------+----------+------+-----+---------+----------------+
| id_vopros | int(6)   | NO   | PRI | NULL    | auto_increment |
| id_test   | int(6)   | YES  |     | NULL    |                |
| vopros    | text     | YES  |     | NULL    |                |
| image     | tinytext | YES  |     | NULL    |                |
+-----------+----------+------+-----+---------+----------------+
mysql> describe otvet;
+-----------+------------+------+-----+---------+----------------+
| Field     | Type       | Null | Key | Default | Extra          |
+-----------+------------+------+-----+---------+----------------+
| id_otvet  | int(6)     | NO   | PRI | NULL    | auto_increment |
| id_vopros | int(6)     | YES  |     | NULL    |                |
| otvet     | tinytext   | YES  |     | NULL    |                |
| image     | tinytext   | YES  |     | NULL    |                |
| trues     | tinyint(1) | YES  |     | NULL    |                |
+-----------+------------+------+-----+---------+----------------+

splinter ★★★★★
() автор топика
Ответ на: комментарий от splinter

otvet и vopros в сочетании с user, image, version и пафосным id_ особенно доставляют. ))))

LamerOk ★★★★★
()
Ответ на: комментарий от splinter
$quest_user="select vopros,id_vopros from vopros where id_test=$id_test and id_vopros not in (select id_vopros from journal where id_user=$id and id_test=$id_test and version=$max_ver) LIMIT 1"; 
if ($max_kol[0]<=$max_row_user ) { 
    $quest_query=mysql_query($quest_user) or die('Error query podr' . mysql_error()); 
    // skipped
    if (isset($Sub)) { 
        $query="insert into journal(id_otvet,id_user,id_vopros,id_test,version) values ($radio,$id,$vopros,$id_test,$max_ver)"; 
        $query_exec=mysql_query($query) or die ('Error query_exec' . mysql_error());
        // ...
    }
} else {
    // ...
}

У тебя $quest_user вытаскивает вопросы, которые не хранятся в журнале, после чего ты подготавливаешь данные для html-формы и только после этого у тебя идет проверка isset($Sub) и запись в journal. Порядок действий ошибочен. Очевидно, что запись в журнал должна быть до выборки вопросов из БД, чтобы программа знала, что нужно исключить вопрос, ответ на который пришел только что.

tarcar
()
Ответ на: комментарий от tarcar

Спасибо Вам! попробую отпишусь.

splinter ★★★★★
() автор топика
Ответ на: комментарий от tarcar

Проблема в том что если его засунуть после isset($Sub) то первый раз форма не отрисуется :-( в отдельный скрипт выносить очень неохото :-(

splinter ★★★★★
() автор топика
Ответ на: комментарий от splinter

Самым простым, наверное, будет поставить редирект в ветке isset($Sub), но это неправильно. Впрочем, как раз в стиле всего остального кода.

tarcar
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.