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

Форум PHP

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

 

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

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

тема: Не могу с if else разобратся :(
 
 автор: TrEK   (06.02.2011 в 13:05)   письмо автору
 
 

Подскажите пожалуйста по поводу пустого $_POST , при стартовом открытии странички.

Чтоб эта проверка
if (empty($_POST['month'])) 
{$_POST['month']=$curr_m;} 
else 
{$_POST['month']=$_POST['month'];}


вместе с этой работала:
if (empty($_POST['year'])) 
{$_POST['year']=$curr_m;} 
else 
{$_POST['year']=$_POST['year'];}

  Ответить  
 
 автор: sim5   (06.02.2011 в 13:11)   письмо автору
 
   для: TrEK   (06.02.2011 в 13:05)
 

Вместе с этой это как? Да и вообще, удобнее такое условной операцией (тернарной) делать, вы с ней знакомы, по крайней мере в вашем коде она есть.

  Ответить  
 
 автор: TrEK   (06.02.2011 в 13:14)   письмо автору
 
   для: sim5   (06.02.2011 в 13:11)
 

Вместе , это чтоб:


вместо
<?php
if (ЧТО-ТО1) {делаем1;} else {делаем2;}
if (
ЧТО-ТО2) {делаем1;} else {делаем2;}
?>


было
<?php
if (ЧТО-ТО1 AND ЧТО-ТО2) {делаем1;} else {делаем2;}
?>

  Ответить  
 
 автор: sim5   (06.02.2011 в 13:16)   письмо автору
 
   для: TrEK   (06.02.2011 в 13:14)
 

Так в чем тогда проблема? Подставляйте эти переменные в условие и действуйте. Вот только надо проверять скорее всего не так, а на 0 после intval, мне так кажется ;-)

  Ответить  
 
 автор: TrEK   (06.02.2011 в 13:16)   письмо автору
 
   для: sim5   (06.02.2011 в 13:11)
 

Простите, может она и есть, но я не знаю что она так называется :)

  Ответить  
 
 автор: sim5   (06.02.2011 в 13:18)   письмо автору
 
   для: TrEK   (06.02.2011 в 13:16)
 

Нет это не она, она это: a ? b : c.

  Ответить  
 
 автор: cheops   (06.02.2011 в 13:12)   письмо автору
 
   для: TrEK   (06.02.2011 в 13:05)
 

Лучше используйте вместо массива $_POST свой собственный массив или отдельные переменные, т.е. как-то так
<?php
  $curr_m 
1;
  
$curr_y 2011;
  if(!empty(
$_POST['month'])) $curr_m intval($_POST['month']);
  if(!empty(
$_POST['year'])) $curr_y intval($_POST['year']);
?>

А далее подставляйте $curr_m и $curr_y в запрос.

  Ответить  
 
 автор: TrEK   (06.02.2011 в 13:26)   письмо автору
 
   для: cheops   (06.02.2011 в 13:12)
 

<?php
!empty($_POST['month'])
?>


А это означает ОТСУТСТВИЕ ЗАПРОСА, или ЕСЛИ ЗАПРОС НЕ ПУСТОЙ?

  Ответить  
 
 автор: daniladiez   (06.02.2011 в 13:29)   письмо автору
 
   для: TrEK   (06.02.2011 в 13:26)
 

я обычно делаю так -

if (isset($_POST) AND count($_POST)){
   // действия над отправленными данными 
}

  Ответить  
 
 автор: TrEK   (06.02.2011 в 13:34)   письмо автору
 
   для: daniladiez   (06.02.2011 в 13:29)
 

Мне надо условие,

Если $_POST['month'] и $_POST['year'] одновременно пусты (в случае первоначального открытия странички) - $_POST['month'] и $_POST['year'], которые вставляются в SQL-запрос были равны $curr_m и $curr_y (текущий месяц и год).

Чтоб даже при первоначальном открытии был вывод из БД.

  Ответить  
 
 автор: sim5   (06.02.2011 в 13:36)   письмо автору
 
   для: TrEK   (06.02.2011 в 13:34)
 

