2011-05-11 86 views
0

我们使用zend的框架和工作原理数据库。 现在我的问题是我想搜索一个字符串(例如:testin'g)与“单引号”字符串。 原则查询无法为连接的查询检索数据,并且可以正常查询且无连接。学说---搜索

我的方法是相反addWhere的

public function getNewsListGrid($campid,$currentPage,$resultsPerPage,$quickSearchType,$queryv,$sortName,$sortOrder,$letterPressed) 
{ 
    $query = new Doctrine_Query(); 
    $whereCond =''; 
    $where='eng.id='.$campid; 
    $select=''; 
    $search = ''; 

    if($letterPressed == 'All') 
    { 
     $where .=""; 
    } 
    else if($letterPressed == 'Radian6') 
    { 
     $where .=" AND c.news_type = 1"; 
    } 
    else if($letterPressed == 'Google News') 
    { 
     $where .=" AND c.news_type = 3"; 
    } 
    else if($letterPressed == 'Google Blogs') 
    { 
     $where .=" AND c.news_type = 4"; 
    } 
    else if($letterPressed == 'Hide Twitter') 
    { 
     $where .=" AND c.url NOT LIKE '%twitter.com%'"; 
    } 
    else if($letterPressed == 'Hide Facebook') 
    { 
     $where .=" AND c.url NOT LIKE '%facebook.com%'"; 
    } 
    else if($letterPressed == 'Hide Facebook-twitter') 
    { 
     $where .=" AND c.url NOT LIKE '%twitter.com%' AND c.url NOT LIKE '%facebook.com%'"; 
    } 
    else if($letterPressed == 'Show Twitter') 
    { 
     $where .=" AND c.url LIKE '%twitter.com%'"; 
    } 
    else if($letterPressed == 'Show Facebook') 
    { 
     $where .=" AND c.url LIKE '%facebook.com%'"; 
    } 
    else if($letterPressed == 'show Facebook-twitter') 
    { 
     $where .=" AND c.url LIKE '%twitter.com%' OR c.url LIKE '%facebook.com%'"; 
    } 


    if($queryv!='' && (trim($letterPressed) != 'Law' && trim($letterPressed) != 'Ls Translate')){ 

     $search = ' c.title like "%'.mysql_real_escape_string($queryv).'%" '; 
    } 

    $select='c.id, c.campaign_id, c.title as title, c.domain, c.news_type,c.url, c.active, c.article_date, c.created_date, c.modified_date, t.language_id, t.tr_translated_date, t.tr_translated_by, t.translation_state, t.tr_title, t.raw_title'; 
    if(trim($letterPressed) == 'Original') 
    { 
     $select='c.id, c.campaign_id, c.title as title, c.domain, c.news_type,c.url, c.active, c.article_date, c.created_date, c.modified_date, t.language_id, t.tr_translated_date, t.tr_translated_by, t.translation_state'; 
    } 
    if(trim($letterPressed) == 'Law') 
    { 
     $select='c.id, c.campaign_id, c.domain, c.news_type,c.url, c.active,c.article_date, c.created_date, c.modified_date, t.raw_title as title, t.language_id, t.tr_translated_date, t.tr_translated_by, t.translation_state'; 
     if($queryv!='') 
      $search = ' t.raw_title like "%'.mysql_real_escape_string($queryv).'%" '; 
    } 
    if(trim($letterPressed) == 'Ls Translate') 
    { 
     $select='c.id, c.campaign_id, c.domain, c.news_type,c.url, c.active, c.article_date, c.created_date, c.modified_date, t.tr_title as title, t.language_id, t.tr_translated_date, t.tr_translated_by, t.translation_state'; 
     $where .=" AND t.translation_state = 1"; 
     if($queryv!='') 
      $search = ' t.tr_title like "%'.mysql_real_escape_string($queryv).'%" '; 
    } 
    $whereCond.=$where; 

    $query->select($select) 
      ->from('News c') 
      ->leftJoin('c.TranslatedNews t') 
      ->leftJoin('c.Campaigns eng') 
      ->where($whereCond) 
      ->addWhere('eng.tr_language_id=t.language_id') 
      ->orderBy('c.'.$sortName. ' ' . $sortOrder) 
      ->groupBy('c.title') 
      ->addGroupBy('c.url'); 
     if(!empty($search)) 
      $query->addWhere($search); 
     //echo $query->getSqlQuery();exit; 
     /* 
          here when i output query and run in any query browser it works fine. 
     */ 
      $pager = new Doctrine_Pager($query,$currentPage, $resultsPerPage);// here it fails to retrive data 

    return $pager;//print_r($pager);exit; 

回答

1

尝试使用andWhere()

+0

我试过,但没有工作 – user1155659 2011-05-11 09:28:57

0

我用这样的

$q = Doctrine_Query::create() 
          ->select('t.*') 
          ->from('TransferReason t'); 
      if ($searchValue != "") { 
       $q->where($feildName.' LIKE ?', '%' . trim($searchValue) . '%'); 
      } 
      $q->orderBy($orderField . ' ' . $orderBy); 
+0

我要搜索的字符串,例如使用情况,而不是多个:testin'g对我来说,搜索罚款单表,但是当我加入多张桌子时,它并不是。 – user1155659 2011-05-11 09:36:07

0

这里例如加入例如

$q = Doctrine_Query::create() 
            ->from('TransferRequest t') 
            ->leftJoin('t.Employee e ON t.emp_number = e.emp_number') 
            ->leftJoin('e.CompanyStructure c ON e.work_station = c.id') 
            ->where("c.title LIKE ?", "%{$cond}%"); 
+0

yaa对于我正常的搜索(ex字符串:测试)的作品,但当字符串包含单引号(ex字符串:testin'g),它不起作用 – user1155659 2011-05-11 09:42:36

+0

使用mysql_real_escape_string函数 $ query = sprintf(“SELECT * FROM users WHERE user ='%s'AND password ='%s'“, mysql_real_escape_string($ user), mysql_real_escape_string($ password)); – 2011-05-11 09:44:22

+0

我用mysql_real_escape_string也不过它dosent工作,我请看看我的查询一次 – user1155659 2011-05-11 09:53:09

0

主义处理escapi内部。使用类似的查询:

$q = Doctrine_Query::create()->from('MyTable m')->where('m.column = ?', '?´## \'´^#11 " dfvü:?=._ßß?(%%/'); 

和人物将被转义成为你的数据库的安全。

0

月的问题是接合期间,因为我总是写这样的:

$query->select($select) 
     ->from('News', 'c') 
     ->leftJoin('c.TranslatedNews', 't') 
     ->leftJoin('c.Campaigns', 'eng') 
     ->where($whereCond) 
     ->andWhere('eng.tr_language_id=t.language_id') 
     ->orderBy('c.'.$sortName. ' ' . $sortOrder) 
     ->groupBy('c.title, c.url'); 
    if(!empty($search)) 
     $query->addWhere($search); 

我找不到$ sortName和$中将sortOrder所以也许你错过了一些变数。

我建议如果对$其中(更少的代码行:))