CodeIgniter PHP Framework - нужно получить строку запроса

Я создаю сайт электронной коммерции, используя CodeIgniter.

Как мне получить строку запроса?

Я использую Saferpay платежный шлюз. Ответ шлюза будет таким:

http://www.test.com/registration/success/?DATA=<IDP+MSGTYPE%3D"PayConfirm"+KEYID%3D"1-0"+ID%3D"KI2WSWAn5UG3vAQv80AdAbpplvnb"+TOKEN%3D"(unused)"+VTVERIFY%3D"(obsolete)"+IP%3D" 123.25.37.43"+IPCOUNTRY%3D"IN"+AMOUNT%3D"832200"+CURRENCY%3D"CHF"+PROVIDERID%3D"90"+PROVIDERNAME%3D"Saferpay+Test+Card"+ACCOUNTID%3D"99867-94913159"+ECI%3D"2"+CCCOUNTRY%3D"XX"%2F>&SIGNATURE=bc8e253e2a8c9ee0271fc45daca05eecc43139be6e7d486f0d6f68a356865457a3afad86102a4d49cf2f6a33a8fc6513812e9bff23371432feace0580f55046c

Чтобы обработать ответ, мне нужно получить данные строки запроса.


Извините, я не ясно объяснил проблему. Я получаю сообщение "Страница не найдена", получая ответ от платежного сайта после оплаты.

Я попытался включить с uri_protocol = 'PATH_INFO' и enable_query_strings = 'TRUE' в config.php. Хотя googling я обнаружил, что это не сработает, если я использую htaccess rewrite.

Я уже пытался изменить записи в конфигурации, но он не работает.

Ответ 2

Я использую CodeIgniter уже более года. По большей части мне это очень нравится (я вношу свой вклад в форум и использую его в каждом экземпляре, который я могу), но я НЕНАВИЖУ СОГЛАШЕНИЕ этого утверждения в руководстве:

Уничтожает глобальный массив GET. поскольку CodeIgniter не использует GET строк, нет оснований позволять он.

Предполагая, что вам никогда не понадобится GET в приложении CodeIgniter, будет asinine! Уже через несколько дней мне пришлось иметь дело с почтовыми страницами из PayPal и ClickBank (я уверен, что есть миллион других.) Угадайте, что они используют GET!!!

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

Тот, который мне нравится (но не работал, поскольку установка REQUEST_URI в config.php сломала мой сайт) расширяет класс ввода:

class MY_Input extends CI_Input
{
        function _sanitize_globals()
        {
            $this->allow_get_array = TRUE;
            parent::_sanitize_globals();
        }
}

Но лучший способ без излишеств - проверить с помощью print_r ($ _ SERVER) по URL-адресу, где вам нужны переменные GET. Посмотрите, какой параметр протокола URI показывает ваши переменные GET и использует его.

В моем случае я могу видеть, что мне нужно в REQUEST_URI

// defeat stupid CI GET squashing!
parse_str($_SERVER['REQUEST_URI'], $_GET);

Это помещает вашу строку запроса обратно в супер-глобальный экземпляр $_GET для экземпляра этой страницы (вам не нужно использовать $_GET, это может быть любая переменная.)

ИЗМЕНИТЬ

После публикации этого вопроса я обнаружил, что при использовании REQUEST_URI вы потеряете свой первый массив массивов строк запроса, если вы не удалите все до?. Например, URL-адрес, например /controller/method? One = 1 & two = 2, заполнит массив $_GET в этом примере массивом ('method? One' = > 1, 'two' = > 2). Чтобы обойти это, я использовал следующий код:

parse_str(substr(strrchr($_SERVER['REQUEST_URI'], "?"), 1), $_GET);

Предполагаю, что я должен был привести пример, так вот:

class Pgate extends Controller {
   function postback() {
      parse_str(substr(strrchr($_SERVER['REQUEST_URI'], "?"), 1), $_GET);
      $receipt = $this->input->xss_clean($_GET['receipt']);
   }
}

Ответ 3

Если вы хотите строку unparsed query:

$this->input->server('QUERY_STRING');

Ответ 4

Откройте приложение /config/config.php и установите следующие значения:

$config['uri_protocol'] = "PATH_INFO";

$config['enable_query_strings'] = TRUE; 

Теперь строки запроса должны работать нормально.

Ответ 5

// 98% functional
parse_str($_SERVER['REQUEST_URI'], $_GET);

На самом деле это лучший способ справиться с отсутствием поддержки строк запроса $_GET в CodeIgniter. Я сам сам придумал этот, но вскоре понял то же самое, что сделал Бреттикус, потому что вам пришлось слегка изменить способ обработки первой переменной:

