Форум: "Прочее";
Текущий архив: 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.042 c