2016-01-13 2 views
1
$sql = 'INSERT INTO `' . $table_name . '` ' 
      . '(`day`, `campaign_name`, `campaign_id`, `views`, `CPM`, `cost`, `currency`, `cost_EUR`) VALUES ' 
      . '(:day, :campaign_name, :campaign_id, :views, :CPM, :cost, :currency, :cost_EUR)'; 

$this->_dbi->execute($sql, array(
      ':day'  => $day, 
      ':campaign_name'  => $campaignName, 
      ':campaign_id' => $campaignID, 
      ':views'   => $views, 
      ':CPM'  => $cpm, 
      ':cost'  => $cost_EUR, 
      ':currency'  => 'EUR', 
      ':cost_EUR' => $cost_EUR 
)); 

Насколько я могу сказать число переменных делать совпадает с количеством жетонов. Я просто не могу понять здесь ошибку.PDOStatement :: Execute(): SQLSTATE [HY093]: Неверный номер параметра: число связанных переменных не соответствует количеству жетонов

+0

Выглядит нормально. Вы уверены, что ошибка относится к этому точному запросу? –

+0

execute (array (': name' => 'Apple', ': color' => 'red')); execute имеют только один perameter –

+0

http://php.net/manual/en/pdostatement.execute.php –

ответ

1

Вам нужно передать массив только в метод execute. Так что ваш обновленный код будет выглядеть следующим образом:

$sql = 'INSERT INTO `' . $table_name . '` ' 
      . '(`day`, `campaign_name`, `campaign_id`, `views`, `CPM`, `cost`, `currency`, `cost_EUR`) VALUES ' 
      . '(:day, :campaign_name, :campaign_id, :views, :CPM, :cost, :currency, :cost_EUR)'; 
$sth = $this->_dbi->prepare($sql);  
$sth->execute(array(
      ':day'  => $day, 
      ':campaign_name'  => $campaignName, 
      ':campaign_id' => $campaignID, 
      ':views'   => $views, 
      ':CPM'  => $cpm, 
      ':cost'  => $cost_EUR, 
      ':currency'  => 'EUR', 
      ':cost_EUR' => $cost_EUR 
)); 

Подробнее здесь: http://php.net/manual/en/pdostatement.execute.php

PDOStatement :: Execute - выполняет подготовленное заявление

Использование: общественного BOOL PDOStatement :: execute ([array $ input_parameters])

Вот пример из e:

<?php 
/* Execute a prepared statement by passing an array of insert values */ 
$calories = 150; 
$colour = 'red'; 
$sth = $dbh->prepare('SELECT name, colour, calories 
    FROM fruit 
    WHERE calories < :calories AND colour = :colour'); 
$sth->execute(array(':calories' => $calories, ':colour' => $colour)); 
+0

Спасибо, что сработало :), но я не понимаю, почему мне не нужно выполнять $ sql? – user3378734

+0

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

+0

. Я обновил свой ответ, включив в него заявление о подготовке. Это, конечно, предполагает $ this -> _ dbi - это экземпляр объекта PDO. – Clay

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