2012-06-21 4 views
1

Я решил пойти в PDO. Функция, приведенная ниже, должна перемещать строку в таблицу в другую базу данных (от этапа до производства), а затем удалять строку в стадии. Это 2 полностью разделенные базы данных.PDO не удалось переместить строку в другую базу данных

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

Пожалуйста, также не стесняйтесь давать мне лучшие лучшие практики. Я не вижу свой код, как элегантный и предположим, что есть лучшие способы сделать это, esspecially с исключениями

private function moveCallToProduction() { 
    try { 
     $array = array(":id" => $this->call['info']['call_id']); 
     $sql = "SELECT * FROM `calls` WHERE `id`=:id"; 
     $query = $this->staging->prepare($sql); 
     $query->execute($array); 
     $row = $query->fetch(PDO::FETCH_NUM); 
     try { 
      $sql = "INSERT INTO `calls` (`id`,`sip_id`,`extension`,`caller_id`,`stage`,`status`,`survey_id`,`start`,`answer`,`hangup`) VALUES (`?`,`?`,`?`,`?`,`?`,`?`,`?`,`?`,`?`,`?`)"; 
      $stmt = $this->production->prepare($sql); 
      $stmt->execute($row); 
      if(!$stmt) { 
       throw new Exception('Unable to move the call '.$this->call['info']['call_id'].' to the production server.'); 
      } else { 
       try { 
        $sql = "DELETE FROM `calls` WHERE `id`='".$this->call['info']['call_id']."'"; 
        $query = $this->staging->query($sql); 
        if(!$query) { 
         throw new Exception('Unable to delete call '.$this->call['info']['call_id'].' from the staging server.'); 
        } 
       } 
       catch(PDOException $e) { 
        $this->informer("FATAL",$e->getMessage()); 
       } 
      } 

     } 
     catch(Exception $e) { 
      $this->informer("FATAL",$e->getMessage()); 
     } 
    } 
    catch(PDOException $e) { 
     $this->informer("FATAL","We're unable to transport the call from the staging to production server. Error: ".$e->getMessage()); 
    } 
} 
+0

Попробуйте 'echo' переменную' $ sql' и посмотреть, что она содержит. –

+0

Еще одна вещь: вам нужно обернуть значение id в одинарные кавычки? –

+0

Интересно, что программист смешивал подготовленные операторы и простые запросы. Я предполагаю, что это проблема экранирования, потому что все остальные (подготовленные) операторы работают. –

ответ

1

Я предполагаю, что это избежать проблем.

Попробуйте:

... 
try { 
    $sql = "DELETE FROM `calls` WHERE `id`= :id"; 
    $stmtx = $this->staging->prepare($sql); 
    $stmtx->execute(array($this->call['info']['call_id'])); 
    if(!query) { 
... 
+0

Ваш ответ был самым близким. Это была проблема с экранированием на самом деле в инструкции insert. Знаки '?' Вопросительных знаков были неправильными, и кажется, что драйвер через это '?' Является именем поля. – mauzilla

+0

Да, я вижу. Вопросительные знаки заключены в '' ', что просто неправильно. –

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