A kid from The Ural's
Данный фаил показывает сданные преподавателю работы. При этом выборка работ делается из таблицы works, согласно предмету преподавателя, который выбирается из таблицы test и храниться в массиве, созданным session. Имя этого поля в таблице test - subj.

читать дальше

Я хочу переделать его так, чтобы предмет выбирался не из массива сессии $_SESSION['userdata']['subj'], , а из таблицы subjects. Так как преподаватель может иметь больше одного активного предмета. В таком случае скрипт бы показывал работы по всем сданным предметам из subjects. Для этого поменял эту часть кода
$subjcase = $allworks ? "" : "AND subject='" . mysql_escape_string($_SESSION['userdata']['subj']) . "'";
на следующую
$result2 = mysql_query("SELECT * FROM subjects WHERE nick = '" . mysql_escape_string($_SESSION['userdata']['nick']) . "'");
$row2 = mysql_fetch_assoc($result2);
$subjcase = $allworks ? "" : "AND subject='{$row2['subj']}'";
Но это не дало желаемого результата. Подскажите пожалйста, что еще нужно исправить?
Спасибо

@темы: MySQL, PHP

Комментарии
19.03.2008 в 16:32

Будем же учиться хорошо мыслить - вот основной принцип морали (с) Паскаль
$query = mysql_query("SELECT works.*, timetable.name AS lectionname FROM works
LEFT JOIN timetable ON works.lection=timetable.id
WHERE work.subject IN (SELECT subj FROM subjects
WHERE nick = '".mysql_escape_string($_SESSION['userdata']['nick'])."' )
ORDER BY time DESC LIMIT LIMIT " . ($p * $mpp) . ", $mpp");
19.03.2008 в 16:48

A kid from The Ural's
FVA

Ок. Понятно

Но сейчас выдается такая ошибка
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in /home/g/gviragonru/public_html/checkwork2.php on line 114
114 это: while ($row = mysql_fetch_assoc($query))

19.03.2008 в 16:59

Будем же учиться хорошо мыслить - вот основной принцип морали (с) Паскаль
$query = mysql_query(...) or die(mysql_error());
Выведется ошибка mysql которая происходит.
19.03.2008 в 17:10

A kid from The Ural's
Query was empty
Хотя данные в этой таблице есть, так как когда из сессии берется subj, работы отображаются.
19.03.2008 в 18:37

Будем же учиться хорошо мыслить - вот основной принцип морали (с) Паскаль
Query was empty - это ошибка возвращается когда отправляется пустой запрос. То есть если вызвать mysql_query(""); . Дословно - запрос был пустой.
19.03.2008 в 19:53

A kid from The Ural's
$result3 = mysql_query($query) or die(mysql_error()); я вызывал используя переменную $query в которую и сохраняется выборка.
Это надо было так сделать? :)
19.03.2008 в 20:06

Будем же учиться хорошо мыслить - вот основной принцип морали (с) Паскаль
$query = "SELECT works.*, timetable.name AS lectionname FROM works
LEFT JOIN timetable ON works.lection=timetable.id
WHERE work.subject IN (SELECT subj FROM subjects
WHERE nick = '".mysql_escape_string($_SESSION['userdata']['nick'])."' )
ORDER BY time DESC LIMIT " . ($p * $mpp) . ", $mpp;

$result = mysql_query($query) or die(mysql_error());

while ($row = mysql_fetch_assoc($result)) {
}
19.03.2008 в 20:21

A kid from The Ural's
FVA

Именно так я и делал :)
Query was empty
Для точности вставил ваш код, но результат тот-же :(
19.03.2008 в 21:03

Будем же учиться хорошо мыслить - вот основной принцип морали (с) Паскаль
Kevin McLean Потому что у нас ошибка синтаксиса получается. =)
Вот тут - ORDER BY time DESC LIMIT " . ($p * $mpp) . ", $mpp;
Кавычку открыли, но не закрыли. Должно быть так:
Вот тут - ORDER BY time DESC LIMIT " . ($p * $mpp) . ", $mpp";
19.03.2008 в 22:04

