Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2006.02.19;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.039 c
2-1138481796
petr
2006-01-28 23:56
2006.02.19
список таблиц


2-1139040526
Julia
2006-02-04 11:08
2006.02.19
Как объявить тип TDateSetState?


15-1138286565
Yegorchic
2006-01-26 17:42
2006.02.19
Конспект по теме "Решения треугольников"


15-1138451244
Хинт
2006-01-28 15:27
2006.02.19
Труп невесты


15-1138561521
example
2006-01-29 22:05
2006.02.19
Опрос





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский