Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.02.19;
Скачать: CL | DM;

Вниз

PHP (с Delphi не связано но здесь же могут быть любые вопросы:) )   Найти похожие ветки 

 
Mozart ©   (2006-01-25 04:59) [0]

Доброго времени суток уважаемые мастера, не могли бы подсказать в чем моя ошибка....
У меня задача - в PHP выполнить запрос postgres:
$q = "select date(time) as date, reltime_to_float(sum(reltime_to_mins(duration))) as dur_m from debill.main_log where time=> "$d1" and time < "$d2" and dialed_num in (select port from bayonne.service_ports where service=3) and duration > "00:00:06" group by date order by date";

так вот - $d1 и $d2 - это даты. Если я вместо них в запросе пишу "2006-01-10" (например) все путем. А если $d = "2006-01-10";(объявляю переменную до запроса) То запрос не выполняется. Я так понимаю должна быть функция или какой- то другой способ конвертации данных в timestamp.  Прошу подсказать кто знает.


 
vidiv ©   (2006-01-25 06:38) [1]

попробуй так... а вообще код давай
time=> "{$d1}" and time < "{$d2}"


 
Mozart ©   (2006-01-25 06:57) [2]

Да действительно так получилось :) спасибо (в документации на php.net я такого не нашел. Хотя как теперь посмотрю все логично :).

