Невозможно обновить строки с помощью PDO - PullRequest
0 голосов
/ 26 июля 2011

Когда я запускаю следующий код:

  // Loop through each store and update shopping mall ID

  protected function associateShmallToStore($stores, $shmall_id) {

    foreach($stores as $store_id) {
      $sql .= 'UPDATE my_table SET fk_shmallID = :shmall_id WHERE id = :store_id';
      $stmt = $this->db->prepare($sql);
      $stmt->bindParam(':shmall_id', $shmall_id);
      $stmt->bindParam(':store_id', $store_id);
      $stmt->execute();
    }

  } 

Я получаю следующее сообщение:
Warning: PDOStatement::execute() [pdostatement.execute]: SQLSTATE[HY093]: Invalid parameter number: mixed named and positional parameters

Я также безуспешно пробовал следующее (без $stmt->bindParam):
$stmt->execute( array($shmall_id, $store_id));

Я не понимаю, что я делаю неправильно.

UPDATE Я обновил свой код, чтобы отразить то, что я на самом деле получил в своем исходном коде. Здесь не должно быть никаких опечаток.

ОБНОВЛЕНИЕ 2
Я пробовал это, но я все еще получаю то же сообщение об ошибке.

  protected function associateShmallToStore($stores, $shmall_id) {
    $i = 0;

    $sql .= "UPDATE sl_store ";

    foreach($stores as $store_id) {
      $i++;
      $sql .= 'SET fk_shmallID = :shmall_id, lastUpdated = NOW() WHERE id = :store_id_'.$i.',';  
    }

    $sql = removeLastChar($sql);
    $stmt = $this->db->prepare($sql);

    $stmt->bindParam(':shmall_id_'.$i, $shmall_id);

    $i = 0;
    foreach($stores as $store_id) {
      $i++;    
      $stmt->bindParam(':store_id_'.$i, $store_id);
    }

    $stmt->execute();
  }

Это вывод SQL-запроса:

UPDATE sl_store 
  SET fk_shmallID = :shmall_id, lastUpdated = NOW() WHERE id = :store_id_1,
  SET fk_shmallID = :shmall_id, lastUpdated = NOW() WHERE id = :store_id_2

ОБНОВЛЕНИЕ 3
Код, который я использовал, был таким:

    foreach($stores as $store_id) {
      $sql = "UPDATE sl_store SET fk_shmallID = :shmall_id WHERE id = :store_id";
      $stmt = $this->db->prepare($sql);
      $stmt->bindParam(':shmall_id', $shmall_id);
      $stmt->bindParam(':store_id', $store_id);
      $res = $stmt->execute();
    } 

Ответы [ 2 ]

4 голосов
/ 26 июля 2011

Как и в сообщении об ошибке, вы смешали именованные и позиционные параметры:

  • :name (named)
  • :person_id (named)
  • ? (позиционный)

Более того, у вас есть названный параметр :person_id, но вы привязываетесь к :id.

Это ваши параметры,Я назову их P1, P2 и P3:

UPDATE my_table SET name = :name WHERE id = :person_id ?
                           ^ P1             ^ P2       ^ P3

И вот где вы их связываете:

  $stmt->bindParam(':name', $name); // bound to P1 (:name)
  $stmt->bindParam(':id', $person_id); // bound to nothing (no such param :id)

Вы, вероятно, хотите связать второепараметр в :person_id, а не в :id и удалить последний позиционный параметр (знак вопроса в конце запроса).

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

$sql .= 'UPDATE my_table SET name = :name WHERE id = :person_id ?';

Вы, вероятно, хотите удалить это . до =.

Подробнее об этом,взгляните на страницу Подготовленные операторы и хранимые процедуры в руководстве по PDO.Вы узнаете, как связать параметры и в чем разница между именованными и позиционными параметрами.

Итак, чтобы подвести итог:

  1. Замените строку SQL на:

    $sql = 'UPDATE my_table SET name = :name WHERE id = :person_id';
    
  2. Заменить второй bindParam() вызов на:

    $stmt->bindParam(':person_id', $person_id);
    
0 голосов
/ 26 июля 2011

Попробуйте:

$sql = 'UPDATE my_table SET name = :name WHERE id = :id';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...