A kid from The Ural's
О.. кавычки - это зло, в 90% всегда ошибка из-за этого :)
Ну в общем, ошибка в данном скрипте такая:
Unknown column 'work.subject' in 'IN/ALL/ANY subquery'
неизвестный столбец в таблице?
НО такого work.subject запроса нигде в коде нет -(
19.03.2008 в 22:07

Будем же учиться хорошо мыслить - вот основной принцип морали (с) Паскаль
WHERE work.subject IN =) Следите за моими опечатками. =) У меня сегодня их очень много =/
19.03.2008 в 22:40

A kid from The Ural's
FVA
Вы наверное имели в виду:
WHERE works.subject IN (SELECT subj FROM subjects ?

Полностью вся выборка:
$query = "SELECT works.*, timetable.name AS lectionname FROM works
LEFT JOIN timetable ON works.lection=timetable.id
WHERE works.subject IN (SELECT subj FROM subjects
WHERE nick = '".mysql_escape_string($_SESSION['userdata']['nick'])."' )
ORDER BY time DESC LIMIT " . ($p * $mpp) . ", $mpp";
$result = mysql_query($query) or die(mysql_error());
while ($row = mysql_fetch_assoc($query)) {

Получаем -(:
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in /home/g/gviragonru/public_html/checkwork2.php on line 115

19.03.2008 в 22:47

Будем же учиться хорошо мыслить - вот основной принцип морали (с) Паскаль
WHERE works.subject Именно.

Получаем -(: Warning: mysql_fetch_assoc(): Вы снова не внимательны:

Не while ($row = mysql_fetch_assoc($query)) , а while ($row = mysql_fetch_assoc($result))
20.03.2008 в 19:37

A kid from The Ural's
FVA
Ок. Спасибо большое :) работает.
А мне надо чательнее просматриватьк коды в будущем..)
20.03.2008 в 20:14

A kid from The Ural's
Но теперь возникла какая-то проблема с переходам по ссылкам. При нажатии на ссылку работы по тому предмету, которого нет в test, и который вручную был добавлен в БД, просто перезагружается страница, и не происходит перехода на форму выставления оценок.
То есть выглядит это так:


нажимаю на первую работу в списке


url меняется, получив id работы, а содержание страницы - нет:


Сама таблицы subjects выглядит так (История Магии - предмет по умолчанию, при переходе на ссылки работ по этому предмету все работает, а Кельтская Мифология - добавленный предмет):



Надо что-то здесь менять, или проблема совсем в другом?
 echo "<td><a href='{$_SERVER['PHP_SELF']}?" . ($allworks ? "allworks&" : "") . "id={$row['id']}'>" . ($row['wmode'] == 1 ? $row['lectionname'] : $row['name']) . "</a></td>";



20.03.2008 в 21:14

Будем же учиться хорошо мыслить - вот основной принцип морали (с) Паскаль
Если при смене урл и передаче параметра содержание не менятся - проблеме в разветвлении на которм происходит проверка параметра. Например, если написать
if (isset($id)) {
echo 1;
} else {
echo 2;
}
и запросить url типа скрипт.php?id=1, то скрипт выведет 1, если в настройках php включен register_globals и 2, если выключен.
21.03.2008 в 15:12

A kid from The Ural's
То есть надо проверить включен register_globals или нет?
21.03.2008 в 17:57

Будем же учиться хорошо мыслить - вот основной принцип морали (с) Паскаль
Kevin McLean То есть надо проверить как проверяется наличие входящих параметров и почему не срабаотывает - причины бывают разные, я просто привел одну из них.
22.03.2008 в 09:33

A kid from The Ural's
FVA

Это, я так понимаю, у самих хостеров спрашивать надо? Или можно как-то вручную проверить?
22.03.2008 в 10:07

Будем же учиться хорошо мыслить - вот основной принцип морали (с) Паскаль
Что касается register_globals, то его можно включить в .htaccess файле,
php_value register_globals 1
Это во-первых. А во-вторых, у теюя ошибка идет не из-за этого, поскольку проверяешь массив $_REQUEST. Я же сказал, что это просто одна из ВОЗМОЖНЫХ проблем, и описал в чем ее суть, чтобы ты смог САМ посмотреть есть она в твоем коде или нет. Не забывайте, что задача сообщества помогать в решении задач, а не решать задачи за вас. Если давать сразу готовый ответ - уровень внимательности к собственным действиям так и останется на прежнем уровне. А если ответ подразумевает дополнительный самостоятельный анализ своего творения - это уже принесет пользу, поскольку научит читать код. =)
22.03.2008 в 14:39

A kid from The Ural's
Пробежался по коду. Нашел вот неправильную выборку, где subj снова выбирается из test, и храниться в сессии
if (!$id) > {
// таблица $subjcase = $allworks ? "" : "WHERE subject='" . mysql_escape_string($_SESSION['userdata']['subj']) . "'"
Поменял
$result2 = mysql_query("SELECT * FROM subjects WHERE nick = '" . mysql_escape_string($_SESSION['userdata']['nick']) . "'");
$row2 = mysql_fetch_assoc($result2);
$subjcase = $allworks ? "" : "WHERE subject='{$row2['subj']}'";
Далее, если
$id = (int) $_REQUEST['id'];
То выводиться форма проверки
если $id = 0;
То нмчего
И если
}
if (!$id) то по идеи все работы, которые вообще есть в таблице (но для этого чуть надо выборку изменить)
Но ведь, работы по второму предмету это как раз $id = (int) $_REQUEST['id']; и следовательно должна выводиться форма проверки, или я это не так понимаю?

22.03.2008 в 21:53

Будем же учиться хорошо мыслить - вот основной принцип морали (с) Паскаль
Kevin McLean Если анализ кода не позволил выяснить причину неработоспособности системы, есть замечательный способ найти место в котором происходит сбой - поочередно в каждый важный шаг алгоритма вставляя echo 1;
23.03.2008 в 20:03

A kid from The Ural's
FVA

Место определил
else {
$id = 0;


То есть как я понял, если у работы нет id, то загружается исходная страница.

Но у тех работ, которые не получается вывести есть id, только мне не понятно почему скрипт их не получает.. В чем может быть причина этого?

Еще попробовал при $id = 0 выполнить те же действия, что и при $id
  else
         {
            $id = 0;
 // работа
         $subjcase = $allworks ? "" : "AND subject='" . mysql_escape_string($_SESSION['userdata']['subj']) . "'";
         $row = mysql_fetch_assoc(mysql_query("SELECT works.*, timetable.name AS lectionname FROM works LEFT JOIN timetable ON works.lection=timetable.id WHERE works.id=$id $subjcase LIMIT 2"));
         if ($row)
         {   $row["nick"]; 
            switch($_REQUEST['what'])
            {
               case 'mark':
                  mysql_query("UPDATE works SET points=" . ((int) $_POST['mark']) . ", comment='{$_POST['comment']}', stat='Проверена' WHERE id=$id LIMIT 1");
                  mysql_query("UPDATE test SET points = points + " . ((int) $_POST['mark']) . " WHERE nick = '".$row["nick"]."'");
                  echo "<center><span style='color: green; font-weight: bold;'>Работа оценена.</span><br><a href='menu.php'>Веренуться в главное меню</a><br><a href='checkwork.php'>Вернуться к списку работ</a></center>";
                  break;
                 
               case 'reject':
//                  mysql_query("UPDATE works SET rejectcomment='{$_POST['rejectcomment']}', stat='Отклонена' WHERE id=$id LIMIT 1");
                  $work = mysql_fetch_assoc(mysql_query("SELECT * FROM works WHERE id=$id LIMIT 1"));
                  mysql_query("DELETE FROM works WHERE id=$id LIMIT 1");
                  $user = mysql_fetch_assoc(mysql_query("SELECT email FROM test WHERE nick='" . mysql_escape_string($work['nick']) . "' LIMIT 1"));
                  mail($user['email'], "=?koi8-r?B?" . base64_encode(convert_cyr_string("Ваша работа была отклонена", "w", "k")) . "?=", convert_cyr_string(
                           "Ваша работа была отклонена. Причина отклонения:<br><br><i>" . nl2br(htmlspecialchars(stripslashes($_POST['rejectcomment']), ENT_QUOTES)) . "</i>"
                           . "<br><br>{$work['workcomp']}"
                           ,
                        "w", "k"),
                        "From: ... <[email protected]>\r\nContent-Type: text/html; charset=koi8-r");
                  echo "<center><span style='color: green; font-weight: bold;'>Работа отклонена.</span><a href='menu.php'>Веренуться в главное меню</a><br><a href='checkwork.php'>Вернуться к списку работ</a></center>";
                  break;
                 
               default:
                  /* вывод работы */
                  echo "<center>Предмет: <b>{$row['subject']}</b><br>";
                  if ($row['wmode'] == 1)
                  {
                     echo "Лекция: <b>{$row['lectionname']}</b>";
                  }
                  else
                  {
                     echo "Дополнительная работа по предмету";
                  }
                  echo "<br><br>Отправлена: <b>{$row['nick']}</b> " . date('d.m.Y H:i', $row['time']) . "<br><br>";
                  echo "<h1>{$row['name']}</h1>";
                  echo "<br><br>{$row['workcomp']}";
                 
                  echo "<form action='{$_SERVER['PHP_SELF']}' method='post'>";
                  echo "<input type=hidden name=id value=$id><input type=hidden name=what id=what value=nothing>";
                  if ($allworks) echo "<input type=hidden name=allworks value=1>";
                  echo "<b>Поставить оценку: <select name=mark>";
                  for ($i = 0; $i < 13; $i++) echo "<option value='$i'>$i</option>";
                  echo "</select><br><br>";
                  echo "Комментарий к работе:<br><textarea name=comment></textarea><br><br>";
                  echo "<input type=submit value='Оценить работу' 'document.getElementById(\"what\").value=\"mark\";'><br><br>";
                  echo "Комментарий к отклонению:<br><textarea name=rejectcomment></textarea><br><br>";
                  echo "<input type=submit value='Отклонить работу' 'document.getElementById(\"what\").value=\"reject\";'><br><br>";
                  echo "</form><a href='menu.php'>Веренуться в главное меню</a><br><a href='checkwork.php'>Вернуться к списку работ</a></center>";
                  /* END вывод работы */
            }
         }
      }



Получаю
Parse error: syntax error, unexpected $end in /home/g/gviragonru/public_html/checkwork2.php on line 187



23.03.2008 в 20:53

A kid from The Ural's
Чуть облегчил код
if ($id || $id == 0)
теперь получается открыть страницу по предмету, но она пустая. И это понятно, так как id пустое
Делаю вывод, что в выборке что то не так, а именно
$row = mysql_fetch_assoc(mysql_query("SELECT works.*, timetable.name AS lectionname FROM works LEFT JOIN timetable ON works.lection=timetable.id WHERE works.id=$id $subjcase LIMIT 2"));
Но не могу понять что. Есть варианты :)?
23.03.2008 в 21:10

Будем же учиться хорошо мыслить - вот основной принцип морали (с) Паскаль
var_dump($row); и смотри что не так. =)
26.03.2008 в 08:48

A kid from The Ural's
FVA

bool(false)

Тип переменной не boolean? Хмм, а как это относиться к делу? :)
26.03.2008 в 15:39

Будем же учиться хорошо мыслить - вот основной принцип морали (с) Паскаль
Kevin McLean Это значит что функция mysql_fetch_assoc не была выполнена. Разбирай свою конструкцию функция в функции и проверяй результаты каждого действия. =)
26.03.2008 в 21:57

A kid from The Ural's
Если, честно я в этом запросе никакой ошибки не вижу
выбираем все колонки из works и колонку name из таблицы timetable как lectioname из таблицы works, устанавливаем зависимость timetable от works.
Хотя вот это не совсем понятно
works.id=$id $subjcase
Вообще что делает $_REQUEST?
27.03.2008 в 16:22

A kid from The Ural's
Понятно, что эта переменная требует id, но из какого массива она его берет?
30.03.2008 в 21:20

A kid from The Ural's
А все, разобрался :) Работает

Расширенная форма

Редактировать

Подписаться на новые комментарии
Получать уведомления о новых комментариях на E-mail