2016-03-06 5 views
0

Я хочу использовать where для $ query.

foreach ($oppId as $o) { 

         $id = $o['opportunity_id']; 


         $query->Where("id=$id"); 


       } 

Когда я использую это. Все детали показаны

$query->orWhere("id=$id"); 

мне нужно получить этот запрос:

SELECT * FROM `opportunity` WHERE id =27 or id =28 

это все мои функции:

public function actionShow($type = 0, $city = 0, $client = 0) { 

    $query = (new \yii\db\Query())->select(['*'])->from('opportunity ')->innerJoin('profile_details', 'opportunity.user_id=profile_details.user_id')->orderBy('id desc'); 
    $query->Where('id !=-1'); 

    if (isset($_REQUEST['type'])) { 
     $type = $_REQUEST['type']; 



     if ($type != 0) { 
      $query->andWhere("project_type_id=$type"); 
     } 
    } 
    if (isset($_REQUEST['city'])) { 
     $city = $_REQUEST['city']; 


     if ($city != 0) { 
      $query->andWhere("state_id=$city"); 
     } 
    } 

    if (isset($_REQUEST['client'])) { 
     $client = $_REQUEST['client']; 


     if ($client != 0) { 

      $oppId = \app\models\OpportunityControl::find() 
        ->where('project_type_id = :project_type_id', [':project_type_id' => $client]) 
        ->all(); 

      foreach ($oppId as $o) { 


        $id = $o['opportunity_id']; 
        $query->orWhere("id=$id"); 
      } 
     } 
    } 

ответ

1

Вы очень не хотите использовать строки, чтобы добавить в запрос ни при каких обстоятельствах, что созрели для инъекции SQL. Я бы отформатировать его как это:

... 
$params = []; 
foreach ($oppId as $o) { 
    $params[] = $o->opportunity_id; 
} 
$query->andWhere(['in', 'id', $params]); 
... 

Вы должны также настроить другие параметры запроса, так что вы не передавая переменные в SQL с помощью строки.

if (isset($_REQUEST['type'])) { 
    $type = $_REQUEST['type']; 

    if ($type != 0) { 
     $query->andWhere(['project_type_id' => $type]); 
    } 
} 
if (isset($_REQUEST['city'])) { 
    $city = $_REQUEST['city']; 

    if ($city != 0) { 
     $query->andWhere(['state_id' => $city]); 
    } 
} 

См. Yii2 guide on using variables in queries за то, чего вы пытаетесь избежать здесь. В частности:

НЕ Встраивайте переменные непосредственно в состояние, подобное следующему, особенно если значения переменных исходят от входных данных конечных пользователей, поскольку это приведет к тому, что ваше приложение будет подвержено атакам SQL-инъекций.

// Dangerous! Do NOT do this unless you are very certain $status must be an integer. $query->where("status=$status");

0

я сделать это с Массивы

$query->where(['or',['id'=>27],['id'=>28]]); 

Но в вашем случае сохранить все идентификаторы в массиве не возможно кий, я делаю это со строкой внутри Еогеасп

$StringWhere=''; 
    $LastElement = end($oppId); 
     foreach ($oppId as $o) 
      { 
        $id = $o['opportunity_id']; 
        $StringWhere.=' id='.$id; 
        if($o!=$LastElement) 
        { 
         $StringWhere.=' or '; 
        } 
      } 
    $query->where($StringWhere); 
0
$query->where(['or',['id'=>27],['id'=>28]]); 

Я использую это, и это работает прекрасно, как упомянуто metola. :)

Смежные вопросы