Данный фаил показывает сданные преподавателю работы. При этом выборка работ делается из таблицы works, согласно предмету преподавателя, который выбирается из таблицы test и храниться в массиве, созданным session. Имя этого поля в таблице test - subj.
читать дальше <?php
// start session
session_start();
include('connection.php');
if (!$_SESSION['login'])
{
echo "<a href='./login.php'>Нужно войти</a>";
}
elseif (!in_array($_SESSION['userdata']['stat'], array("Директор", "Декан", "Мастер")))
{
echo "<a href='./login.php'>Доступ запрещен</a>";
}
else
{
$page_title = 'Проверка работ';
include('header.php');
/* PAGE CONTENT */
if ($_SESSION['userdata']['stat'] == "Директор")
{
$allworks = isset($_REQUEST['allworks']);
}
else
{
$allworks = FALSE;
}
$id = (int) $_REQUEST['id'];
if ($id)
{
// работа
$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 вывод работы */
}
}
else
{
$id = 0;
}
}
if (!$id)
{
// таблица
$subjcase = $allworks ? "" : "WHERE subject='" . mysql_escape_string($_SESSION['userdata']['subj']) . "'";
?><table cellspacing=2 cellpadding=0 width=100%>
<tr><td><b>Дата</b></td><td><b>Предмет</b></td><td><b>Работа</b></td><td><b>Пользователь</b></td><td><b>Статус</b></td><td><b>Баллы</b></td></tr>
<?php
// число работ
$count = mysql_fetch_assoc(mysql_query("SELECT COUNT(*) AS cnt FROM works $subjcase"));
// постраничная выборка
$mpp = 20;
$p = (int) $_REQUEST['page'];
$query = mysql_query("SELECT works.*, timetable.name AS lectionname FROM works LEFT JOIN timetable ON works.lection=timetable.id $subjcase ORDER BY time DESC LIMIT " . ($p * $mpp) . ", $mpp");
while ($row = mysql_fetch_assoc($query))
{
echo "<tr>";
echo "<td>" . date('d.m.Y H:i', $row['time']) . "</td>";
echo "<td>{$row['subject']}</td>";
echo "<td><a href='{$_SERVER['PHP_SELF']}?" . ($allworks ? "allworks&" : "") . "id={$row['id']}'>" . ($row['wmode'] == 1 ? $row['lectionname'] : $row['name']) . "</a></td>";
echo "<td>{$row['nick']}</td>";
echo "<td>{$row['stat']}</td>";
echo "<td>{$row['points']}</td>";
echo "</tr>";
}
?></table><center><a href='menu.php'>Веренуться в главное меню</a></center><?php
include('functioncount.php');
shownumerlist($p, $count['cnt'], $mpp, $_SERVER['PHP_SELF'] . "?" . ($allworks ? "allworks&" : ""));
}
/* END PAGE CONTENT */
include('footer.php');
}
?>
Я хочу переделать его так, чтобы предмет выбирался не из массива сессии $_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']}'";
Но это не дало желаемого результата. Подскажите пожалйста, что еще нужно исправить?
Спасибо
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");
Ок. Понятно
Но сейчас выдается такая ошибка
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))
Выведется ошибка mysql которая происходит.
Хотя данные в этой таблице есть, так как когда из сессии берется subj, работы отображаются.
Это надо было так сделать?
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)) {
}
Именно так я и делал
Query was empty
Для точности вставил ваш код, но результат тот-же
Вот тут - ORDER BY time DESC LIMIT " . ($p * $mpp) . ", $mpp;
Кавычку открыли, но не закрыли. Должно быть так:
Вот тут - ORDER BY time DESC LIMIT " . ($p * $mpp) . ", $mpp";
Ну в общем, ошибка в данном скрипте такая:
Unknown column 'work.subject' in 'IN/ALL/ANY subquery'
неизвестный столбец в таблице?
НО такого work.subject запроса нигде в коде нет -(
Вы наверное имели в виду:
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
Получаем -(: Warning: mysql_fetch_assoc(): Вы снова не внимательны:
Не while ($row = mysql_fetch_assoc($query)) , а while ($row = mysql_fetch_assoc($result))
Ок. Спасибо большое
А мне надо чательнее просматриватьк коды в будущем..)
То есть выглядит это так:
нажимаю на первую работу в списке
url меняется, получив id работы, а содержание страницы - нет:
Сама таблицы subjects выглядит так (История Магии - предмет по умолчанию, при переходе на ссылки работ по этому предмету все работает, а Кельтская Мифология - добавленный предмет):
Надо что-то здесь менять, или проблема совсем в другом?
if (isset($id)) {
echo 1;
} else {
echo 2;
}
и запросить url типа скрипт.php?id=1, то скрипт выведет 1, если в настройках php включен register_globals и 2, если выключен.
Это, я так понимаю, у самих хостеров спрашивать надо? Или можно как-то вручную проверить?
php_value register_globals 1
Это во-первых. А во-вторых, у теюя ошибка идет не из-за этого, поскольку проверяешь массив $_REQUEST. Я же сказал, что это просто одна из ВОЗМОЖНЫХ проблем, и описал в чем ее суть, чтобы ты смог САМ посмотреть есть она в твоем коде или нет. Не забывайте, что задача сообщества помогать в решении задач, а не решать задачи за вас. Если давать сразу готовый ответ - уровень внимательности к собственным действиям так и останется на прежнем уровне. А если ответ подразумевает дополнительный самостоятельный анализ своего творения - это уже принесет пользу, поскольку научит читать код. =)
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']; и следовательно должна выводиться форма проверки, или я это не так понимаю?
Место определил
else {
$id = 0;
То есть как я понял, если у работы нет id, то загружается исходная страница.
Но у тех работ, которые не получается вывести есть id, только мне не понятно почему скрипт их не получает.. В чем может быть причина этого?
Еще попробовал при $id = 0 выполнить те же действия, что и при $id
{
$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
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"));
Но не могу понять что. Есть варианты
bool(false)
Тип переменной не boolean? Хмм, а как это относиться к делу?
выбираем все колонки из works и колонку name из таблицы timetable как lectioname из таблицы works, устанавливаем зависимость timetable от works.
Хотя вот это не совсем понятно
works.id=$id $subjcase
Вообще что делает $_REQUEST?