А может не одновременно, а любое из них? К тому же, повторяю еще раз - вам надо не просто непустое, а значения после intval не равые 0. Зачем понапрасну гонять базу, если над вами шутят?

  Ответить  
 
 автор: TrEK   (06.02.2011 в 13:47)   письмо автору
 
   для: sim5   (06.02.2011 в 13:36)
 

Ну вообще-то да, если любое из $_POST[] иммет пустое значение - тогда :


<?php
[b]$_POST['month']=$curr_m 
AND 
$_POST['year']=$curr_m[/b]
?>

  Ответить  
 
 автор: sim5   (06.02.2011 в 13:52)   письмо автору
 
   для: TrEK   (06.02.2011 в 13:47)
 

Насколько помнится, то вам при загрузке страницы и отсутствия запросов (или ложных запросов) нужно передать в запрос текущую дату. Ложный запрос, это подделка вашей формы, как-то подставить в sql-запрос инъекцию. С этой целью вы и проделываете над входными переменными этот фокус - intval. Если вас "прощупывают", то значит после intval вы обязательно получите 0. Вопрос - что в этом случае должно быть запросом в базе, 0 или все таки текущий год и месяц?

  Ответить  
 
 автор: TrEK   (06.02.2011 в 14:02)   письмо автору
 
   для: sim5   (06.02.2011 в 13:52)
 

Ну мне надо вывод списка за текущий месяц и год.

Тоесть при отсутствии POST (при пустом) - запрос в БД по текущему месяцу и году.

А вот если уже в форме выбрать год и месяц,- тогда чтоб запрос в БД был по выбраным POST

  Ответить  
 
 автор: sim5   (06.02.2011 в 14:08)   письмо автору
 
   для: TrEK   (06.02.2011 в 14:02)
 

Ну с первым понято, достаточно проверить массив $_POST на пустоту, чтобы понять что форма не передавалась еще. Это 1.
Когда передают и передают корректные данные, тоже понятно. Это 2.
Я вас спрашиваю о другом, о третьем случае - что вы будете делать, если в ваш запрос подставляется sql-инъекция, выражаясь понятнее, вашу базу хотят ломануть?

  Ответить  
 
 автор: TrEK   (06.02.2011 в 14:27)   письмо автору
 
   для: sim5   (06.02.2011 в 14:08)
 

Ну проблемма в том, что я без понятия каким образом можно сделать sql-инъекцию, от того и не знаю как от нее защититься.


<?php
..
..
###Первоначальное открытие странички. 
###Выше идет проверки или установлен чек-бокс, а так как при перв.открытии он не установлен,
###то проверку на наличие пустого POST я вставляю после else  "если чек-бокс не установлен"
 
else
        {if (empty(
$_POST['month'])) {$_POST['month']=$curr_m;$_POST['year']=$curr_y;} else {$_POST['month']=$_POST['month'];$_POST['year']=$_POST['year'];}
    {
$sql="SELECT id, title, title_en, dateadd, downloads, prev, count, relizer FROM film WHERE dateadd LIKE '".sprintf("%04d-%02d"$_POST['year'], $_POST['month'])."%' ORDER BY dateadd";
    
$result mysql_query($sql);
    
$num_rows mysql_num_rows($result);
    echo 
"ВСЕ фильми, Которые были добавленны за выбранный период! ".$m1." ".$_POST['year']." - $num_rows фильмов.";
        echo 
'<table><tr><td>Дата</td></table>';    
    while(list(
$id$title$title_en$dateadd$downloads$prev$count$relizer) = mysql_fetch_array($result))
    {
        if (
$relizer != "tt") {$relizer substr_replace("","НЕ Я",$relizer);} else {$relizer "Я";}
    echo 
'<table>ТЕЙБЛ</table>';
    }
    } 
        }
..
..
?>


У меня работает в таком варианте, или все же ПРАВИЛЬНО будет заменить на вид:

<?php
  $curr_m 
