CodeIgniter PHP Framework - sorgu dize almak için Need

12 Cevap php

Ben kullanarak bir e-ticaret sitesi oluştururken kulüpler CodeIgniter.

Nasıl sorgu dizesi almak gerekir?

Ben bir Saferpay ödeme ağ geçidi kullanıyorum. Geçidi tepkisi şu şekilde olacak:

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

Yanıtını işlemek için ben sorgu dizesi veri almak gerekiyor.


Üzgünüm, ben açıkça sorun açıkladı değil. Ödeme yapıldıktan sonra ödeme sitesinden yanıt alırken ben bir 'Sayfa bulunamadı' hatası alıyorum.

I-uri_protocol = 'PATH_INFO' ve enable_query_strings = 'TRUE' ile de sağlayarak çalıştık config.php. Googling iken ben htaccess rewrite kullanırsanız bu iş olmaz bulundu.

Zaten yapılandırma girişlerini değiştirmeyi denedim, ama çalışmıyor.

12 Cevap

Böyle alabilirsiniz:

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

See this for more info.

Ben şimdi bir yıldır CodeIgniter'ı kullanıyoruz. Çoğunlukla ben gerçekten seviyorum (Ben foruma katkıda bulunmak ve ben her durumda kullanabilirsiniz) ama ben kılavuzunda bu ifadenin ARROGANCE NEFRET:

Destroys the global GET array. Since CodeIgniter does not utilize GET strings, there is no reason to allow it.

Eğer bir CodeIgniter uygulama GET gerek asla karine ahmakça olduğunu! Zaten birkaç gün içinde, (Ben bir milyon diğerleri vardır eminim.) Tahmin et ne oldu, onlar GET PayPal ve ClickBank sonrası geri sayfaları ile uğraşmak zorunda kalmıştım!

Orada bu GET Ezici durdurmak için yollar vardır, ama onlar başka şeyler berbat eğilimindedir şeylerdir. Ne duymak istemiyorum size querystrings etkin ve şimdi bağlantılar koptu çünkü tüm görüşlerinizi kodlamak zorunda olduğunu! Bu seçeneği kılavuzu dikkatle okuyun!

Ben (config.php REQUEST_URI ayarı sitemde kırdı çünkü ama işe yaramadı) gibi biri Girdi sınıfını uzanan:

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

Ama en iyi hiç akıllıca yolu GET değişkenleri ihtiyaç URL'den print_r ($ _SERVER) ile test etmektir. URI Protokol GET değişkenleri gösterir görmek ve kullanmak.

In my case, I can see what I need in REQUEST_URI

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

Bu (Bunu herhangi bir değişken olabilir, $ _GET kullanmak zorunda değilsiniz.) O sayfa örneği için süper global $ _GET içine geri sorgu dizesi places

DÜZENLEME

Bu nakil beri REQUEST_URI kullanırken önce her şeyi kaldırmak sürece, size ilk sorgu dizesi dizi anahtarına kaybedecek bulundu?. Örneğin, bir URL / denetleyici / yöntemi gibi? = 1 tek & = 2 iki dizi ('yöntemi? Biri' => 1, 'iki' => 2) ile bu örnekte $ _GET dizi doldurmak olacaktır. Bu almak için, ben aşağıdaki kod kullanılır:

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

Ben bir örnek vermiş olmalı herhalde, bu yüzden buraya:

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

Eğer çözümlenmemiş sorgu dizesi isterseniz:

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

Application / config / config.php açın ve aşağıdaki değerleri ayarlayın:

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

$config['enable_query_strings'] = TRUE; 

Şimdi sorgu dizeleri iyi çalışması gerekir.

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

Bu aslında CodeIgniter'daki $ _GET sorgu dizeleri için destek eksikliği işlemek için en iyi yoldur. Ben aslında kendi başıma bir kendimi geldi, ama yakında Bretticus hafifçe ilk değişkeni tedavi yolunu değiştirmek zorunda yaptım aynı şeyi fark ettim:

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

Sadece ben kendimi var önce bir zaman meselesi olacak, ama bu yöntemi kullanarak mevcut tanım kitaplığı değiştirme dahil olmak üzere orada her şey, daha iyi bir tek satır çözümdür, o sadece kontrolöre izole edilir uygulanabilir, ve ortadan kaldırır varsayılan yapılandırmasında herhangi bir değişiklik yapmak zorunda (config.php)

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

Bu ile, artık senin emrinde şu var:

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

Sonuçları doğrulamak:

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

Diğer tüm posterleri teşekkürler. Bu benim için isabetli budur:

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

Anlamı, şimdi yapabilirsiniz:

$token = $_GET['token'];

. Htaccess i değiştirmek zorunda kaldı:

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

için:

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

Bunu belirli bir sayfada ateş sizin mod_rewrite'ın önlemek için. Htaccess bir kural yapabilir. Yani _GET kullanmak için izin vermelidir.

Eğer index.php dosyasını kaldırmak için mod_rewrite kullanarak ediyorsanız, (bu-> input-> () $ olsun aracılığıyla) GET değişkenleri elde etmek için aşağıdaki kodu kullanabilirsiniz. Varsayılan yapılandırma varsayarsak, dosya MY_Input.php isim ve uygulama / kütüphaneleri dizine yerleştirebilirsiniz.

Kullanımı: $ 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;
    }


}

Aşağıdaki bağlantıyı deneyin.

It seemed to help me in a similar situation with init tests. I will see how it goes live. Codeigniter: Mixing segment-based URL with querystrings .

Umarım işe yarar.

İşte ben son zamanlarda bunu nasıl olduğunu. Umarım yardımcı olur

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

aramak için: http://www.mydomain.com/mycontroller/myfunction/?somestuff=x&morestuff=y

Bir pre_system kanca oluşturabilirsiniz. Oluşturduğunuz kanca sınıfta, istenen sorgu params kapmak ve normal CI işlem için $ _POST ekleyebilirsiniz. Ben bir jQuery Ajax yardımcısı için yaptım.

Örneğin:

(Bu dosya autocomplete.php veya ne olursa olsun kanca dosya adı olarak koymak Ad)

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

?>

İşte JROX platformda gibi, CodeIgnitor yılında querystrings nasıl izin tam çalışan bir örnektir. Basitçe bulunan config.php bunu ekleyin:

/system/application/config/config.php 

Ve o zaman sadece aşağıdaki $ _GET veya sınıfını kullanarak normal gibi querystrings alabilirsiniz

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

İşte tüm iş yapmak için kod:

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

:-) Enjoy