在构建查询动态函数变量时逃避问题

时间:2012-10-07 22:54:26

标签: php sql codeigniter function activerecord

我正在开发一个CMS,它以不同的方式在模板页面系统上工作。

我有这个对象:

$structure = new stdClass;

$structure->homepage->news->method            = 'get_articles_by_page_name';
$structure->homepage->news->lang_key          = translate('home_news');
$structure->homepage->news->lang              = $lang;
$structure->homepage->news->add_media         = true;
$structure->homepage->news->media_type        = 'ibs';
$structure->homepage->news->limit             = '5';
$structure->homepage->news->order_by          = 'a.logical_date';
$structure->homepage->news->asc_des           = 'desc';
$structure->homepage->news->result_type       = 'result';

这有助于获取内容如下:

foreach ($structure as $page_template => $page_contents)
{
  // Call Customized Content for Homepage
  if($this->data['page_data']->page_view == $page_template) // homepage comes ok.
  {
    foreach ($page_contents as $view_var_name => $page_cdata)
    {
      $method = $page_cdata->method; // method names comes
      $page_cdata = substr(implode(",",(array) $page_cdata),(strlen($method)+1)) . '\'';
      //Returns as expected:
      //**'Haberler','tr','1','ibs','5','a.logical_date','desc','result'**

      $this->data[$view_var_name] = $this->publish->$method($page_cdata);
      vdebug($page_cdata);
    }
  }
}

它假设将它们称为模型函数:

function get_articles_by_page_name( $lang_key='',$lang='en',$add_media=true,
 media_type='ibs',$limit='0',$order_by='a.logical_date',$asc_desc='desc',$result_type='result')

然而,有一个问题。当我回到最后一个工作查询时,它说:

SELECT * FROM (`page`) JOIN `page_lang` ON `page`.`id_page` = `page_lang`.`id_page` WHERE `page_lang`.`title` = '\'News\',\'tr\',\'1\',\'ibs\',\'5\',\'a.logical_date\',\'desc\',\'result\''

不可能是这样的。逗号之间的所有内容都是方法函数的参数。是什么导致这个,任何想法?

get_articles_by_page_name的内容:

function get_articles_by_page_name ($lang_key='',$lang='tr',$add_media=true,$media_type='ibs',$limit='0',$order_by='a.logical_date',$asc_desc='desc',$result_type='result')
{
  // Define variables
  $id_page    = ''; 
  $result     = '';

  // Get Page Data
  $page_name    = $lang_key;
  $get_page     = $this->vayes->getJoined('page','page_lang','id_page','','',array('page_lang.title'=>$page_name),'row');
  if($get_page)
  {
    $id_page  = $get_page->id_page;
    $result   = $this->publish->get_articles($lang,$id_page,null,false,'',$order_by,$asc_desc,$limit,'result');
  }
  else
  {
    $result = array('No id_page specified');
  }

  return $result;
}

get_articles的内容:

function get_articles($lang='tr',$id_page,$id_article=null,$incl_media=true,$media_type='',$order_by='a.logical_date',$asc_desc='desc',$limit='0',$result_type='result')
{
  $this->db->select('*');
  $this->db->from('article a');
  $this->db->join('article_lang b','b.id_article=a.id_article','left outer');

  if($incl_media) {
    $this->db->join('article_media c','c.id_article=b.id_article','left outer');
    $this->db->join('media d','d.id_media=c.id_media','left outer'); 
  }

  if($id_article == null) { $this->db->where('a.id_page',$id_page); }
  else /*------------->*/ { $this->db->where('a.id_article',$id_article); }

  $this->db->where('b.lang',$lang);
  $this->db->where('b.online',1);

  if(($incl_media == true) AND $media_type != '' ) $this->db->where('c.usage',$media_type);

  // Order Results
  $this->db->order_by($order_by,$asc_desc);

  // Limit Results
  if ($limit) $this->db->limit($limit);

  $query = $this->db->get();

  if($query->num_rows() > 0)
  {
    $result = $query->$result_type();
    $query->free_result();
    return $result;
  }
  return false;
}

1 个答案:

答案 0 :(得分:0)

尝试stripslashes()

在5.2.17中尝试在数组上使用stripslashes会返回字符串“Array”,但在5.3.6中它返回NULL。所以在数组上使用stripslashes(),你需要递归地执行它;

    function stripslashes_deep($value)
{
    $value = is_array($value) ?
                array_map('stripslashes_deep', $value) :
                stripslashes($value);

    return $value;
}

// Example
$array = array("f\\'oo", "b\\'ar", array("fo\\'o", "b\\'ar"));
$array = stripslashes_deep($array);

// Output
print_r($array);