Но вот только почему то не передаються данные ($odin, $dva)из формы(это выборка из базы за период):

 class Period_traffic_graph extends Traffic_graph {
 function Period_traffic_graph( $db )
 {
   $this->Traffic_graph( $db );
 }
 function show_head()
 {
   echo "<form method=\"post\" action=\"${url}\">";
   echo "<input type=\"text\" size=\"9\" name=\"odin\" value=\"2006-01-17\">";
   echo "<input type=\"text\" size=\"9\" name=\"dva\"  value=\"${date_str}\">";
   echo "<input type=\"submit\" value=\"Отобрать\">";
   echo "</form>";
 }
 function show( $date )
 {
   $q = "select date(time) as date, reltime_to_float(sum(reltime_to_mins(duration))) as dur_m
         from debill.main_log where
         time >= "{$odin}" and time < "{$dva}" and
         dialed_num in (select port from bayonne.service_ports where service=3) and
         duration > "00:00:06"
         group by date order by date";
   $res = pg_exec( $this->db, $q );

Судя по всему я не правильно создал форму?
Или в чем ошибка?


 
vidiv ©   (2006-01-25 10:33) [3]

http://ru.php.net/manual/ru/language.types.string.php#language.types.string.parsing - тут про кавычки.


> function show( $date )
>  {
>    $q = "select date(time) as date, reltime_to_float(sum(reltime_to_mins(duration)))
> as dur_m
>          from debill.main_log where
>          time >= "{$odin}" and time < "{$dva}" and
>          dialed_num in (select port from bayonne.service_ports
> where service=3) and
>          duration > "00:00:06"
>          group by date order by date";
>    $res = pg_exec( $this->db, $q );

а где ты определяешь эти переменные? Данные POST запроса находятся в переменной $_POST, которую тоже надо делать глобальной в функции


 
McSimm ©   (2006-01-25 10:42) [4]


> vidiv ©   (25.01.06 06:38) [1]
>
> попробуй так...


> Mozart ©   (25.01.06 06:57) [2]
>
> Да действительно так получилось :)

не понимаю...

Ведь записи "time=> "{$d1}" and" и "time=> "$d1" and" эквивалентны.
фигурные скобки нужны для более сложного синтаксиса, например "time=> "{$d1["first"]}" and"


 
McSimm ©   (2006-01-25 10:44) [5]


> vidiv ©   (25.01.06 10:33) [3]


вообще-то массив $_POST и прочие - суперглобальные и не требуют объявления глобальными в функциях.


 
vidiv ©   (2006-01-25 11:12) [6]


> McSimm ©   (25.01.06 10:42) [4]
> не понимаю...
>
> Ведь записи "time=> "{$d1}" and" и "time=> "$d1" and" эквивалентны.
>

У него наверное php какойнить давний. У меня в php5, тоже эквивалентно, но это первое что приходит на ум.


> McSimm ©   (25.01.06 10:44) [5]
>
> вообще-то массив $_POST и прочие - суперглобальные и не
> требуют объявления глобальными в функциях.

Проверил. да действительно так... был просто у меня опыт когдато, долго думал из-за чего ошибки. с тех пор делаю так... хотя давно уже написал себе класс для работы с данными запроса и вообще не задумываюсь.


 
McSimm ©   (2006-01-25 11:19) [7]

а по теме, действительно - не понятно использование переменных $url, $date_str, $odin, $dva в теле функций.
Когда это члены класса - нужно писать $this->,
Когда переменные  из внешней области видимости - описывать в global
Если данные запроса - использовать один из массивов доступа к внешним данным (напр. "... time >= "{$_POST["odin"]}" ... ")


 
Mozart ©   (2006-01-27 04:28) [8]

Дело в том что когда я в функции show_head делаю echo "$odin";
ничего не выводиться. Значит value не присвоилось? Тогда как передать в переменную значение из формы?


 
McSimm ©   (2006-01-27 10:19) [9]


> Mozart ©


Начать вам надо с какой-нибудь книги. Иногда достаточно документации.

Параметры запросов (POST GET) разбираются PHP и размещаются определенным образом в определенном порядке в тех или иных переменных для вашего удобства.

1. Если в настройках PHP включен параметр register_globals (что вообще-то считается неудачным решением) то PHP создает простые переменные, соответствующие вашим параметрам, например $odin

Кроме того вам необходимо понимать, что функции имеют собственную область видимости переменных и переменные из внешней для функции области недоступны. Один из способов получить доступ к переменным из функции использовать конструкцию global

2. Если настройка register_globals выключена (что считается правильным подходом), то найти ваши параметры проще всего внутри одного из специальных массивов
$_POST["odin"] - параметры метода POST
$_GET["odin"] - параметры метода GET
$_REQUEST["odin"] - параметры POST GET и COOKIE
(на самом деле таких массивов намного больше)
Обратите внимание на особый статус этих массивов, они суперглобальные
и всегда доступны из функций без дополнительных действий.

Всегда читайте сообщения об ошибках, предупреждения и замечания от PHP и старайтесь понять их.


 
Mozart ©   (2006-01-27 12:27) [10]

Спасибо, замечания по существу :) Но все - таки не понятно:
echo "<form method=\"post\" action=\"${url}\">";
echo "<input type=\"text\" size=\"9\" name=\"odin\" value=\"2006-01-17\">";
echo "</form>";
echo "$odin";
Почему не выводит то?


 
McSimm ©   (2006-01-27 12:41) [11]


> echo "$odin";
> Почему не выводит то?


Вообще-то это были не замечания по существо, а подробный ответ.
попробую иначе

вариант 1 register_globals включено, поэтому при получении POST запроса PHP инициализирует переменную $odin, но вы пытаетесь обратиться к ней внутри тела функции.
function show_head()
{
   echo "$odin";
}


внутри функции внешняя переменная $odin не видна, поэтому происходит обращение к неинициализированной локальной переменной $odin (о чем PHP проинформирует вас соответствующим Notice, если вы разрешили ему это)

Если вы напишите
function show_head()
{
   global $odin;
   echo "$odin";
}

обращение произойдет к переменной внешней области видимости, т.е. той самой, которая возможна создана PHP на основании данных запроса.

вариант 2 register_globals выключено и переменной $odin вообще нет, т.к. PHP не создает ее на основании данных запроса (и этот вариант предпочтителен)
В этом случае получить доступ к данным формы можно через специализированный ассоциативный массив
function show_head()
{
   echo $_POST["odin"];
}


При этом использование global не обязательно, т.к. ряд объектов PHP на особом положении (суперглобальные).


 
seg   (2006-01-27 13:23) [12]

debill.main_log

Классное название.


 
Mozart ©   (2006-01-29 04:21) [13]

to McSimm
спасибо

to seg
АТС Difinity имеет такую возможность - DeBill. Т.е. детализация телефонного траффика.  И, несмотря на название, работает очень корректно:)


 
vidiv ©   (2006-01-29 09:53) [14]


> time >= "{$_POST["odin"]}"

За такое надо в угол ставить


 
mfender ©   (2006-01-29 12:36) [15]


> vidiv ©   (29.01.06 09:53) [14]
>
> > time >= "{$_POST["odin"]}"
>
> За такое надо в угол ставить

Зачем в угол?
А если перед этим сделать например $_POST["odin"] = addslashes($_POST["odin"]); ?


 
vidiv ©   (2006-01-29 12:45) [16]


> mfender ©   (29.01.06 12:36) [15]
> Зачем в угол?
> А если перед этим сделать например $_POST["odin"] = addslashes($_POST["odin"]);
>  ?

