Программирование >>  Программный интерфейс приложений 

1 ... 140 141 142 [ 143 ] 144 145 146 ... 264


if (1(Sresult = mysql query (Squery)))

die ( Ошибка чтения таблицы password ); if (!(Srow = mysql fetch array (Sresult)))

return (FALSE); return ($row[ password ) == Spass); # значение TRUE, если

# пароль совпадает

Редактируемая форма отображает идентификатор члена Исторической Лиги как нередактируемый текст, так как его изменять не требуется. Для обычных членов дата истечения срока тоже выводится как нередактируемый текст, так как простым членам нельзя давать возможность вносить изменения в это поле. Вносить изменения в это поле можно только администратору, позволяя секретарю Исторической Лиги обновлять дату возобновления членства.

Столбцы записи таблицы member отображаются с помощью функции display column (). Она добавляет столбцы в редактируемую форму как редактируемый текст в соответствии со значением третьего аргумента:

# Вывести на экран столбец записи члена Исторической Лиги . Slabel -это метка,

# которая отображается для пользователя. Srow - массив, в котором

# сохраняются элементы записи. $col name - имя столбца в записи.

# Svalue - значение столбца. Seditable - не равно нулю,

# если пользователю можно производить изменения.

# В противном случае значение выводится как нередактируемый текст.

# Имена полей выводятся как row[col name), таким образом,

# когда форма подтверждается, значения можно получить из массива,

# а не из набора отдельных переменных.

function display column (Slabel, Srow, $col name, Seditable) {

print { <TR>\n );

printf ( <TD>%s</TD>\n , htmlspecialchars (Slabel));

Svalue = htmlspecialchars (Srow[$col namel);

if (Seditable) # вывести как редактируемое поле

Sstr = sprintf ( <INPUT TYPE=text NAME=\ row[%s]\ , Scol name);

Sstr .= sprintf ( VALUE=\ %s\ SIZE=\ 80\ >\n , Svalue);

else # вывести как нередактируемый текст

Sstr = Svalue; printf ( <TD>%s</TD>\n , Sstr); print ( </TR>\n );

Функция display entry 0 включает значения member id и password в виде скрьпых полей таким образом, чтобы они переносились к следующему вызову сценария editscript.php после заверщения редактирования записи. Это позволит проверять идентификатор автоматически без повторного запроса. (Обратите внимание на то, что нащ простейший метод аутентификации передает пароль туда-обратно в текстовом виде. Вообще-то, это не самое лучшее решение, но, принимая во внимание то, что создание Web-узла



Исторической Лиги нельзя назвать задачей, требующей мощной степени ащиты, этот метод вполне нас удовлетворяет. Вероятно, для решения задач рутого рода требуются более серьезные меры защиты (как, например, для 1Ыполнения финансовых проводок). Как бы там ни было, функция, моди-эицирующая запись, будет вьилядеть следуюшим образом.

unction update entry{)

lobal $row, $meraber id, $password; $meraber id = trim ($member id); If (empty ($member id)!

die ( Идентификатор не определен ); if (lereg ( [0-9]+$ , $member id)) # должно быть целым

die ( Задан ошибочный идентификатор (должно быть целым) ); if ( ! checlc pass ($member id, $password) ss !checlc pass (0, Spassword)) die ( Ошибочный пароль );

# Сначала нам нужен результирующий набор

# для определения возможности

# хранения пустых значений в столбцах таблицы member

# Вот запрос, позволяющий сделать вообще это без выборки строк Sresult = mysql query ( SELECT * FROIXI member WHERE 1 =0 );

if (ISresult)

die ( Невозможно сделать запрос к таблице member );

# просмотрим каждое поле в форме для создания с

# помощью содержащихся в них значений оператора UPDATE.

Squery = UPDATE member ;

Sdelim = SET ; # перед первым столбцом поместим SET ,

# а перед последующими - ,

while (list (Scol name, Sval) = each (Srow)) {

Squery .= Sdelim Scol name = ; Sdelim = , ;

# если значения нет, присвоить значение NULL, если

# столбец может содержать значения NULL. Это позволит

# предотвратить попытку присвоить пустое значение

# пустое значение в столбец expiration, когда

# значение должно быть NULL,

# например.

Sval = trim (Sval); if (empty (Sval) ) {

if (nullable (Sresult, Scol name))

Squery .= NULL ; # ввести NULL

else

Squery .= \ \ ; # ввести пустую строку

else

Squery .= \ . addslashes (Sval) . \ ;

Squery .= WHERE member id = $member id ; if (mysql query (Squery) SS mysql affected rows () > 0) print ( Запись модифицирована успешно.\n );



else

print ( Запись не модифицирована.\n );

Сначала перепроверим пароль, чтобы удостовериться, что никто не пытается обмануть нас с помощью поддельной формы при модификации записи. Модификацию нужно производить с особой тщательностью и осторожностью, поскольку, когда запись не заполнена, это может означать, что там может быть как значение NULL , так и пустая строка. Столбец expiration может являться примером такого столбца. Значение NULL в поле, хранящем дату истечения срока членства, применяется для хранения данных о пожизненном членстве . Вставка пустой строки приведет к присвоению значения 0000-00-00 , что означает лищение пожизненного членства.

Для решения этой проблемы просмотрим метаданные для данного столбца и проверим, как он был объявлен: как принимающий значения NULL или как NOT NULL . Эту информацию можно просмотреть с помощью функции mysql f etch f ield (). К сожалению, она просматривает столбцы по цифровому индексу. Гораздо удобнее обратиться к столбцам таблицы member по имени. Напишем для этого специальную функцию nullableO. Она берет имя столбца и по нему ищет соответствующий объект в метаданных:

# Определение, может ли столбец с заданным именем в результирующем

# наборе принимать значения NULL.

function nullable (Sresult, Scol name) {

for (Si = 0; Si < mysql num fields (Sresult); Si++) {

if (!(Sfld = mysql fetch field (Sresult, Si)))

continue; if ($fld->nanie == $col nanie)

return (!$fld->not null);

return (0);

Для работы функции mysql f etch f ield () требуется идентификатор результирующего набора таблицы, столбцы которой мы проверяем. Его можно получить с помощью тривиального запроса SELECT, который не возвращает строк. Запрос возвращает пустой результирующий набор, но этого вполне достаточно для получения метаданных, которые будут использованы для определения возможности хранения значений NULL В столбцах таблицы:

SELECT * FROM member WHERE 1=0

Вот и все. Установите сценарий, раздайте членам Исторической Лиги их пароли, и у них появится возможность обновлять свои учетные записи в интерактивном режиме.



1 ... 140 141 142 [ 143 ] 144 145 146 ... 264

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика