Область видимости переменной

romanich

Новичок
Область видимости переменной

Есть следующий код:
PHP:
$url="http://"."$HTTP_HOST"."$REQUEST_URI"."'";

Function Test () {
global $url;
$array = array();
$postfix = "/', ";
$pflag = FALSE;
if (substr($url,-1) != "/") {$url .= "/"; $pflag= TRUE;}
$parts = explode("/","'".$url);
$c = count($parts);
for($i=3;$i<$c;$i++)
{
 if (($i+1 == $c) and $pflag) {$postfix = NULL;}
 $array = join("/",array_slice($parts,0,$i)).$postfix;
 print $array;
}
};
Test (); //выводит что-то типа 'http://banner.ru/', 'http://banner.ru/russia/', 'http://banner.ru/russia/spb/', 'http://banner.ru/russia/spb/'
Но если я пытаюсь сделать следующее:
PHP:
$res=mysql_query("SELECT * from banner WHERE page IN ('".Test()."')");
Выводит тоже самое 'http://banner.ru/', 'http://banner.ru/russia/', 'http://banner.ru/russia/spb/', 'http://banner.ru/russia/spb/'
т.е. не происходит слияние строк. Может можно как-то вытащить $array со значением которое распечатывается в цикле, или как-то присвоить то-что распечатывается при вызове функции Test () какой-нибудь переменной.
 

bkonst

.. хочется странного?...
Re: Область видимости переменной

Наверное, стоит использовать ключевое слово 'return'.
 

romanich

Новичок
В смысле? Если можно поподробнее. Где конкретнее, если не сложно.
Может я чего-то не понимаю, но return прекращает действие функции. Проблема в том, что функция продолжает работать в строке. Грубо говоря мне нужен результат функции, это 'http://banner.ru/', 'http://banner.ru/russia/', 'http://banner.ru/russia/spb/', 'http://banner.ru/russia/spb/', а не ее работа, когда я пытаюсь слить строки.
 

zarus

Хитрожопый макак
PHP:
...
$output = '';
for($i=3;$i<$c;$i++)
{
 if (($i+1 == $c) and $pflag) {$postfix = NULL;}
 $array = join("/",array_slice($parts,0,$i)).$postfix;
 print $array;
  $output .= $array;
}
return $output;
Голова тебе на что? Ею не только можно есть и пить.

-~{}~ 16.12.05 12:22:

з.ы. А вообще цикл тебе надо убрать и переделать запрос на
PHP:
$res=mysql_query("SELECT * from banner WHERE page LIKE '".Test()."%'");
и еще нужно заэкскейпить результат Test().
 

romanich

Новичок
Автор оригинала: zarus
PHP:
[size=1][i]-~{}~ 16.12.05  12:22:[/i][/size]

з.ы. А вообще цикл тебе надо убрать и переделать запрос на
[php]
$res=mysql_query("SELECT * from banner WHERE page LIKE '".Test()."%'");
и еще нужно заэкскейпить результат Test().
Да в том-то все и дело что нельзя. Нельзя использовать LIKE и %.
Пытаюсь сделать прогу для подстановки баннера.
Если, к примеру, в поле page имеется значение ячейки http://site.ru, то баннер показывается и на http://site.ru и на http://site.ru/one_level и на http://site.ru/two_level. Если строка ячейка имеет вид http://site.ru/two_level то только на http://site.ru/two_level. А при этой схеме http://site.ru% на странице http://site.ru показываются все баннеры.
Использовать деревья не могу, т.к. не могу точно определить родительские и дочерние уровни. Может быть http://site.ru/one_level/one_one_level, а так же может быть http://site.ru/one_one_level.
P.S. Что значит "заэкскейпить результат Test()."
 

Фанат

oncle terrible
Команда форума

white phoenix

Новичок
romanich
я же тебе дал тогда нормальный код, а ты его испоганил...
дубль два:
PHP:
function test($url)
{
 $array = array(); 
 $postfix = "/"; 
 $pflag = FALSE; 
 if (substr($url,-1) != "/") {$url .= "/"; $pflag= TRUE;} 
 $parts = explode("/",$url); 
 $c = count($parts); 
 for($i=3;$i<$c;$i++) 
 {
  if (($i+1 == $c) and $pflag) {$postfix = NULL;} 
  $array[] = join("/",array_slice($parts,0,$i)).$postfix; 
 }
 return $array;
}
$url ="http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
$str = test($url);
var_dump($str);
Для экранирования кавычек используй [m]mysql_escape_string[/m].
 

