首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >奇怪的urldecode困境

奇怪的urldecode困境
EN

Stack Overflow用户
提问于 2011-11-02 23:31:45
回答 2查看 403关注 0票数 0

我正在使用这个urlencoded字符串将变量传递给另一个页面

代码语言:javascript
复制
http://localhost:8888/proseat/index.php/configure/ve/Honda/Civic+%28sedan%29/2007

当我使用urldecode取回变量时,一切似乎都很正常。我在这里使用的是codeigniter,所以在打印出解码后的变量后,我会看到以下内容:

代码语言:javascript
复制
Honda
Civic (sedan)
2007

当我将变量传递给sql使用时,我什么也得不到。奇怪的是,如果我传递字符串"Civic (sedan)“,一切都会正常工作。

首先,我对url进行编码:

代码语言:javascript
复制
function fr ()
{
    if ( isset($_POST) )
    {
        $make              = (urlencode($this->input->post('make')));
        $model              = (urlencode($this->input->post('model'))); 
        $year              = (urlencode($this->input->post('year')));   


        redirect('configure/ve/'.$make. '/' . $model. '/' .$year);


    }       
}

然后,我解码并传递给另一个函数进行处理。

代码语言:javascript
复制
function ve ($make, $model, $year) 
{
    if ( isset($make,$model,$year) )
    {

        $data['make']               = trim(urldecode($make));   
        $data['model']              = trim(urldecode($model));  
        $data['year']               = trim(urldecode($year));   

        $data['makes']              = $this->model_cars->getAllMakes(); //get all the years makes and models
        $data['models']             = $this->model_cars->getAllModels($data['make']);
        $data['years']              = $this->model_cars->getAllYears($data['make'], $data['model']);

        $this->load->view($this->session->userdata('language').'/includes/view_header',$tags);
        $this->load->view($this->session->userdata('language').'/configure/view_configure',$data);
        $this->load->view($this->session->userdata('language').'/includes/view_footer');

    }
    else
        //stuff 
}

变量的转储:

代码语言:javascript
复制
        echo var_dump($data['make']).'<br>';
        echo var_dump($data['model']).'<br>';
        echo var_dump($data['year']).'<br>';

这就是它的结果

代码语言:javascript
复制
string(5) "Honda" 
string(21) "Civic (sedan)" 
string(4) "2007" 

最后,这是由于某种原因返回NULL的函数。

代码语言:javascript
复制
function getAllYears ($make, $model) 
{  
    $result = NULL;
    $sql = "select distinct year from seatcover_listings where make=? and model=? order by year desc";

    $query = $this->db->query($sql, array(($make), ($model)));
    if ($query->num_rows() > 0) $result = $query->result_array();  //the format of the returned var will be $somevar['name']
    return $result;
}   

我知道这个函数运行得很好,因为如果我使用下面这行代码,一切都运行得很好:

代码语言:javascript
复制
$this->model_cars->getAllYears($data['make'], 'Civic (sedan)');

在使用htmlspecialchars_decode之后,我尝试过使用urldecode,但仍然没有结果。我不敢相信我花了多少时间试图弄清楚这一点。请帮帮我。

这是var_dump($sql,$query)的结果;

代码语言:javascript
复制
string(88) "select distinct year from seatcover_listings where make=? and model=? order by year desc" object(CI_DB_mysqli_result)#22 (8) { ["conn_id"]=> object(mysqli)#15 (17) { ["affected_rows"]=> int(0) ["client_info"]=> string(6) "5.1.44" ["client_version"]=> int(50144) ["connect_errno"]=> int(0) ["connect_error"]=> NULL ["errno"]=> int(0) ["error"]=> string(0) "" ["field_count"]=> int(1) ["host_info"]=> string(25) "Localhost via UNIX socket" ["info"]=> NULL ["insert_id"]=> int(0) ["server_info"]=> string(6) "5.1.44" ["server_version"]=> int(50144) ["sqlstate"]=> string(5) "00000" ["protocol_version"]=> int(10) ["thread_id"]=> int(270) ["warning_count"]=> int(0) } ["result_id"]=> object(mysqli_result)#26 (5) { ["current_field"]=> int(0) ["field_count"]=> int(1) ["lengths"]=> NULL ["num_rows"]=> int(0) ["type"]=> int(0) } ["result_array"]=> array(0) { } ["result_object"]=> array(0) { } ["custom_result_object"]=> array(0) { } ["current_row"]=> int(0) ["num_rows"]=> int(0) ["row_data"]=> NULL }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-03 00:54:50

我认为问题出在变量的值上。请注意,您的'model‘变量打印为

代码语言:javascript
复制
string(21) "Civic (sedan)"

然而,字符串"Civic (sedan)“只包含13个字符,因此填充了其他字符,这使得它长达21个字符。在使用变量之前,您需要找出填充是什么,并去掉它。

票数 0
EN

Stack Overflow用户

发布于 2011-11-03 00:55:38

尝试为getAllYears方法提供默认值。此外,我不确定数组值周围的括号是否合法;注意result_array()返回整个结果集;查看代码中的注释,您似乎要么谈论在循环后检索值,要么使用row_array(),它返回单行。

代码语言:javascript
复制
function getAllYears ($make = '', $model = '') 
{  
    $result = NULL;

    $sql = "SELECT DISTINCT year FROM seatcover_listings WHERE make=? and model=? ORDER BY year DESC";

    $query = $this->db->query($sql, array($make,$model));

    if ($query->num_rows() > 0) 
    {
        $result = $query->result_array();  //the format of the returned var will be $somevar['name']
    }
    return $result;
}   

您还可以使用AR构建条件查询:

代码语言:javascript
复制
$this->db->select('year');
$this->db->distinct();
$this->db->from('seatcover_listings');
if($make != '')
{
    $this->db->where('make',$make);
}
if($model != '')
{
    $this->db->where('model',$model);
}
$this->db->order_by('year','DESC');
$query = $this->db->get();
$result = $query->result_array();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7982982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档