ver query not insert_batch from consulta batch php codeigniter frameworks

query - CodeIgniter PHP Framework-Necesita obtener cadena de consulta



ver consulta codeigniter (12)

Abra application / config / config.php y configure los siguientes valores:

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

Ahora las cadenas de consulta deberían funcionar bien.

Estoy creando un sitio de comercio electrónico usando CodeIgniter .

¿Cómo debería obtener la cadena de consulta?

Estoy usando una pasarela de pago Saferpay . La respuesta de la puerta de enlace será la siguiente:

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

Para manejar la respuesta, necesito obtener los datos de la cadena de consulta.

Lo siento, no he explicado el problema claramente. Recibo un error de "Página no encontrada" al obtener la respuesta del sitio de pago después del pago.

He intentado habilitar con uri_protocol = ''PATH_INFO'' y enable_query_strings = ''TRUE'' en config.php . Mientras buscaba en Google, descubrí que esto no funcionará si utilizo htaccess rewrite.

Ya he intentado cambiar las entradas de configuración, pero no funciona.


Aquí hay un ejemplo completo de cómo permitir querystrings en Codeignitor, como en la plataforma JROX. Simplemente agregue esto a su archivo config.php ubicado en:

/system/application/config/config.php

Y luego simplemente puede obtener las cadenas de consulta como normal usando $ _GET o la clase de abajo

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

Aquí está el código para que todo funcione:

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

Disfruta :-)


Así es como lo hice recientemente. Espero eso ayude

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

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


Establezca su archivo de configuración

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

y archivo .htaccess (carpeta raíz)

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

Ahora puedes usar

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

lado del servidor:

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 }


Gracias a todos los otros carteles. Esto es lo que me llamó la atención:

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

Es decir, ahora podría hacer:

$token = $_GET[''token''];

En el .htaccess tuve que cambiar:

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

a:

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


He estado usando CodeIgniter por más de un año. En su mayor parte me gusta mucho (contribuyo al foro y lo uso en cada instancia que puedo) pero ODIO la ARROGANCIA de esa declaración en el manual:

Destruye la matriz global GET. Como CodeIgniter no utiliza cadenas GET, no hay ninguna razón para permitirlo.

¡La presunción de que nunca necesitará GET en una aplicación CodeIgniter es asquerosa! Ya en solo unos días, tuve que lidiar con páginas posteriores de PayPal y ClickBank (estoy seguro de que hay un millón más). Adivina qué, usan GET !!!

Hay formas de detener este aplastamiento GET, pero son cosas que tienden a arruinar otras cosas. Lo que no quiere escuchar es que tiene que recodificar todas sus vistas porque habilitó las cadenas de consulta y ahora sus enlaces están rotos. ¡Lea el manual cuidadosamente sobre esa opción!

Uno que me gusta (pero que no funcionó porque establecer REQUEST_URI en config.php rompió mi sitio) está ampliando la clase de entrada:

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

Pero la mejor manera sin sentido es probar con print_r ($ _ SERVER) en la URL donde necesita las variables GET. Vea qué opción de protocolo URI muestra sus variables GET y úsela.

En mi caso, puedo ver lo que necesito en REQUEST_URI

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

Esto coloca su cadena de consulta nuevamente en $ _GET súper global para esa instancia de página (no tiene que usar $ _GET, puede ser cualquier variable).

EDITAR

Desde que publiqué esto, descubrí que al usar REQUEST_URI, perderá su primera clave de matriz de cadena de consulta a menos que elimine todo antes del?. Por ejemplo, una URL como / controller / method? One = 1 & two = 2 rellenará la matriz $ _GET en este ejemplo con array (''method? One'' => 1, ''two'' => 2). Para evitar esto, utilicé el siguiente código:

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

Supongo que debería haber dado un ejemplo, así que aquí va:

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


Puede crear un gancho pre_system. En la clase de enlace que crea, puede tomar los parámetros de consulta deseados y agregarlos al $ _POST para el procesamiento de CI normal. Hice esto para un jQuery Ajax helper.

Por ejemplo:

(Nombre este archivo autocomplete.php o lo que sea que ponga como nombre de archivo en el gancho)

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


Puede establecer una regla en .htaccess para evitar que MOD_REWRITE se active en esa página específica. Eso debería permitirle usar _GET.



Si desea la cadena de consulta sin analizar:

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


Si está utilizando mod_rewrite para eliminar el archivo index.php, puede usar el siguiente código para obtener las variables GET (a través de $ this-> input-> get ()). Asumiendo la configuración predeterminada, nombre el archivo MY_Input.php y colóquelo en su directorio de aplicaciones / bibliotecas.

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


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

De hecho, esta es la mejor manera de manejar la falta de soporte para cadenas de consulta $ _GET en CodeIgniter. De hecho, se me ocurrió esto por mi cuenta, pero pronto me di cuenta de lo mismo que Bretticus en el sentido de que tenía que modificar ligeramente la forma en que trataba la primera variable:

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

Solo iba a ser cuestión de tiempo antes de llegar a él, pero usar este método es una mejor solución de una sola línea para todo lo demás, incluida la modificación de la biblioteca de URI existente, está aislado solo para el controlador donde está aplicable, y elimina la necesidad de realizar cambios en la configuración predeterminada (config.php)

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

Con esto, ahora tiene a su disposición lo siguiente:

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

Verificar los resultados:

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