kruglov

Новичок
white phoenix
Лично я не задумываюсь над символами, а просто составил стереотип, что эта функция кошерная, а эта - нет.
 

kruglov

Новичок
Всегда соображать очень утомительно.

Лучше выполнять установленные правила безопасности, чем каждый раз думать, насколько их можно "подвинуть" в каждом конкретном случае.

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

Вот тут соображать да, надо.
 

romanich

Новичок
Автор оригинала: white phoenix
romanich
я же тебе дал тогда нормальный код, а ты его испоганил...
дубль два:
PHP:
function test($url)
{
 $array = array(); 
 $postfix = "/"; 
 $pflag = FALSE; 
 if (substr($url,-1) != "/") {$url .= "/"; $pflag= TRUE;} 
 $parts = explode("/",$url); 
 $c = count($parts); 
 for($i=3;$i<$c;$i++) 
 {
  if (($i+1 == $c) and $pflag) {$postfix = NULL;} 
  $array[] = join("/",array_slice($parts,0,$i)).$postfix; 
 }
 return $array;
}
$url ="http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
$str = test($url);
var_dump($str);
Для экранирования кавычек используй [m]mysql_escape_string[/m].
Ничего не понял.
1. Почему тот код который я переделал "не годится"?
2. Зачем мне все выводить в массив, а затем считывать через var_dump, а к примеру не через print_r? Ведь мне нужна строка, которая потом будет подставляться в SQL-запрос.
3. Зачем мне использовать mysql_escape_string если эта таблица показа баннеров, а не список с паролями и логинами?

Если не затруднит, ответьте на данные вопросы. Вопросы возможно дурацкие, но я только начинаю изучать программирование, поэтому заранее прошу прощения.
 

Фанат

oncle terrible
Команда форума
Зачем мне использовать mysql_escape_string если эта таблица показа баннеров, а не список с паролями и логинами?
я тебе ссылку давал. ты её читал? или чтение ты тоже "только начинаешь изучать"?
 

white phoenix

Новичок
romanich
Почему тот код который я переделал "не годится"?
Это у тебя надобно спросить :) Если б годился то топика бы не было.
Зачем мне все выводить в массив, а затем считывать через var_dump, а к примеру не через print_r? Ведь мне нужна строка, которая потом будет подставляться в SQL-запрос.
var_dump() я сделал чтобы показать тебе какие данные лежат в $str, с расчетом на то что ты своей головой, которой, как метко заметил zarus, можно не только пить и есть, сообразишь что эту строчку нужно убрать после того как ты разберешься что и как.
Зачем мне использовать mysql_escape_string если эта таблица показа баннеров, а не список с паролями и логинами?
:D no comments
 

romanich

Новичок
Да в том, то и дело что тот код я доработал, и все у меня стало работать.
PHP:
<?php
$url="http://"."$HTTP_HOST"."$REQUEST_URI"."'";
Function &Test () {
global $url;
$array = array();
$postfix = "/', ";
$pflag = FALSE;
if (substr($url,-1) != "/") {$url .= "/"; $pflag= TRUE;}
$parts = explode("/","'".$url);
$c = count($parts);
$output = '';
for($i=3;$i<$c;$i++)
{
if (($i+1 == $c) and $pflag) {$postfix = NULL;}
$array = join("/",array_slice($parts,0,$i)).$postfix;
//print $array;
$output .= $array;
}
return $output;
};
//соединение с базой условие
mysql_connect("localhost","root") or die ("Подключение с сервером не произошло");
mysql_select_db("advmru") or die ("База не найдена");
$res=mysql_query("SELECT * from banner WHERE page IN (".Test().")");
while ($row=mysql_fetch_array($res)){
print $row['img'];
}
?>
Если имеет право на жизнь, то оставлю. Или есть лучшие варианты?
Что касается безопасности, сижу читаю, пытаюсь вникнуть. В этом вопросе Вы правы, я даже как-то об этом не задумывался. Но теперь буду знать, большое спасибо за советы и ответы на мои вопросы.
 
Сверху