// 100% functional    
parse_str(substr(strrchr($_SERVER['REQUEST_URI'], "?"), 1), $_GET);

Это было только вопросом времени, прежде чем я сам доберусь до него, но использование этого метода - лучшее однострочное решение для всего остального, включая модификацию существующей библиотеки URI, изолировано только от контроллера где это применимо, и исключает необходимость внесения любых изменений в конфигурацию по умолчанию (config.php)

$config['uri_protocol'] = "AUTO";
$config['enable_query_strings'] = FALSE;

Теперь у вас есть следующее:

/controller/method?field=value
/controller/method/?field=value

Проверьте результаты:

print_r($_GET); // Array ( [field] => value ) 

Ответ 6

Спасибо всем другим плакатам. Это то, что поразило меня:

    $qs = $_SERVER['QUERY_STRING'];
    $ru = $_SERVER['REQUEST_URI'];
    $pp = substr($ru, strlen($qs)+1);
    parse_str($pp, $_GET);

    echo "<pre>";
    print_r($_GET);
    echo "</pre>";

Смысл, теперь я мог бы сделать:

$token = $_GET['token'];

В .htaccess мне пришлось изменить:

RewriteRule ^(.*)$ /index.php/$1 [L]

в

RewriteRule ^(.*)$ /index.php?/$1 [L]

Ответ 7

Если вы используете mod_rewrite для удаления файла index.php, вы можете использовать следующий код для получения переменных GET (через $this- > input- > get()). Предполагая конфигурацию по умолчанию, назовите файл MY_Input.php и поместите его в каталог приложений/библиотек.

Использование: $this- > input- > get()

class MY_Input extends CI_Input {

    function My_Input()
    {
        parent::CI_Input();

        // allow GET variables if using mod_rewrite to remove index.php
        $CFG =& load_class('Config');
        if ($CFG->item('index_page') === "" && $this->allow_get_array === FALSE)
        {
            $_GET = $this->_get_array();
        }

    }

    /**
     * Fetch an item from the GET array
     * 
     * @param string $index
     * @param bool   $xss_clean
     */
    function get($index = FALSE, $xss_clean = FALSE)
    {
        // get value for supplied key
        if ($index != FALSE)
        {
            if (array_key_exists(strval($index), $_GET))
            {
                // apply xss filtering to value
                return ($xss_clean == TRUE) ? $this->xss_clean($_GET[$index]) : $_GET[$index];
            }
        }
        return FALSE;
    }

    /**
     * Helper function
     * Returns GET array by parsing REQUEST_URI
     * 
     * @return array
     */
    function _get_array()
    {           
        // retrieve request uri
        $request_uri = $this->server('REQUEST_URI');

        // find query string separator (?)
        $separator = strpos($request_uri, '?');
        if ($separator === FALSE)
        {
            return FALSE;
        }

        // extract query string from request uri
        $query_string = substr($request_uri, $separator + 1);

        // parse query string and store variables in array
        $get = array();
        parse_str($query_string, $get);

        // apply xss filtering according to config setting
        if ($this->use_xss_clean === TRUE)
        {
            $get = $this->xss_clean($get);
        }

        // return GET array, FALSE if empty
        return (!empty($get)) ? $get : FALSE;
    }


}

Ответ 8

Задайте конфигурационный файл

$config['index_page'] = '';
$config['uri_protocol'] = 'AUTO';
$config['allow_get_array']      = TRUE;
$config['enable_query_strings'] = FALSE;

и .htaccess файл (корневая папка)

<IfModule mod_rewrite.c>
    Options +FollowSymLinks
    Options -Indexes
    RewriteEngine On
    RewriteBase /

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d

    RewriteCond $1 !^(index\.php)
    RewriteRule ^(.*)$ index.php [L]


</IfModule>

Теперь вы можете использовать

http://example.com/controller/method/param1/param2/?par1=1&par2=2&par3=x
http://example.com/controller/test/hi/demo/?par1=1&par2=2&par3=X

сторона сервера:

public function test($param1,$param2)
{
    var_dump($param1); // hi
    var_dump($param2); // demo
    var_dump($this->input->get('par1')); // 1
    var_dump($this->input->get('par2')); // 2
    var_dump($this->input->get('par3')); // X
}

Ответ 9

Вы можете создать правило в своем .htaccess, чтобы предотвратить запуск MOD_REWRITE на этой конкретной странице. Это должно позволить вам использовать _GET.

Ответ 10