Когда все осознает человек - пусть так и пишет, а пока он только учится.
Мой сотрудник постоянно так делал, как тут, причем не делал $_POST["odin"] = addslashes($_POST["odin"]); до этого. И сколько ему не показывал, не говорил, что так делать нельзя - бестолку. Так что пусть привыкает делать правильно!

P.S. перед использованием данных в запросе mysql нужно применять функцию
mysql_escape_string или mysql_real_escape_string, а не addslashes


 
McSimm ©   (2006-01-29 12:48) [17]


> vidiv ©   (29.01.06 09:53) [14]

ну так и расскажите почему, а то поставили перед фактом - так плохо. и пусть все сами догадываются почему.
речь шла о том, почему в исходном коде доступ к данным не получается.
Про sql инъекции и предпроверку входных данных речь пока не заходила :)


 
vidiv ©   (2006-01-29 12:56) [18]


> McSimm ©   (29.01.06 12:48) [17]

Человек только осваивает php, и сейчас он привыкает к тем или инным решениям. А это не самое лучшее решение. Думаю ты со мной согласен.
Себя я приучил примерно к такому:

$my_forum = mysql_escape_string($forum);
$my_name = mysql_escape_string($name);
$my_iname = mysql_escape_string($iname);
MYSQL::Query("INSERT INTO `forum_threads` (`forum` , `name` , `iname`, `cache_count` )
VALUES ( "{$my_forum}", "{$my_name}", "{$my_iname}", "1") ");


 
Mozart ©   (2006-01-29 13:02) [19]

Может вопрос покажется глупым - но есть ли принципиальное различие в использовании MySQL и Postgres в PHP?


 
mfender ©   (2006-01-29 13:03) [20]


> $my_forum = mysql_escape_string($forum);
> $my_name = mysql_escape_string($name);
> $my_iname = mysql_escape_string($iname);
> MYSQL::Query("INSERT INTO `forum_threads` (`forum` , `name`
> , `iname`, `cache_count` )
> VALUES ( "{$my_forum}", "{$my_name}", "{$my_iname}", "1")
> ");

Чудовищный расход памяти, особенно, если переменных string пара сотен.


 
McSimm ©   (2006-01-29 13:11) [21]

>есть ли принципиальное различие в использовании MySQL и Postgres в PHP?
принципиального отличия нет, разве что набор функций отличается. какая база предпочтительней для задачи, такую и можно использовать.


 
mfender ©   (2006-01-29 13:13) [22]


> Mozart ©   (29.01.06 13:02) [19]
> Может вопрос покажется глупым - но есть ли принципиальное
> различие в использовании MySQL и Postgres в PHP?

Вобщем-то, есть. Всё-таки методы отличаются и именами и внутренностями.
Самое правильное - использовать абстрактный класс для работы с БД, а через него оперировать с классами, написанными под конкретный драйвер.


 
vidiv ©   (2006-01-29 13:18) [23]


> Чудовищный расход памяти, особенно, если переменных string
> пара сотен.

Когда речь зайдет о сотнях - другой разговор.


 
mfender ©   (2006-01-29 13:27) [24]


> Когда речь зайдет о сотнях - другой разговор.

Тогда лучше так:

foreach($_REQUEST as $key=>$value){
   if(is_string($_REQUEST[$value])){
       $_REQUEST[$key][$value] = mysql_escape_string($_REQUEST[$key][$value]);
   }
}


 
vidiv ©   (2006-01-29 13:32) [25]


> mfender ©   (29.01.06 13:27) [24]

Непригодно, если часть данных запроса ты не хочешь использовать в mysql, к примеру:
test.php?findstr=О"кей&page=2.


 
McSimm ©   (2006-01-29 13:38) [26]

рекомендую обратить внимание на mysql_real_escape_string()



Страницы: 1 вся ветка

Текущий архив: 2006.02.19;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.051 c
6-1131144478
FrykT
2005-11-05 01:47
2006.02.19
Отловить Error на TCP сервере на WinSock.


4-1133619554
Susanin iz Gestapo
2005-12-03 17:19
2006.02.19
Приложение владелец


1-1137873251
Volf_555
2006-01-21 22:54
2006.02.19
Как определить запускаемые задачи из C: WINDOWS Tasks ?


10-1113923505
Kerk
2005-04-19 19:11
2006.02.19
How Child IDs Are Used in Parameters


3-1135158279
yk
2005-12-21 12:44
2006.02.19
Проблемы с подключением udf