|
Программирование >> Программный интерфейс приложений
$row[ score ] ); display cell ( TD , $col val, 0); print ( </TR>\n ); print ( </TABLE>\n ); print ( <BR>\n ); print ( <INPUT TYPE=\ submit \ NAME=\ button\ VALUE=\ Submit\ >\n ) ; print </FORM>\n ; Запрос, использованный в функции displayscores () для выборки информации об оценках для определенного экзамена, не является простым объединением таблиц. Прежде всего потому, что он не выбрал бы ни одной строки по студенту, не имеющему оценки за экзамен. В частности, для нового экзамена объединение не выберет экзамена, и у нас получится пустая форма ввода данных! Для того чтобы выборка производилась для всех учащихся, воспользуемся объединением типа LEFT JOIN (объединение слева). База запроса аналогична той, в соответствии с которой производилась выборка в разделе Проверка отсутствующих значений в таблице главы 3, Синтаксис и использование языка SQL . Тот запрос выбирал только отсутствующие результаты, здесь мы выбираем только результаты соответствующих экзаменов. Результаты закодированы в формате именованных полей вида score [п], где п является значением student id. После этого форма отсылается обратно на Web-сервер, язык РНР преобразует эти поля в элементы массива $ score. Данные формы можно получить из этого массива. Когда завершен ввод или редактирование оценок и форма выпущена, сценарий score entry.php вызывается с действием ENTER SCORES. В результате запускается вызов функции enter scores () для обработки вве-дершой информации. function enter scores () { global $score, $event id; $invalid = 0; $blank = 0; $nonblank = 0; while (list ($student id, $newscore) = each ($score)) { $newscore = trim ($newscore); if (empty (Snewscore)) # нет оценки, удалить, # если присутствует в таблице ++$Ыапк; $query = DELETE FROM score . WHERE event id = $event id . AND student id = $student id ; else if (ereg ( [0-9]+$ , Snewscore)) # должен быть целым { ++$nonblank; Squery = REPLACE INTO score else (event id, student id, score) . VALUES($event id,$student id,Snewscore) ++$invalid; continue; } if (!mysql query (Squery)) die ( ошибка ввода оценки, идентификатор экзамена $event id, идентификатор учащегося $student id ); printf ( Введено оценок: %d<BR>\n , Snonblank); printf ( Отсутствует оценок: %d<BR>\n , $Ыапк) ; printf ( Ошибочных оценок: %d<BR>\n , $invalid) ; print ( <BR>\n ); Значения идентификаторов учащихся и соответствующие им оценки получены с помощью просмотра массива $score. Оценки обрабатываются следующим образом. Оценка пустая и вводить нечего. Но при этом удаляется прежняя оценка, если она существовала. (Возможно, она была раньше ошибочно введена, например, для учащегося, который в действительности на экзамене отсутствовал.) Оценка не пустая. В этом случае производится некая элементарная проверка значения. С помошью функции trimO отсекаются ведущие и замыкающие пробелы. Результат считается допустимым, если эта функция возвращает пустое или целое значение. Однако вводимые в форму значения всегда кодируются как строки, поэтому их нельзя проверить с помощью функций islongO или is int О. Эти функции вернут значение false , даже если значение содержит только цифры. В этом случае лучше работает проверка на соответствие шаблону. Вот проверка, возвращающая значение true , когда все символы строки от начала до конца строки являются цифрами: ereg ( [0-9]+$ , $str) Если оценка прошла все проверки, ее можно добавить в таблицу score. В приведенном здесь примере используется оператор replace, а не insert. Вот задачи сценария score entry.ptip. Ввод оценок и их исправление теперь можно производить с Web-броузера. Одним совершенно очевидным недостатком является пробел в системе безопасности, так как любой может подключиться к Web-узлу и внести свои исправления в оценки. Сценарий, который будет позднее создан нами для редактирования записей Исторической Лиги , будет снабжен простейшей системой авторизации доступа, которую можно применить в этом сценарии. Более сложную аутентификацию доступа можно осуществить с помощью пакета phplib. Викторина Президенты США Одна из целей создания Web-узла Исторической Лиги - создание интерактивной викторины наподобие того, что публикует Лига в разделе для детей своего информационного бюллетеня Chronicles of US Past ( Хроника прошлого США ). У нас уже есть таблица president, содержащая информацию о президентах США. Ею можно воспользоваться в качестве источника данных для викторины. Для этого напишем сценарий pres quiz.php. Основная идея заключается в выборе президента в произвольном порядке, формулировании вопроса, касающегося этого президента, ожидании ответа от пользователя, после чего происходит проверка правильности ответа. Для простоты ограничимся вопросом о месте рождения президента. Еще одним способом упрощения является представление вопросов в формате многоальтернативного выбора. Это проще для тех пользователей, которым требуется только сделать выбор из набора вариантов, а не вводить определенный ответ. Это проще и для нас потому, что в этом случае не нужен какой-то специальный анализ того, что может ввести пользователь. Нам будет достаточно простого сравнения выбора, сделанного пользователем, и искомого значения. Сценарий, который осуществляет эту викторину, выполняет две задачи. Первая: для первоначального его вызова он должен создать и отобразить новый вопрос на основании информации из таблицы president. Вторая: если сценарий был вызван после ответа пользователя, ответ необходимо проверить и дать знать пользователю о том, был он верным или нет. Если да, то сценарий должен вывести новый вопрос. Если в ответе содержится ошибка, вопрос следует повторить. Для генерирования вопросов воспользуемся возможностью, которая появилась в MySQL 3.23. Это - order BY rand (). Эта фунющя позволяет производить выборку строк из таблицы в произвольном порядке. Например, для того, чтобы выбрать произвольное имя президента и дату его рождения, необходимо сделать запрос: SELECT CONCAT(first name, , last name) AS name, CONCAT(city, , , state) AS place FROM president ORDER BY RAND() LIMIT 1 Это будет имя президента и его место рождения, которые являются правильными ответами на вопрос Где родился этот президент? Кроме того, для того, чтобы запутать пользователя, нам необходимо предусмотреть несколько неправильных ответов. Для этого воспользуемся аналогичным запросом: SELECT DISTINCT CONCAT(city, , , state) AS place FROM president ORDER BY RAND() Выберем из этого запроса четыре значения, отличающиеся от правильного ответа. Функция, генерирующая эти запросы и анализирующая результаты, выглядит следующим образом:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |