Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Ответ 002 на задачу N 3
 
 автор: SoftTime   (05.02.2006 в 15:06)   письмо автору
 
 

Ответ 002 на задачу N 3.
С условиями задачи можно ознакомится по ссылке.
Файл index.php

<?

Error_Reporting 
(E_ALL & ~E_NOTICE); // убираем небольшие ошибки

function dates_tek () { // начало функции установки текущей даты
    
global $god;
    
$god=date("Y");
    
    global 
$mesac;
    
$mesac=date("m");
    
    global 
$day;
    
$day=date("d");
    
    global 
$chas;
    
$chas=date("H");
    
    global 
$minuta;
    
$minuta=date("i");
// конец функции

$error=false// переменная ошибки, если где-то она произойдёт, то запишется текущая дата

$file="date.txt"// файл хранеия даты
@$file_fopen=fopen($file,"r"); // открываем файл для чтения и записи (ошибка не выводиться)

if (!$file_fopen) { // если файла не существует то,
    
$error=true// устанавливаем ошибку
} else {
    @
$dates=fread($file_fopen,100); // если же он есть, то читаем из него информацию
}

/* информация в файле хранится в формате YYYY-MM-DD-HH-II
где: 
    YYYY - текуцщий год
    MM - текущий месяц
    DD - текущий день
    HH - текущий час
    II - текущая минута
    Соответственно, длина записи должна быть равна 16 
*/

if (strlen($dates)!==16) {
    
$error=true// есть ошибка
} else {
    
$dates_explode=explode("-",$dates); // разбиваем дату 
    
        
$god=$dates_explode[0];
        
$mesac=$dates_explode[1];
        
$day=$dates_explode[2];
        
$chas=$dates_explode[3];
        
$minuta=$dates_explode[4];
        
        
// начинается блок измерения длины отдельных элементов
        
if (strlen($god)!==4) {
        
$error=true;
        }
        
        if (
strlen($mesac)!==2) {
        
$error=true;
        }
        
        if (
strlen($day)!==2) {
        
$error=true;
        }
        
        if (
strlen($chas)!==2) {
            
$error=true;
        }
        
        if (
strlen($minuta)!==2) {
            
$error=true;
        }
        
}

// Теперь проверим, что бы все переменные были числовыми, а также на правилность введения даты и времени

if (!preg_match("|^[d]*$|",$god)) {
    
$error=true;
}

if (!
preg_match("|^[d]*$|",$mesac)) {
    
$error=true;
}

if (!
preg_match("|^[d]*$|",$day)) {
    
$error=true;
}

if (!
preg_match("|^[d]*$|",$chas)) {
    
$error=true;
}

if (!
preg_match("|^[d]*$|",$minuta)) {
    
$error=true;
}

if (
$mesac<or $mesac>12) {
    
$error=true;
}

if (
$chas<or $chas>23) {
    
$error=true;
}

if (
$minuta<or $minuta>59) {
    
$error=true;
}

// проверка дня у месяцев с 31 днем
if ($mesac==or $mesac==or $mesac==or $mesac==or $mesac==or $mesac==10 or $mesac==12) {
    if (
$day<or $day>31) {
        
$error=true;
    }
}

// теперь месяцы у которых 30 дней 
if ($mesac==or $mesac==or $mesac==or $mesac==11) {
    if (
$day<or $day>30) {
        
$error=true;
    }
}

// ну и наконец проверям второй месяц, с учётом высокосности годов 
$ost=$god%4// $ost - это остаток от деления
if ($ost==and $mesac==2) {
    if (
$day<or $day>29) {
    
$error=true;
    }
}
    
if (
$ost!==and $mesac==2) {
    if (
$day<or $day>28) {
    
$error=true;
    }
}

// усе :)

if ($error) { // если есть ошибки, то запускаем функцию текущей даты
dates_tek ();
}


?>
<html>

<head>
<title>Форма введения даты</title>
</head>

<body bgcolor="white" text="black">
<form name="form1" method="POST" action="handler.php">
<table cellpadding="0" cellspacing="0" width="100%">
    <tr>
        <td width="50%">
            <p align="right"><b>Год:</b></p>
        </td>
        <td width="50%">            
                <p><input type="text" name="god" value="<? echo $god?>" maxlength="4" ></p>          
        </td>
    </tr>
    <tr>
        <td width="50%">
            <p align="right"><b>Месяц:</b></p>
        </td>
        <td width="50%">
            <p><input type="text" name="mesac" value="<? echo $mesac?>" maxlength="2"></p>
        </td>
    </tr>
    <tr>
        <td width="50%">
            <p align="right"><b>День:</b></p>
        </td>
        <td width="50%">
            <p><input type="text" name="day" value="<? echo $day?>" maxlength="2"></p>
        </td>
    </tr>
    <tr>
        <td width="50%">
            <p align="right"><b>Час:</b></p>
        </td>
        <td width="50%">
            <p><input type="text" name="chas" value="<? echo $chas?>" maxlength="2"></p>
        </td>
    </tr>
    <tr>
        <td width="50%">
            <p align="right"><b>Минута:</b></p>
        </td>
        <td width="50%">
            <p><input type="text" name="minuta" value="<? echo $minuta?>" maxlength="2"></p>
        </td>
    </tr>
    <tr>
        <td width="100%" colspan="2">
            <p align="center"><input type="submit" value="Обработать дату"></p>
        </td>
    </tr>
</table>
</form>
</body>

</html>


Файл handler.php

<?
Error_Reporting
(E_ALL & ~E_NOTICE); // убираем ошибки

// достаём переменные
$god=$_POST['god'];
$mesac=$_POST['mesac'];
$day=$_POST['day'];
$chas=$_POST['chas'];
$minuta=$_POST['minuta'];

// удаляем ненужное
$god=htmlspecialchars(stripslashes(trim($god)));
$mesac=htmlspecialchars(stripslashes(trim($mesac)));
$day=htmlspecialchars(stripslashes(trim($day)));
$chas=htmlspecialchars(stripslashes(trim($chas)));
$minuta=htmlspecialchars(stripslashes(trim($minuta)));

$error=false// переменная ошибки, если она произойдёт, то запись не будет произведена
$error_msg="<ul>"// Сообщение об ошибки

// проверяем на пустоту

if (empty($god)) {
$error=true;
$error_msg=$error_msg."<li> Вы не ввели год";
}

if (empty(
$mesac)) {
$error=true;
$error_msg=$error_msg."<li> Вы не ввели месяц";
}

if (empty(
$day)) {
$error=true;
$error_msg=$error_msg."<li> Вы не ввели день";
}

if (empty(
$chas)) {
$error=true;
$error_msg=$error_msg."<li> Вы не ввели час";
}

if (empty(
$minuta)) {
$error=true;
$error_msg=$error_msg."<li> Вы не ввели минуты";
}

// Теперь проверям длину
if (strlen($god)!==4) {
$error=true;
$error_msg=$error_msg."<li> Вы не правильно ввели Год. Его формат YYYY";
}
        
if (
strlen($mesac)!==2) {
$error=true;
$error_msg=$error_msg."<li> Вы не правильно ввели Месяц. Его формат ММ";
}
        
if (
strlen($day)!==2) {
$error=true;
$error_msg=$error_msg."<li> Вы не правильно ввели День. Его формат DD";
}
        
if (
strlen($chas)!==2) {
$error=true;
$error_msg=$error_msg."<li> Вы не правильно ввели Час. Его формат CC";
}
        
if (
strlen($minuta)!==2) {
$error=true;
$error_msg=$error_msg."<li> Вы не правильно ввели минуты. Его формат MM";
}

// Теперь проверяем на правильность введения. Только цифры!
if (!preg_match("|^[d]*$|",$god)) {
$error=true;
$error_msg=$error_msg."<li> Вы не правильно ввели Год. Использовать можно только цифры";
}

if (!
preg_match("|^[d]*$|",$mesac)) {
$error=true;
$error_msg=$error_msg."<li> Вы не правильно ввели Месяц. Использовать можно только цифры";
}

if (!
preg_match("|^[d]*$|",$day)) {
$error=true;
$error_msg=$error_msg."<li> Вы не правильно ввели День. Использовать можно только цифры";
}

if (!
preg_match("|^[d]*$|",$chas)) {
$error=true;
$error_msg=$error_msg."<li> Вы не правильно ввели Час. Использовать можно только цифры";
}

if (!
preg_match("|^[d]*$|",$minuta)) {
$error=true;
$error_msg=$error_msg."<li> Вы не правильно ввели минуты. Использовать можно только цифры";
}

// Теперь проверяем введные числа в промежутках
if ($mesac<or $mesac>12) {
$error=true;
$error_msg=$error_msg."<li> Вы не правильно ввели месяц. Он должен быть в передалах от 01 до 12";
}

if (
$chas<or $chas>23) {
$error=true;
$error_msg=$error_msg."<li> Вы не правильно ввели час. Он должен быть в передалах от 00 до 23";
}

if (
$minuta<or $minuta>59) {
$error=true;
$error_msg=$error_msg."<li> Вы не правильно ввели минуты. Они должны быть в передалах от 00 до 59";
}

// Теперь месяцы
if ($mesac==or $mesac==or $mesac==or $mesac==or $mesac==or $mesac==10 or $mesac==12) {
    if (
$day<or $day>31) {
        
$error=true;
        
$error_msg=$error_msg."<li> Вы не правильно ввели число дней в месяце. Оно должно быть в промежутке от 01 до 31";
    }
}


if (
$mesac==or $mesac==or $mesac==or $mesac==11) {
    if (
$day<or $day>30) {
        
$error=true;
        
$error_msg=$error_msg."<li> Вы не правильно ввели число дней в месяце. Оно должно быть в промежутке от 01 до 30";
    }
}

// ну и наконец высокосные года
$ost=$god%4// $ost - это остаток от деления
if ($ost==and $mesac==2) {
    if (
$day<or $day>29) {
    
$error=true;
    
$error_msg=$error_msg."<li> Вы не правильно ввели число дней в месяце. Оно должно быть в промежутке от 01 до 29";
    }
}
    
if (
$ost!==and $mesac==2) {
    if (
$day<or $day>28) {
    
$error=true;
    
$error_msg=$error_msg."<li> Вы не правильно ввели число дней в месяце. Оно должно быть в промежутке от 01 до 28";
    }
}

// все
if ($error) {
echo 
"Во время обработки даты произошли следующие ошибки:".$error_msg."<br>";
echo 
"<a href=index.php>Вернуться к введению даты</a></p>";
} else {
$file="date.txt"// файл
$str=$god."-".$mesac."-".$day."-".$chas."-".$minuta// формируем строку
$file_fopen=fopen($file,"w+"); // открываем файл
fputs($file_fopen,$str); // записываем в него информацию
echo "<b><p align='center'>Спасибо, дата записана в файл</b><br>";
echo 
"<a href=index.php>Вернуться к введению даты</a></p>";
}

?>


http://www.softtime.ru/info/task.php?id_article=73

   
 
 автор: Artem S.   (06.02.2006 в 00:16)   письмо автору
 
   для: SoftTime   (05.02.2006 в 15:06)
 

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

ёпт.... я в шоке.
1. Обилие проверок впечетляет, но все они излишне. Нужно применить хотябы одну. Если уже используете регуляр. выражения, то можно было остановиться на них.
2. $error_msg не имеет в конце "</ul>", а это нарушение html кода.
3. Провеки в получении даты из файла также излишне, это источник которому можно доверять.

p.s. Этот пример наглядно показывает как из мухи сделать слона.

   
 
 автор: cheops   (06.02.2006 в 00:21)   письмо автору
 
   для: SoftTime   (05.02.2006 в 15:06)
 

Очень громоздко, почти на гране дозволенного. Компактный код - это не пустой звук, чем меньше код, тем меньше вероятность в нём ошибиться. А так первая попавшаяся дата (2006 02 06 00 19) приводит к
Во время обработки даты произошли следующие ошибки:
Вы не правильно ввели Год. Использовать можно только цифры
Вы не правильно ввели Месяц. Использовать можно только цифры
Вы не правильно ввели День. Использовать можно только цифры
Вы не правильно ввели Час. Использовать можно только цифры
Вы не правильно ввели минуты. Использовать можно только цифры

   
 
 автор: PantiL   (06.02.2006 в 22:17)   письмо автору
 
   для: cheops   (06.02.2006 в 00:21)
 

Скрипт не рабочий вообще
Даже ничего не вводя, шлем сегодняшнюю дату, которую предложил сам скрипт - ругается (см. пост выше)

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования