За последние 24 часа нас посетили 26753 программиста и 1482 робота. Сейчас ищут 928 программистов ...

Как применить функцию urlencode если переменная явл.масивом?

Тема в разделе "PHP для новичков", создана пользователем блудный сын, 25 авг 2008.

  1. блудный сын

    блудный сын Активный пользователь

    С нами с:
    18 июн 2008
    Сообщения:
    632
    Симпатии:
    0
    У меня переменная часто бывает в виде массива и при этом в строке скрипта с функцией urlencode() возникает ошибка:
    Код (Text):
    1.  Warning: urlencode() expects parameter 1 to be string, array given in C:\test\script.php on line 15
    Подскажите, как применить к переменной в виде массива функцию urlencode() чтобы не было ошибки.
     
  2. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    не применять функцию для обкаботки строк к массиву
     
  3. блудный сын

    блудный сын Активный пользователь

    С нами с:
    18 июн 2008
    Сообщения:
    632
    Симпатии:
    0
    Чего не делать - понятно. А что же делать?
     
  4. Anonymous

    Anonymous Guest

    Применить последовательно к каждому элементу массива.
     
  5. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    array_map или array_walk
     
  6. блудный сын

    блудный сын Активный пользователь

    С нами с:
    18 июн 2008
    Сообщения:
    632
    Симпатии:
    0
    Я запутался :( Не могу понять как собрать после urlencode() массива все в одну правильную для POST запроса строку. Помогите. Я вот нашел на php.net функцию которая вроде как для этого и предназначена, но не пойму, как ею правильно пользоваться:
    PHP:
    1.  
    2. I just came across the need for a function that exports an array into a query string. Being able to use urlencode($theArray) would be nice, but here's what I came up with:
    3.  
    4. <?php
    5.  
    6. function urlencode_array(
    7.     $var,                // the array value
    8.     $varName,            // variable name to be used in the query string
    9.     $separator = '&'    // what separating character to use in the query string
    10. ) {
    11.     $toImplode = array();
    12.     foreach ($var as $key => $value) {
    13.         if (is_array($value)) {
    14.             $toImplode[] = urlencode_array($value, "{$varName}[{$key}]", $separator);
    15.         } else {
    16.             $toImplode[] = "{$varName}[{$key}]=".urlencode($value);
    17.         }
    18.     }
    19.     return implode($separator, $toImplode);
    20. }
    21.  
    22. ?>
    23.  
    24. This function supports n-dimensional arrays (it encodes recursively).
    25.  
    У меня есть переменная $post которой нужно сделать urlencode(). Переменная моя сложная. Состоит из элементов которые могут быть массивами. Подскажите плиз, как мне вызвать правильно код написаной функции и получить нужный от нее результат?
     
  7. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
  8. блудный сын

    блудный сын Активный пользователь

    С нами с:
    18 июн 2008
    Сообщения:
    632
    Симпатии:
    0
    О! Кажись то что мне надо! Спасибо! А к переменной обработанной этой функцией в конце нужно добавлять вот это "\r\n\r\n"; или она уже содержит?
     
  9. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    PHP:
    1. <?php
    2. function urldecode_array($var){
    3.     foreach ($var as $key=>$value){
    4.         if(is_array($value)){ //На случай вложеного массива
    5.             $value=urldecode_array(&$value);
    6.         } else {
    7.             $value=urldecode($value);
    8.         }
    9.         $var[$key]=$value;
    10.     }
    11.     return $var;
    12. }
    Это же очевидно...
     
  10. блудный сын

    блудный сын Активный пользователь

    С нами с:
    18 июн 2008
    Сообщения:
    632
    Симпатии:
    0
    К сожалению в боевых условиях не работает. Выдает в браузер: Error(s): success
     
  11. блудный сын

    блудный сын Активный пользователь

    С нами с:
    18 июн 2008
    Сообщения:
    632
    Симпатии:
    0
    А почему urldecode()? Мне ведь передать данные нужно на сервер... А при передаче их нужно не раскодировать, а закодировать.
     
  12. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Потому что я прочитал название темы не правильно :)
    Если тебе надо просто массив передать, то можно так:
    PHP:
    1.  
    2. <?
    3. $url=urlencode(serialize($array)); //Шифрование
    4.  
    5. $url_array=unserialize(urldecode($_GET['var'])); //Расшифровка обратно в массив
    6.  
    Upd. Длинна переменной, передаваемой в GET, не может быть более 255 символов.
     
  13. блудный сын

    блудный сын Активный пользователь

    С нами с:
    18 июн 2008
    Сообщения:
    632
    Симпатии:
    0
    С GET у меня все в порядке. И с обычными POST, когда переменная не в виде массива - тоже. Но когда переменная в виде массива - нет нужного эффекта. Можно ли как-то глазами глядя на эту ПОСТ переменную определить - правильная она или нет? Не пойму, как глядя на переменную увидеть, что она содержит массивы. Чем они выделяются? Амперсанд разделяет переменные, а какой символ разделяет массивы? Подскажите, может тогда найду ошибку.
     
  14. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    что именно не так?

    PHP:
    1. <?php
    2. print http_build_query(array('a' => array('b', 'c')));
    Код (Text):
    1. a%5B0%5D=b&a%5B1%5D=c
     
  15. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    блудный сын
    Тебе всего-навсего надо передать массив в POST? Передавай то, что возращает функция serialize, а потом опять превращай в массив функцией unserialize. Если unserialize вернет массив - значит был передан массив :)
     
  16. R22

    R22 Активный пользователь

    С нами с:
    24 мар 2008
    Сообщения:
    78
    Симпатии:
    0
    Адрес:
    Odessa
    PHP:
    1. <?php
    2. function urldecode_array($var){
    3.     foreach ($var as $key=>$value){
    4.         if(is_array($value)){ //На случай вложеного массива
    5.             $value=urldecode_array(&$value);
    6.         } else {
    7.             $value=urldecode($value);
    8.         }
    9.         $var[$key]=$value;
    10.     }
    11.     return $var;
    12. }
    Прочитал такую хрень, что следует делать unset($value) в foreach.
    Было новостью.
     
  17. Anonymous

    Anonymous Guest

    слышал звон...
     
  18. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Только если $value используется как ссылка.
    PHP:
    1.  
    2. <?php
    3. foreach ($array as &$value) {
    4.     // ...
    5. }
    6.  
    7. unset($value); // если забудем, то $value будет указывать на последний элемент массива
     
  19. блудный сын

    блудный сын Активный пользователь

    С нами с:
    18 июн 2008
    Сообщения:
    632
    Симпатии:
    0
    Спасибо еще раз за http_build_query()! Очень упростила код! Но наткнулся на новую закавыку. Подскажите, а бывают ли такие случаи, когда от браузера специально сервер не требует применять к передаваемым данным встроенную в него функцию urldecode() (например давая такую команду браузеру на яваскрипте), а наоборот, требует передавать данные как есть методом ПОСТ?
     
  20. блудный сын

    блудный сын Активный пользователь

    С нами с:
    18 июн 2008
    Сообщения:
    632
    Симпатии:
    0
    Ну подскажите может ли такое быть? Когда к передаваемым данным выдвигается требование передаваться как есть и не обрабатываться с помощью urlencode()?
     
  21. блудный сын

    блудный сын Активный пользователь

    С нами с:
    18 июн 2008
    Сообщения:
    632
    Симпатии:
    0
    Потому что смотрю на заголовки ФФ и он показывает, что на одной хитрой странице одни и те же данные всегда уходят дважды: сначала не обработанные этой функцией, а потом обработанные. Я в яваскрипте нулевой, поэтому разобраться в коде страницы не смогу. А яваскрипта там дай боже...
    Просто скажите, может такое быть или нет.