wake-up-neo.net

CodeIgniter PHP Framework - Abfragezeichenfolge abrufen

Ich erstelle eine E-Commerce-Site mit CodeIgniter .

Wie bekomme ich die Abfragezeichenfolge?

Ich verwende ein Saferpay Payment-Gateway. Die Antwort des Gateways sieht folgendermaßen aus:

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

Um mit der Antwort umgehen zu können, muss ich die Abfrage-String-Daten abrufen.


Sorry, ich habe das Problem nicht klar erklärt. Ich erhalte die Fehlermeldung "Seite nicht gefunden", während ich nach der Zahlung eine Antwort von der Zahlungsseite bekomme.

Ich habe es mit uri_protocol = 'PATH_INFO' und enable_query_strings = 'TRUE' in config.php aktiviert. Beim Googeln habe ich festgestellt, dass dies nicht funktioniert, wenn ich htaccess rewrite verwende.

Ich habe bereits versucht, die Konfigurationseinträge zu ändern, aber es funktioniert nicht.

31
Siva

Sie können es so bekommen:

$this->input->get('some_variable', TRUE);

Sehen Sie dies für weitere Informationen.

53
Sarfraz

Ich benutze CodeIgniter seit über einem Jahr. Meistens gefällt es mir sehr gut (ich trage zum Forum bei und benutze es in jedem Fall, dass ich kann), aber ich hasse die ARROGANZ dieser Aussage im Handbuch:

Zerstört das globale GET-Array. Schon seit CodeIgniter verwendet GET .__ nicht. Strings gibt es keinen Grund, .__ zuzulassen. es.

Die Annahme, dass Sie GET in einer CodeIgniter-Anwendung nie benötigen werden, ist unwahrscheinlich! In nur wenigen Tagen musste ich mich mit Postback-Seiten von Paypal und ClickBank befassen (ich bin sicher, es gibt eine Million andere.) Weißt du was, sie verwenden GET !!!

Es gibt Möglichkeiten, das GET-Quetschen zu stoppen, aber es sind Dinge, die andere Dinge vermasseln. Was Sie nicht hören möchten, ist, dass Sie alle Ihre Ansichten umkodieren müssen, weil Sie Querystrings aktiviert haben und Ihre Links jetzt gebrochen sind! Lesen Sie diese Anleitung sorgfältig durch!

Eine, die ich mag (aber nicht funktionierte, weil das Setzen von REQUEST_URI in config.php meine Site brach), erweitert die Input-Klasse:

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

Am besten ist es jedoch, mit print_r ($ _ SERVER) an der URL zu testen, an der Sie die GET-Variablen benötigen. Sehen Sie, welche URI-Protokolloption Ihre GET-Variablen anzeigt, und verwenden Sie sie. 

In meinem Fall kann ich sehen, was ich in .__ brauche. REQUEST_URI

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

Dadurch wird Ihre Abfragezeichenfolge wieder in das $ _GET-Super-Global für diese Seiteninstanz gesetzt (Sie müssen $ _GET nicht verwenden, es kann sich um eine beliebige Variable handeln.)

BEARBEITEN

Seit dem Posten habe ich festgestellt, dass bei der Verwendung von REQUEST_URI der erste Abfragezeichenfolge-Arrayschlüssel verloren geht, es sei denn, Sie entfernen alles vor dem? Beispiel: Eine URL wie/controller/method? One = 1 & two = 2 füllt das $ _GET-Array in diesem Beispiel mit array ('method? One' => 1, 'two' => 2). Um dies zu umgehen, habe ich folgenden Code verwendet: 

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

Ich denke, ich hätte ein Beispiel geben sollen, also hier:

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

Wenn Sie die nicht analysierte Abfragezeichenfolge möchten:

$this->input->server('QUERY_STRING');
16
Marc Trudel
// 98% functional
parse_str($_SERVER['REQUEST_URI'], $_GET);

Dies ist in der Tat der beste Weg, um die fehlende Unterstützung für $ _GET-Abfragezeichenfolgen in CodeIgniter zu bewältigen. Ich habe mir das eigentlich selbst ausgedacht, aber mir wurde schnell klar, dass Bretticus das getan hat, als Sie die Art und Weise, wie Sie die erste Variable behandelten, ein wenig ändern musste:

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

Es war nur eine Frage der Zeit, bis ich selbst dazu kam, aber diese Methode ist eine bessere einzeilige Lösung für alles, was da draußen ist, einschließlich der Modifikation der vorhandenen URI-Bibliothek. Sie wird nur von dem Controller isoliert, wo er sich befindet anwendbar und macht Änderungen an der Standardkonfiguration (config.php) überflüssig

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

Damit stehen Ihnen jetzt folgende Möglichkeiten zur Verfügung:

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

Überprüfen Sie die Ergebnisse:

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

Öffnen Sie application/config/config.php und legen Sie die folgenden Werte fest:

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

$config['enable_query_strings'] = TRUE; 

Abfragezeichenfolgen sollten jetzt einwandfrei funktionieren.

5
Phil Sturgeon

Wenn Sie die Datei index.php mit mod_rewrite entfernen, können Sie die folgenden GET-Variablen verwenden, um die GET-Variablen zu erhalten (über $ this-> input-> get ()). Wenn Sie von der Standardkonfiguration ausgehen, benennen Sie die Datei MY_Input.php und legen Sie sie in Ihrem Verzeichnis application/libraries ab.

$ 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;
    }


}
2
richard

Vielen Dank an alle anderen Poster. Das ist für mich genau das Richtige:

    $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>";

Das heißt, ich könnte jetzt tun:

$token = $_GET['token'];

Im .htaccess musste ich ändern:

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

zu:

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

Stellen Sie Ihre Konfigurationsdatei ein

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

und .htaccess-Datei (Stammordner)

<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>

Jetzt können Sie verwenden 

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

serverseite:

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
}
1
AldoZumaran

So habe ich es kürzlich gemacht. Ich hoffe es hilft

<?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);
?>

anrufen: http://www.mydomain.com/mycontroller/myfunction/?somestuff=x&morestuff=y

0
ladieu

Sie können in Ihrem .htaccess eine Regel erstellen, um zu verhindern, dass MOD_REWRITE auf dieser bestimmten Seite ausgelöst wird. Das sollte Ihnen erlauben, das _GET zu verwenden.

0
netricate

Im Folgenden finden Sie ein ausführliches Beispiel für das Zulassen von Querystrings in Codeignitor wie auf der JROX-Plattform. Fügen Sie dies einfach in Ihre config.php-Datei ein: 

/system/application/config/config.php 

Und dann können Sie die Querystrings einfach wie gewohnt mit $ _GET oder der unten stehenden Klasse erhalten

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

Hier ist der Code, damit alles funktioniert:

/*
|--------------------------------------------------------------------------
| 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);

Genießen :-)

0
Rob Vanders

Sie können einen pre_system-Hook erstellen. In der von Ihnen erstellten Hook-Klasse können Sie die gewünschten Abfrageparameter abrufen und sie zur normalen CI-Verarbeitung zum $ _POST hinzufügen. Ich habe dies für einen Ajax-Helfer von jQuery gemacht.

Zum Beispiel:

(Nennen Sie diese Datei autocomplete.php oder was auch immer Sie als Dateinamen in den Hook setzen.)

<?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);
                }
            }
        }
    }
}

?>
0
Brodie Hodges