2017-02-08 27 views
1

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

Wrong number of parameters

Запрос следующим образом:

$start = new DateTime('first monday of January 2016'); 
$end = new DateTime('last day of December 2016'); 

$sql = "SELECT ".$generalLand." 
         product AS product, 
         Week AS label, 
         ROUND(SUM(harvest)/SUM(production),2) AS value 
        FROM (
          (
           SELECT ".$fieldLand." 
            pr_products.product, 
            CONCAT(YEAR(:dates),'-', LPAD(WEEK(:dates1),2,'0')) AS Week, 
            SUM(IF(sw_sowing.type = 'SW', sw_sowing.quantity,0)) AS PlantSowing, 
            SUM(IF(ROUND(DATEDIFF(TIMESTAMPADD(DAY,(6-WEEKDAY(:dates2)),:dates3), sw_sowing.date)/7) >= pr_products.week_production AND sw_sowing.type = 'SW',sw_sowing.quantity,0)) AS production, 
            0 AS Harvest 
           FROM (
             SELECT max(sw_sowing.id) AS id 
             FROM sw_sowing 
             WHERE sw_sowing.status != 0 
             AND sw_sowing.date <= TIMESTAMPADD(DAY,(6-WEEKDAY(:dates4)),:dates5) 
             GROUP BY sw_sowing.id_production_unit_detail 
            ) AS sw 
           INNER JOIN sw_sowing ON sw_sowing.id = sw.id 
           INNER JOIN pr_products ON pr_products.id = sw_sowing.id_product 
           INNER JOIN pr_varieties ON sw_sowing.id_variety = pr_varieties.id 
           ".$innerSowing." 
           WHERE pr_varieties.code != 1 
           AND sw_sowing.id_product = 1 
           AND sw_sowing.status = 100 
           AND sw_sowing.id_tenant = :id_tenant 
           ".$consultSowing." 
           GROUP BY pr_products.product 
           HAVING plantSowing > 0 
           ORDER BY pr_products.product 
         ) 
          UNION ALL 
          (
           SELECT ".$fieldLand." 
             pr_products.product, 
             CONCAT(YEAR(:dates6),'-', LPAD(WEEK(:dates7),2,'0')) AS Week, 
             0 AS plantSowing, 
             0 AS Production, 
             SUM(pf_harvest.quantity) AS Harvest 
           FROM pf_harvest 
           INNER JOIN pr_products ON pr_products.id = pf_harvest.id_product 
           INNER JOIN pr_varieties ON pr_varieties.id = pf_harvest.id_variety 
           INNER JOIN pf_performance ON pf_performance.id = pf_harvest.id_performance 
           ".$innerHarvest." 
           WHERE pf_harvest.date BETWEEN TIMESTAMPADD(DAY,(0-WEEKDAY(:dates8)),:dates9) 
           AND TIMESTAMPADD(DAY,(6-WEEKDAY(:dates10)),:dates11) 
           AND pr_varieties.code != 1 
           AND pf_harvest.id_product = 1 
           AND pf_performance.status = 100 
           ".$consultHarvest." 
           AND pf_harvest.id_tenant = :id_tenant1 
           GROUP BY pr_products.product 
           ORDER BY pr_products.product 
          ) 
         ) AS sc 
        GROUP BY product, label 
        ORDER BY label"; 

     $statement = $this->db->prepare($sql); 
     $id_tenant = $this->getIdTenant(); 
     foreach($datePeriod AS $dates){ 

      $values = [ 
      ':dates'  => $dates->format('Y-m-d'), 
      ':dates1'  => $dates->format('Y-m-d'), 
      ':dates2'  => $dates->format('Y-m-d'), 
      ':dates3'  => $dates->format('Y-m-d'), 
      ':dates4'  => $dates->format('Y-m-d'), 
      ':dates5'  => $dates->format('Y-m-d'), 
      ':dates6'  => $dates->format('Y-m-d'), 
      ':dates7'  => $dates->format('Y-m-d'), 
      ':dates8'  => $dates->format('Y-m-d'), 
      ':dates9'  => $dates->format('Y-m-d'), 
      ':dates10' => $dates->format('Y-m-d'), 
      ':dates11' => $dates->format('Y-m-d'), 
      ':id_tenant' => $id_tenant, 
      ':id_tenant1' => $id_tenant 

      ]; 

      $result = $this->db->executePrepared($statement , $values); 

     } 

I понять это из-за количества связей, которые у меня есть в запросе.

Каждый :date имеет одинаковую дату, но я ставлю другое значение, потому что переменные не могут быть повторены.

Я также пытаюсь улучшить свой запрос, потому что я использую цикл, который показывает мне даты каждого понедельника года и тех дат, которые я задал в запросе.

По этой причине я консультировался таким образом

Если кто-нибудь может дать мне предложение, я был бы признателен.

С уважением!

+1

Предлагаем прочитать: [Как создать минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve) – wogsland

+0

Да, я могу дать вам предложение - не ожидайте, что кто-нибудь сможет чтобы помочь вам с таким вопросом. – Hogan

+0

Прошу прощения, я собираюсь обновить свой вопрос –

ответ

0

в цикле Еогеаспа:

foreach($datePeriod AS $dates){ 

      $values = [ 
      ':dates'  => $dates->format('Y-m-d'), 
      ':dates1'  => $dates->format('Y-m-d'), 
      ':dates2'  => $dates->format('Y-m-d'), 
      ':dates3'  => $dates->format('Y-m-d'), 
      ':dates4'  => $dates->format('Y-m-d'), 
      ':dates5'  => $dates->format('Y-m-d'), 
      ':dates6'  => $dates->format('Y-m-d'), 
      ':dates7'  => $dates->format('Y-m-d'), 
      ':dates8'  => $dates->format('Y-m-d'), 
      ':dates9'  => $dates->format('Y-m-d'), 
      ':dates10' => $dates->format('Y-m-d'), 
      ':dates11' => $dates->format('Y-m-d'), 
      ':id_tenant' => $id_tenant, 
      ':id_tenant1' => $id_tenant 

      ]; 

      $result = $this->db->executePrepared($statement , $values); 

} 

дата $ становится отформатирована в 11 раз. Вы понимаете, что это одна и та же дата, каждый раз правильная? Это может быть проблема?

Возможно, вы имели в виду нечто подобное?

foreach ($datePeriod as $dates) { 
    $dateHolder[] = $dates->format('Y-m-d') 
} 

$i = 0; 

$values = [ 
    ':dates'  => $dateHolder[$i++], 
    ':dates1'  => $dateHolder[$i++], 
    ':dates2'  => $dateHolder[$i++], 
    ':dates3'  => $dateHolder[$i++], 
    ':dates4'  => $dateHolder[$i++], 
    ':dates5'  => $dateHolder[$i++], 
    ':dates6'  => $dateHolder[$i++], 
    ':dates7'  => $dateHolder[$i++], 
    ':dates8'  => $dateHolder[$i++], 
    ':dates9'  => $dateHolder[$i++], 
    ':dates10' => $dateHolder[$i++], 
    ':dates11' => $dateHolder[$i++], 
    ':id_tenant' => $id_tenant, 
    ':id_tenant1' => $id_tenant 
]; 

$result = $this->db->executePrepared($statement , $values); 
+0

Мне нужна одна и та же дата в каждой переменной, поэтому я сделал это, но я собираюсь пересмотреть! –

+0

Если вам нужна одна и та же дата в каждой переменной, просто сделайте переменную «дата» и используйте ее вместо 11 отдельных переменных. –

+0

Да, но я использую phalcon и он позволяет только одну переменную в запросе –

0

Я знаю, что это проблема:

Когда я использую executePrepared мне нужно использовать три параметра, так что в моем случае мне нужно использовать это:

$start = new DateTime('first monday of January 2016'); 
$end = new DateTime('last day of December 2016'); 

