|
|
|
| Подскажите пожалуйста по поводу пустого $_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'];}
|
| |
|
|
|
|
|
|
|
для: TrEK
(06.02.2011 в 13:05)
| | Вместе с этой это как? Да и вообще, удобнее такое условной операцией (тернарной) делать, вы с ней знакомы, по крайней мере в вашем коде она есть. | |
|
|
|
|
|
|
|
для: 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;}
?>
|
| |
|
|
|
|
|
|
|
для: TrEK
(06.02.2011 в 13:14)
| | Так в чем тогда проблема? Подставляйте эти переменные в условие и действуйте. Вот только надо проверять скорее всего не так, а на 0 после intval, мне так кажется ;-) | |
|
|
|
|
|
|
|
для: sim5
(06.02.2011 в 13:11)
| | Простите, может она и есть, но я не знаю что она так называется :) | |
|
|
|
|
|
|
|
для: TrEK
(06.02.2011 в 13:16)
| | Нет это не она, она это: a ? b : c. | |
|
|
|
|
|
|
|
для: 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 в запрос. | |
|
|
|
|
|
|
|
для: cheops
(06.02.2011 в 13:12)
| |
<?php
!empty($_POST['month'])
?>
|
А это означает ОТСУТСТВИЕ ЗАПРОСА, или ЕСЛИ ЗАПРОС НЕ ПУСТОЙ? | |
|
|
|
|
|
|
|
для: TrEK
(06.02.2011 в 13:26)
| | я обычно делаю так -
if (isset($_POST) AND count($_POST)){
// действия над отправленными данными
}
|
| |
|
|
|
|
|
|
|
для: daniladiez
(06.02.2011 в 13:29)
| | Мне надо условие,
Если $_POST['month'] и $_POST['year'] одновременно пусты (в случае первоначального открытия странички) - $_POST['month'] и $_POST['year'], которые вставляются в SQL-запрос были равны $curr_m и $curr_y (текущий месяц и год).
Чтоб даже при первоначальном открытии был вывод из БД. | |
|
|
|
|
|
|
|
для: TrEK
(06.02.2011 в 13:34)
| | А может не одновременно, а любое из них? К тому же, повторяю еще раз - вам надо не просто непустое, а значения после intval не равые 0. Зачем понапрасну гонять базу, если над вами шутят? | |
|
|
|
|
|
|
|
для: sim5
(06.02.2011 в 13:36)
| | Ну вообще-то да, если любое из $_POST[] иммет пустое значение - тогда :
<?php
[b]$_POST['month']=$curr_m
AND
$_POST['year']=$curr_m[/b]
?>
|
| |
|
|
|
|
|
|
|
для: TrEK
(06.02.2011 в 13:47)
| | Насколько помнится, то вам при загрузке страницы и отсутствия запросов (или ложных запросов) нужно передать в запрос текущую дату. Ложный запрос, это подделка вашей формы, как-то подставить в sql-запрос инъекцию. С этой целью вы и проделываете над входными переменными этот фокус - intval. Если вас "прощупывают", то значит после intval вы обязательно получите 0. Вопрос - что в этом случае должно быть запросом в базе, 0 или все таки текущий год и месяц? | |
|
|
|
|
|
|
|
для: sim5
(06.02.2011 в 13:52)
| | Ну мне надо вывод списка за текущий месяц и год.
Тоесть при отсутствии POST (при пустом) - запрос в БД по текущему месяцу и году.
А вот если уже в форме выбрать год и месяц,- тогда чтоб запрос в БД был по выбраным POST | |
|
|
|
|
|
|
|
для: TrEK
(06.02.2011 в 14:02)
| | Ну с первым понято, достаточно проверить массив $_POST на пустоту, чтобы понять что форма не передавалась еще. Это 1.
Когда передают и передают корректные данные, тоже понятно. Это 2.
Я вас спрашиваю о другом, о третьем случае - что вы будете делать, если в ваш запрос подставляется sql-инъекция, выражаясь понятнее, вашу базу хотят ломануть? | |
|
|
|
|
|
|
|
для: 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']);
?>
|
? | |
|
|
|
|
|
|
|
для: TrEK
(06.02.2011 в 14:27)
| | Кавычка лишняя, а одной не достает. )
Ну так вам об этом еще в первом посте говорили, и я буквально выше писал - intval($_POST['month']) и превратит эту инъекцию в 0. То есть строковое выражение после intval будет равно 0.
Вам подставили таковое в форму, после intval($_POST['month']) вы получаете 0, и тоже самое и с годом может быть. Вот я и задаю вопрос - а разве разумно при этом отдавать в запрос данные, которые породят бесполезный запрос, ведь ни месяца 0, ни года 0 в ней отродясь не будет?
Вы можете либо проигнорировать такие данные, либо вместо этого делать запрос по текущей дате, что разумнее.
[поправлено модератором] | |
|
|
|
|
|
|
|
для: 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="дек";
?>
|
| |
|
|
|
|
|
|
|
для: 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'));
| В примере указана текущая дата, вам вместо нее нужно указать то, что получите после условий. | |
|
|
|
|
|
|
|
для: sim5
(06.02.2011 в 15:18)
| | Ну $curr_m , $curr_y выводятся еще в одном месте у меня, чтоб как бы видеть какой сегодня месяц-год, тоесть для запроса в БД испаользуются не они а $_POST['month'], $_POST['year']
На счет массива спасибо, поищу как это правильно делается.
Дело в том, что при date '+%B' у меня на страничку почему-то выводится месяц латынью, хотя та же в комманда показывает месяц в кириллице. | |
|
|
|
|
|
|
|
для: TrEK
(06.02.2011 в 16:04)
| | Какая команда?
Если латиницей показывает, значит локаль не устанавливается.
А это что такое - date '+%B' ? | |
|
|
|
|
|
|
|
для: sim5
(06.02.2011 в 16:15)
| | Так суть в том, что в консоле кирилицей пишет месяц )) а при пшп запросе - выводит латынь.
date +%B - ну это консольная комманда, дает вывод текущий месяц, полностью. +%b - сокращенно. | |
|
|
|
|
|
|
|
для: 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> нужен, а не его ВВ-тег, и подставлять его надо в текст, а не к функции (или переменной). | |
|
|
|
|
|
|
|
для: 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 тра-ля-ля.";
?>
|
п.с. здесь понятно. | |
|
|
|
|
|
|
|
для: 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;
}
?>
|
| |
|
|
|
|
|
|
|
для: TrEK
(06.02.2011 в 13:26)
| | Это означаете, что переменная $_POST['month'] есть и чего-то содержит. А вам ведь не просто чего-то надо, а конкретное, так ведь? | |
|
|
|
|
|
|
|
для: sim5
(06.02.2011 в 13:33)
| | Я имел вввиду что означает !empty, но уже понял, условие если запрос POST не пустой, а что-то содержит.. | |
|
|
|
|
|
|
|
для: TrEK
(06.02.2011 в 20:45)
| | Хм... напротив, функция empty() возвращает true (истина), если POST не содержит ничего, ! - это отрицание, т.е. !empty() возвращает true (истина), если POST содержит хоть что-то. | |
|
|
|
|
|
|
|
для: TrEK
(06.02.2011 в 20:45)
| | Проверить просто пустой или непустой недостаточно, ибо sql-инъкция это не пустое значение, и "радости" от такого заполнения пустоты вы не получите. ;-) | |
|
|
|