Поиск доктрины

мы используем базу данных Zend Framework и доктрины. теперь моя проблема в том, что я хочу найти строку (например: testin'g) строку с «одинарными кавычками». Запрос Doctrine не может получить данные для запроса с соединениями и отлично работает с обычным запросом без соединений.

мой метод

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;

person user1155659    schedule 11.05.2011    source источник


Ответы (5)


Вместо addWhere попробуйте использовать andWhere()

person Roshan Wijesena    schedule 11.05.2011

я использовал такой пример

 $q = Doctrine_Query::create()
                            ->select('t.*')
                            ->from('TransferReason t');
            if ($searchValue != "") {
                $q->where($feildName.' LIKE ?', '%' . trim($searchValue) . '%');
            }
            $q->orderBy($orderField . ' ' . $orderBy);
person Roshan Wijesena    schedule 11.05.2011
comment
я хочу найти строку, например: testing для меня отлично ищет одну таблицу, но когда я присоединяюсь к нескольким таблицам, это не так. - person user1155659; 11.05.2011

здесь пример соединения

$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}%");
person Roshan Wijesena    schedule 11.05.2011
comment
да, для меня обычный поиск (например, строка: тестирование) работает, но когда строка содержит одинарную кавычку (например, строка: тестирование), она не работает. - person user1155659; 11.05.2011
comment
используйте функцию 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)); - person Roshan Wijesena; 11.05.2011
comment
я также использовал mysql_real_escape_string, но у меня это не работает, пожалуйста, взгляните на мой запрос один раз - person user1155659; 11.05.2011
comment
попробуйте выполнить свой запрос шаг за шагом, тогда вы найдете ошибку - person Roshan Wijesena; 11.05.2011
comment
сначала попробуйте только и посмотреть, выйдет ли - person Roshan Wijesena; 11.05.2011
comment
запрос работает нормально, пока строка поиска не будет снабжена одинарной кавычкой. Кроме того, все остальные случаи работают нормально. Я пытался использовать mysql_real_escape_string() и с дополнительными слэшами, но не работал - person user1155659; 11.05.2011

Doctrine обрабатывает внутреннее экранирование. Используйте запрос типа:

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

И символы будут экранированы, чтобы быть безопасными для вашей базы данных.

person Roshan Wijesena    schedule 11.05.2011

Может быть проблема во время присоединения, потому что я всегда пишу так:

$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, возможно, вам не хватает некоторых переменных.

Я предлагаю использовать case вместо многих if для $where (меньше строк кода :))

person Hubert.B    schedule 06.09.2016