Вы можете создать привязку pre_system. В классе крюка, который вы создаете, вы можете захватить требуемые параметры запроса и добавить их в $_POST для нормальной обработки CI. Я сделал это для помощника jQuery Ajax.

Например:

(Назовите этот файл autocomplete.php или все, что вы положили в качестве имени файла в hook)

<?php

/*
By Brodie Hodges, Oct. 22, 2009.
*/

if (!defined('BASEPATH')) exit('No direct script access allowed');
/**
*   Make sure this file is placed in your application/hooks/ folder.
*
*   jQuery autocomplete plugin uses query string.  Autocomplete class slightly modified from excellent blog post here:
*   http://czetsuya-tech.blogspot.com/2009/08/allowing-url-query-string-in.html 
*   Ajax autocomplete requires a pre_system hook to function correctly.  Add to your 
*   application/config/hooks.php if not already there:

    $hook['pre_system'][] = array(
        'class'    => 'Autocomplete',
                'function' => 'override_get',
                                'filename' => 'autocomplete.php',
                                'filepath' => 'hooks',
                                'params'   => array()
                                );

*                               
* 
*/

class Autocomplete {
    function override_get() {
        if (strlen($_SERVER['QUERY_STRING']) > 0) {
            $temp = @array();
            parse_str($_SERVER['QUERY_STRING'], $temp);
            if (array_key_exists('q', $temp) && array_key_exists('limit', $temp) && array_key_exists('timestamp', $temp)) {
                $_POST['q'] = $temp['q'];
                $_POST['limit'] = $temp['limit'];
                $_POST['timestamp'] = $temp['timestamp'];
                $_SERVER['QUERY_STRING'] = "";
                $_SERVER['REDIRECT_QUERY_STRING'] = "";
                $_GET = @array();
                $url = strpos($_SERVER['REQUEST_URI'], '?');
                if ($url > -1) {
                    $_SERVER['REQUEST_URI'] = substr($_SERVER['REQUEST_URI'], 0, $url);
                }
            }
        }
    }
}

?>

Ответ 12

Вот как я это делал недавно. Надеюсь, что это поможет.

<?php 
//adapt this code for your own use
                //added example.com to satisfy parse_url
        $url="http://www.example.com".$_SERVER["REQUEST_URI"];
        $url=parse_url($url);
                //I'm expecting variables so if they aren't there send them to the homepage
        if (!array_key_exists('query',$url))
        {
             redirect('/'); exit;
        }
        $query=$url['query'];

        parse_str($query,$_GET); //add to $_GET global array

        var_dump($_GET);
?>

для вызова: http://www.mydomain.com/mycontroller/myfunction/?somestuff=x&morestuff=y

Ответ 13

Здесь приведен полный рабочий пример того, как разрешить querystrings в Codeignitor, например, на платформе JROX. Просто добавьте это в свой файл config.php, расположенный по адресу:

/system/application/config/config.php 

И тогда вы можете просто получить querystrings, как обычно, используя $_GET или класс ниже

$yo = $this->input->get('some_querystring', TRUE);
$yo = $_GET['some_querystring'];

Здесь код, чтобы сделать все это:

/*
|--------------------------------------------------------------------------
| Enable Full Query Strings (allow querstrings) USE ALL CODES BELOW
|--------------------------------------------------------------------------*/

/*
|----------------------------------------------------------------------
| URI PROTOCOL
|----------------------------------------------------------------------
|
| This item determines which server global should 
| be used to retrieve the URI string.  The default 
| setting of 'AUTO' works for most servers.
| If your links do not seem to work, try one of 
| the other delicious flavors:
|
| 'AUTO'              Default - auto detects
| 'PATH_INFO'         Uses the PATH_INFO
| 'QUERY_STRING'      Uses the QUERY_STRING
| 'REQUEST_URI'   Uses the REQUEST_URI
| 'ORIG_PATH_INFO'    Uses the ORIG_PATH_INFO
|
*/
if (empty($_SERVER['PATH_INFO'])) {
    $pathInfo = $_SERVER['REQUEST_URI'];
    $index = strpos($pathInfo, '?');
    if ($index !== false) {
        $pathInfo = substr($pathInfo, 0, $index);
    }
    $_SERVER['PATH_INFO'] = $pathInfo;
}

$config['uri_protocol'] = 'PATH_INFO'; // allow all characters 

$config['permitted_uri_chars'] = ''; // allow all characters 

$config['enable_query_strings'] = TRUE; // allow all characters 

parse_str(substr(strrchr($_SERVER['REQUEST_URI'], "?"), 1), $_GET);

Наслаждайтесь: -)