Je crée un site de commerce électronique à l'aide de CodeIgniter .
Comment dois-je obtenir la chaîne de requête?
J'utilise une passerelle de paiement Saferpay . La réponse de la passerelle sera comme ceci:
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
Pour gérer la réponse, je dois obtenir les données de la chaîne de requête.
Désolé, je n'ai pas expliqué le problème clairement. Je reçois une erreur "Page introuvable" tout en obtenant la réponse du site de paiement après le paiement.
J'ai essayé d'activer avec uri_protocol = 'PATH_INFO'
et enable_query_strings = 'TRUE'
dans config.php
. Pendant que je cherchais sur Google, cela ne fonctionnait pas si j'utilisais htaccess rewrite.
J'ai déjà essayé de modifier les entrées de configuration, mais cela ne fonctionne pas.
Vous pouvez l'obtenir comme ceci:
$this->input->get('some_variable', TRUE);
J'utilise CodeIgniter depuis plus d'un an maintenant. La plupart du temps, je l’aime vraiment beaucoup (je contribue au forum et je l’utilise chaque fois que je le peux) mais je déteste l’ARROGANCE de cette déclaration dans le manuel:
Détruit le tableau GET global. Puisque CodeIgniter n'utilise pas GET cordes, il n'y a aucune raison d'autoriser il.
La présomption que vous n'aurez jamais besoin de GET dans une application CodeIgniter est asin. En quelques jours à peine, j'ai déjà eu à traiter avec des pages postback de Paypal et ClickBank (je suis sûr qu'il y en a un million d'autres.) Devinez quoi, ils utilisent GET !!!
Il y a des moyens d'arrêter cette opération GET, mais ce sont des choses qui ont tendance à gâcher d'autres choses. Ce que vous ne voulez pas entendre, c'est que vous devez recoder tous vos points de vue, car vous avez activé les chaînes de requête et que vos liens sont rompus! Lisez attentivement le manuel sur cette option!
Une de celles que j’aime bien (mais qui n’a pas fonctionné car la définition de REQUEST_URI dans config.php a cassé mon site) étend la classe Input:
class MY_Input extends CI_Input
{
function _sanitize_globals()
{
$this->allow_get_array = TRUE;
parent::_sanitize_globals();
}
}
Mais la meilleure méthode consiste à tester avec print_r ($ _ SERVER) à l'URL où vous avez besoin des variables GET. Voyez quelle option de protocole URI affiche vos variables GET et utilisez-la.
Dans mon cas, je peux voir ce dont j'ai besoin REQUEST_URI
// defeat stupid CI GET squashing!
parse_str($_SERVER['REQUEST_URI'], $_GET);
Cela place votre chaîne de requête dans le super global $ _GET pour cette instance de page (vous n'êtes pas obligé d'utiliser $ _GET, il peut s'agir de n'importe quelle variable.)
MODIFIER
Depuis que j'ai posté ceci, j'ai constaté qu'en utilisant REQUEST_URI, vous perdriez votre première clé de tableau de chaîne de requête à moins que vous ne supprimiez tout ce qui se trouvait avant le?. Par exemple, une URL du type/controller/method? One = 1 & two = 2 remplira le tableau $ _GET dans cet exemple avec array ('method? One' => 1, 'deux' => 2). Pour contourner cela, j'ai utilisé le code suivant:
parse_str(substr(strrchr($_SERVER['REQUEST_URI'], "?"), 1), $_GET);
Je suppose que j'aurais dû donner un exemple, alors voici:
class Pgate extends Controller {
function postback() {
parse_str(substr(strrchr($_SERVER['REQUEST_URI'], "?"), 1), $_GET);
$receipt = $this->input->xss_clean($_GET['receipt']);
}
}
Si vous voulez la chaîne de requête non analysée:
$this->input->server('QUERY_STRING');
// 98% functional
parse_str($_SERVER['REQUEST_URI'], $_GET);
C’est en fait le meilleur moyen de gérer le manque de prise en charge des chaînes de requête $ _GET dans CodeIgniter. En fait, j'ai moi-même inventé celle-ci, mais je me suis vite rendu compte de la même chose que Bretticus, à savoir que vous deviez modifier légèrement la façon dont vous traitiez la première variable:
// 100% functional
parse_str(substr(strrchr($_SERVER['REQUEST_URI'], "?"), 1), $_GET);
Cela ne serait qu'une question de temps avant d'y arriver moi-même, mais l'utilisation de cette méthode est une meilleure solution en une ligne pour tout le reste, y compris la modification de la bibliothèque d'URI existante, n'est isolée que pour le contrôleur où elle est s’applique et évite d’avoir à modifier la configuration par défaut (config.php)
$config['uri_protocol'] = "AUTO";
$config['enable_query_strings'] = FALSE;
Avec cela, vous avez maintenant les éléments suivants à votre disposition:
/controller/method?field=value
/controller/method/?field=value
Vérifier les résultats:
print_r($_GET); // Array ( [field] => value )
Ouvrez application/config/config.php et définissez les valeurs suivantes:
$config['uri_protocol'] = "PATH_INFO";
$config['enable_query_strings'] = TRUE;
Maintenant, les chaînes de requête devraient fonctionner correctement.
Si vous utilisez mod_rewrite pour supprimer le fichier index.php, vous pouvez utiliser le code suivant pour obtenir les variables GET (via $ this-> input-> get ()). En supposant la configuration par défaut, nommez le fichier MY_Input.php et placez-le dans votre répertoire application/libraries.
Utilisation: $ 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;
}
}
Merci à toutes les autres affiches. C’est ce qui m’a frappé:
$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>";
Sens, je pourrais maintenant faire:
$token = $_GET['token'];
Dans le .htaccess je devais changer:
RewriteRule ^(.*)$ /index.php/$1 [L]
à:
RewriteRule ^(.*)$ /index.php?/$1 [L]
Définissez votre fichier de configuration
$config['index_page'] = '';
$config['uri_protocol'] = 'AUTO';
$config['allow_get_array'] = TRUE;
$config['enable_query_strings'] = FALSE;
et fichier .htaccess (dossier racine)
<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>
Maintenant vous pouvez utiliser
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
du côté serveur:
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
}
Voici comment je l'ai fait récemment. J'espère que ça aide
<?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);
?>
appeler: http://www.mydomain.com/mycontroller/myfunction/?somestuff=x&morestuff=y
Vous pouvez créer une règle dans votre .htaccess pour empêcher votre MOD_REWRITE de se déclencher sur cette page spécifique. Cela devrait vous permettre d'utiliser le _GET.
Voici un exemple de travail complet sur la façon d’autoriser les chaînes de requête dans Codeignitor, comme sur la plateforme JROX. Ajoutez-le simplement à votre fichier config.php situé à l'adresse:
/system/application/config/config.php
Et puis vous pouvez simplement obtenir les chaînes de requête comme d'habitude en utilisant $ _GET ou la classe ci-dessous
$yo = $this->input->get('some_querystring', TRUE);
$yo = $_GET['some_querystring'];
Voici le code pour que tout fonctionne:
/*
|--------------------------------------------------------------------------
| 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);
Prendre plaisir :-)
Vous pouvez créer un hook pre_system. Dans la classe de hook que vous créez, vous pouvez récupérer les paramètres de requête souhaités et les ajouter à $ _POST pour un traitement de CI normal. Je l'ai fait pour un assistant jQuery Ajax.
Par exemple:
(Nommez ce fichier autocomplete.php ou ce que vous mettez comme nom de fichier dans le crochet)
<?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);
}
}
}
}
}
?>