date('m')';
  $curr_y = date('
y');
  if(!empty($_POST['
month'])) $curr_m = intval($_POST['month']);
  if(!empty($_POST['
year'])) $curr_y = intval($_POST['year']);
?> 

?

  Ответить  
 
 автор: sim5   (06.02.2011 в 14:33)   письмо автору
 
   для: TrEK   (06.02.2011 в 14:27)
 

Кавычка лишняя, а одной не достает. )
Ну так вам об этом еще в первом посте говорили, и я буквально выше писал - intval($_POST['month']) и превратит эту инъекцию в 0. То есть строковое выражение после intval будет равно 0.
Вам подставили таковое в форму, после intval($_POST['month']) вы получаете 0, и тоже самое и с годом может быть. Вот я и задаю вопрос - а разве разумно при этом отдавать в запрос данные, которые породят бесполезный запрос, ведь ни месяца 0, ни года 0 в ней отродясь не будет?
Вы можете либо проигнорировать такие данные, либо вместо этого делать запрос по текущей дате, что разумнее.

[поправлено модератором]

  Ответить  
 
 автор: TrEK   (06.02.2011 в 15:02)   письмо автору
 
   для: sim5   (06.02.2011 в 14:33)
 

Все , я понял суть своей ошибки, щас буду переделывать... (про ескьюел-инъекцию)

еще однин момент:

<?php

$m1
=$_POST['month'];
if (
$m1=="01"$m1="янв";
if (
$m1=="02"$m1="фев";
if (
$m1=="03"$m1="март";
if (
$m1=="04"$m1="апр";
if (
$m1=="05"$m1="май";
if (
$m1=="06"$m1="июнь";
if (
$m1=="07"$m1="июль";
if (
$m1=="08"$m1="авг";
if (
$m1=="09"$m1="сен";
if (
$m1=="10"$m1="окт";
if (
$m1=="11"$m1="ноя";
if (
$m1=="12"$m1="дек";



{
..
..
Тру-ту-ту-ла-ла-ла
..
..
}
..
..
###Первоначальное открытие странички. 
###Выше идет проверки или установлен чек-бокс, а так как при перв.открытии он не установлен,
###то проверку на наличие пустого POST я вставляю после else  "если чек-бокс не установлен"
 
else
        {if (
тра-та-та) {тра-ля-ля} else {тра-ля-лю}
    {
$sql="SELECT что-то FROM film WHERE dateadd LIKE '".sprintf("%04d-%02d"$_POST['year'], $_POST['month'])."%' ORDER BY dateadd";
    
$result mysql_query($sql);
    
$num_rows mysql_num_rows($result);
    echo 
"ВСЕ фильми, Которые были добавленны за выбранный период! ".[b]$m1[/b]." ".$_POST['year']." - $num_rows фильмов.";
    } 
        }
..
..
?> 


$m1 - описано в самом начале, соответственно в том блоке, где осуществляется запрос в БД - $m1 не определяется потому что не было POST, которое можно было бы конвертировать в $m1 значение.
Подскажите, как можно при пустом POST получить тот же $m1:

<?php
$m1
=$_POST['month']; ### $_POST есть!
if ($m1=="01"$m1="янв";
if (
$m1=="02"$m1="фев";
if (
$m1=="03"$m1="март";
if (
$m1=="04"$m1="апр";
if (
$m1=="05"$m1="май";
if (
$m1=="06"$m1="июнь";
if (
$m1=="07"$m1="июль";
if (
$m1=="08"$m1="авг";
if (
$m1=="09"$m1="сен";
if (
$m1=="10"$m1="окт";
if (
$m1=="11"$m1="ноя";
if (
$m1=="12"$m1="дек";
?>


так?

<?php
$curr_m
=date('m');
  if (empty(
$_POST['month'])) 
    {
$m1=$curr_m;} 
  else 
    {
$m1=$_POST['month'];}
if (
$m1=="01"$m1="янв";
if (
$m1=="02"$m1="фев";
if (
$m1=="03"$m1="март";
if (
$m1=="04"$m1="апр";
if (
$m1=="05"$m1="май";
if (
$m1=="06"$m1="июнь";
if (
$m1=="07"$m1="июль";
if (
$m1=="08"$m1="авг";
if (
$m1=="09"$m1="сен";
if (
$m1=="10"$m1="окт";
if (
$m1=="11"$m1="ноя";
if (
$m1=="12"$m1="дек";
?>

  Ответить  
 
 автор: sim5   (06.02.2011 в 15:18)   письмо автору
 
   для: TrEK   (06.02.2011 в 15:02)
 

Уберите все эти if, поместите название месяцев в массив, с ключами равными номерам месяцев. Будете получать из него, при этом не важно будет, текущий вы месяц берете или иной.
Кстати, если у вас $curr_m (и с годом тоже) только для запроса к базе создана, то зачем - используйте уже имеющиеся $_POST['month'], $_POST['year'].

PS. А вообще лучще дату, которую вы получите после условий проверки, отдавать функции strtotime, формируя с помощью нее необходимое имя месяца. Локаль только нужную установить надо:
<?
//русская локаль для даты/времени
setlocale(LC_TIME'Russian_Russia.1251');
//сокращенное имя месяца
print strftime('%b'strtotime('this date'));
//или полное имя месяца
print strftime('%B'strtotime('this date'));
В примере указана текущая дата, вам вместо нее нужно указать то, что получите после условий.

  Ответить  
 
 автор: TrEK   (06.02.2011 в 16:04)   письмо автору
 
   для: sim5   (06.02.2011 в 15:18)
 

Ну $curr_m , $curr_y выводятся еще в одном месте у меня, чтоб как бы видеть какой сегодня месяц-год, тоесть для запроса в БД испаользуются не они а $_POST['month'], $_POST['year']

На счет массива спасибо, поищу как это правильно делается.


Дело в том, что при date '+%B' у меня на страничку почему-то выводится месяц латынью, хотя та же в комманда показывает месяц в кириллице.

  Ответить  
 
 автор: sim5   (06.02.2011 в 16:15)   письмо автору
 
   для: TrEK   (06.02.2011 в 16:04)
 

Какая команда?
Если латиницей показывает, значит локаль не устанавливается.

А это что такое - date '+%B' ?

  Ответить  
 
 автор: TrEK   (06.02.2011 в 19:57)   письмо автору
 
   для: sim5   (06.02.2011 в 16:15)
 

Так суть в том, что в консоле кирилицей пишет месяц )) а при пшп запросе - выводит латынь.

date +%B - ну это консольная комманда, дает вывод текущий месяц, полностью. +%b - сокращенно.

  Ответить  
 
 автор: sim5   (07.02.2011 в 05:47)   письмо автору
 
   для: TrEK   (06.02.2011 в 19:57)
 

>Ну $curr_m , $curr_y выводятся еще в одном месте у меня, чтоб как бы видеть какой сегодня месяц-год, тоесть для запроса в БД испаользуются не они а $_POST['month'], $_POST['year']

Не к чему их вообще использовать, ибо вы далее оперируете почему-то $_POST['month'], а в случае, если после проверки (так как вы делатете) будут возвращены нули, то это приведет просто к пустому запросу. Запрашивать то чего нет, и зная об этом хорошо, зачем, удостовериться, что нет? К тому же, вы эту текущую дату то не приравниваете пост перменным, то приравниваете.

Вам требуется выводить из базы и выбирать текущую дату при первичной загрузке страницы. Делать запрос по несуществующим датам тоже смысла нет. Отсюда появляется условие:

если массив $_POST пуст ИЛИ если установлена переменная $_POST['year'], но она после проверки возвращает ноль ИЛИ если установлена переменная $_POST['month'], но она после проверки возвращает ноль, то использовать текущую дату, ИНАЧЕ использовать дату пришедшую из формы.

Для того чтобы составить это СЛОВЕСНОЕ условие, достаточно подумать, что вам надо, а чего не желательно, и вам об этом уже вторую тему мусолит и cheops, и я несколько раз повторял... Но то, что словами написать условие вы могли бы, не сомневаюсь, по крайней мере, после "подумавши", точно. А перевести это условие на язык РНР, так это просто слова заменить на соответствия:
<?
if(empty($_POST) || isset($_POST['year']) && !intval($_POST['year']) || isset($_POST['month']) && !intval($_POST['month'])) {
  
$_POST['year'] = date("Y");
  
$_POST['month'] = date("m");
}
Далее используете, везде, $_POST['year'] и $_POST['month']. Заметьте, что при первичной загрузке страницы вы устанавливаете их, а при получении формы будут использоваться те, что пришлет форма, но заменнные на текущее значение в случае инъекции. При этом, значения этих переменных прошедшие intval() вы не используете непосредственно, и можете использовать запрос, который вам показывал cheops ранее.

Далее достаточно указать:
<?
echo "ВСЕ фильми, Которые были добавленны за выбранный период! <b>".
strftime('%B'strtotime($_POST['year'].$_POST['month']))."</b> ".
$_POST['year']." - $num_rows фильмов.";
А не разберетесь со своей локалью, можете использовать массив имен. Списки выводить циклом, проверя итерацию (добавляя к ней ведущий ноль) со значением date("m"), и при равенстве отмечать опшен как выбранный. Это же самое (вывод списка) делать и со списком года, проверяя соответственно с текущим годом.

Примечание: Коли вам действительно нужен месяц жирным шрифтом, то тег <b> нужен, а не его ВВ-тег, и подставлять его надо в текст, а не к функции (или переменной).

  Ответить  
 
 автор: TrEK   (17.02.2011 в 20:51)   письмо автору
 
   для: sim5   (07.02.2011 в 05:47)
 

1.Большое спасибо за Ваши замеания по поводу безопасности и остальных моментах. Приму во внимание.

2.С локалью не разобрался, похоже оставлю определение месяца как есть .... Через массив.

3.На счет выделения месяца жирным, это я хотел здесь в коде просто выделить $m1 , но получилось что оно не выделило, а вставило туда теги.


<?php
echo "тра-ля-ля <font color=red size=5><b><u>".$m1."</u></b></font> тра-ля-ля ".$_POST['year']." - $num_rows тра-ля-ля.";
?>

п.с. здесь понятно.

  Ответить  
 
 автор: daniladiez   (06.02.2011 в 13:40)   письмо автору
 
   для: TrEK   (06.02.2011 в 13:34)
 


<?php
$curr_m 
12;
$curr_y 2010;

if (isset(
$_POST) AND count($_POST)){
  
$_POST['month']=$_POST['month'];
  
$_POST['year']=$_POST['year'];

else {
  
$_POST['month']  = $curr_m;
  
$_POST['year'] = $curr_y;
}
?>

  Ответить  
 
 автор: sim5   (06.02.2011 в 13:33)   письмо автору
 
   для: TrEK   (06.02.2011 в 13:26)
 

Это означаете, что переменная $_POST['month'] есть и чего-то содержит. А вам ведь не просто чего-то надо, а конкретное, так ведь?

  Ответить  
 
 автор: TrEK   (06.02.2011 в 20:45)   письмо автору
 
   для: sim5   (06.02.2011 в 13:33)
 

Я имел вввиду что означает !empty, но уже понял, условие если запрос POST не пустой, а что-то содержит..

  Ответить  
 
 автор: cheops   (06.02.2011 в 20:48)   письмо автору
 
   для: TrEK   (06.02.2011 в 20:45)
 

Хм... напротив, функция empty() возвращает true (истина), если POST не содержит ничего, ! - это отрицание, т.е. !empty() возвращает true (истина), если POST содержит хоть что-то.

  Ответить  
 
 автор: sim5   (07.02.2011 в 05:55)   письмо автору
 
   для: TrEK   (06.02.2011 в 20:45)
 

Проверить просто пустой или непустой недостаточно, ибо sql-инъкция это не пустое значение, и "радости" от такого заполнения пустоты вы не получите. ;-)

  Ответить  
Rambler's Top100
вверх

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