$sql = "SELECT ".$generalLand." 
         product AS product, 
         Week AS label, 
         ROUND(SUM(harvest)/SUM(production),2) AS value 
        FROM (
          (
           SELECT ".$fieldLand." 
            pr_products.product, 
            CONCAT(YEAR(:dates),'-', LPAD(WEEK(:dates1),2,'0')) AS Week, 
            SUM(IF(sw_sowing.type = 'SW', sw_sowing.quantity,0)) AS PlantSowing, 
            SUM(IF(ROUND(DATEDIFF(TIMESTAMPADD(DAY,(6-WEEKDAY(:dates2)),:dates3), sw_sowing.date)/7) >= pr_products.week_production AND sw_sowing.type = 'SW',sw_sowing.quantity,0)) AS production, 
            0 AS Harvest 
           FROM (
             SELECT max(sw_sowing.id) AS id 
             FROM sw_sowing 
             WHERE sw_sowing.status != 0 
             AND sw_sowing.date <= TIMESTAMPADD(DAY,(6-WEEKDAY(:dates4)),:dates5) 
             GROUP BY sw_sowing.id_production_unit_detail 
            ) AS sw 
           INNER JOIN sw_sowing ON sw_sowing.id = sw.id 
           INNER JOIN pr_products ON pr_products.id = sw_sowing.id_product 
           INNER JOIN pr_varieties ON sw_sowing.id_variety = pr_varieties.id 
           ".$innerSowing." 
           WHERE pr_varieties.code != 1 
           AND sw_sowing.id_product = 1 
           AND sw_sowing.status = 100 
           AND sw_sowing.id_tenant = :id_tenant 
           ".$consultSowing." 
           GROUP BY pr_products.product 
           HAVING plantSowing > 0 
           ORDER BY pr_products.product 
         ) 
          UNION ALL 
          (
           SELECT ".$fieldLand." 
             pr_products.product, 
             CONCAT(YEAR(:dates6),'-', LPAD(WEEK(:dates7),2,'0')) AS Week, 
             0 AS plantSowing, 
             0 AS Production, 
             SUM(pf_harvest.quantity) AS Harvest 
           FROM pf_harvest 
           INNER JOIN pr_products ON pr_products.id = pf_harvest.id_product 
           INNER JOIN pr_varieties ON pr_varieties.id = pf_harvest.id_variety 
           INNER JOIN pf_performance ON pf_performance.id = pf_harvest.id_performance 
           ".$innerHarvest." 
           WHERE pf_harvest.date BETWEEN TIMESTAMPADD(DAY,(0-WEEKDAY(:dates8)),:dates9) 
           AND TIMESTAMPADD(DAY,(6-WEEKDAY(:dates10)),:dates11) 
           AND pr_varieties.code != 1 
           AND pf_harvest.id_product = 1 
           AND pf_performance.status = 100 
           ".$consultHarvest." 
           AND pf_harvest.id_tenant = :id_tenant1 
           GROUP BY pr_products.product 
           ORDER BY pr_products.product 
          ) 
         ) AS sc 
        GROUP BY product, label 
        ORDER BY label"; 

     $statement = $this->db->prepare($sql); 
     $id_tenant = $this->getIdTenant(); 
     foreach($datePeriod AS $dates){ 

      $values = [ 
      ':dates'  => $dates->format('Y-m-d'), 
      ':dates1'  => $dates->format('Y-m-d'), 
      ':dates2'  => $dates->format('Y-m-d'), 
      ':dates3'  => $dates->format('Y-m-d'), 
      ':dates4'  => $dates->format('Y-m-d'), 
      ':dates5'  => $dates->format('Y-m-d'), 
      ':dates6'  => $dates->format('Y-m-d'), 
      ':dates7'  => $dates->format('Y-m-d'), 
      ':dates8'  => $dates->format('Y-m-d'), 
      ':dates9'  => $dates->format('Y-m-d'), 
      ':dates10' => $dates->format('Y-m-d'), 
      ':dates11' => $dates->format('Y-m-d'), 
      ':id_tenant' => $id_tenant, 
      ':id_tenant1' => $id_tenant 

      ]; 

      $types = [ 
      ':dates'  => Column::BIND_PARAM_STR, 
      ':dates1'  => Column::BIND_PARAM_STR, 
      ':dates2'  => Column::BIND_PARAM_STR, 
      ':dates3'  => Column::BIND_PARAM_STR, 
      ':dates4'  => Column::BIND_PARAM_STR, 
      ':dates5'  => Column::BIND_PARAM_STR, 
      ':dates6'  => Column::BIND_PARAM_STR, 
      ':dates7'  => Column::BIND_PARAM_STR, 
      ':dates8'  => Column::BIND_PARAM_STR, 
      ':dates9'  => Column::BIND_PARAM_STR, 
      ':dates10' => Column::BIND_PARAM_STR, 
      ':dates11' => Column::BIND_PARAM_STR, 
      ':id_tenant' => Column::BIND_PARAM_INT, 
      ':id_tenant1' => Column::BIND_PARAM_INT 

      ]; 

      $result = $this->db->executePrepared($statement , $values, $types); 

     } 

I addes $ типов [], по этой причине он не работал!

Я надеюсь, что он может помочь другому человеку!

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

  • Нет связанных вопросов^_^