2013-08-15 2 views
0

Я написал функцию php, которая позволяет обновлять любую запись в любой таблице с любыми строковыми значениями (одним или несколькими). PDO не вызывает никаких ошибок, хотя скрипт не работает! Я несколько раз проверял имя базы данных, таблиц и полей. Все правильно. Это единственный запрос в моих функциях, который не работает. Я считаю, что это имеет какое-то отношение к массиву im, передаваемому в оператор SQL, и функции PDO-> bindParam().Сложный запрос PDO MYSQL не работает

Код:

public function updateTableDetail($table, $id, $params) { 

    include($this->doc_root . 'config/config.php'); 

    if (is_array($params)) { 
     foreach ($params as $param) { 
      $param = Utilities::escapeString($param); 
     } 
    } else { 
     throw new InvalidInputException(InputErrors::NOTANARRAY); 
    } 
    if (is_nan($id)) throw new InvalidInputException(InputErrors::NOTANUMBER); 
    $table = Utilities::escapeString($table); 

    $sql = "UPDATE " . $table . " 
      SET " . $config['table_field_updated'] . " = :updated"; 
    while (current($params)) { 
     $sql .= "," . key($params) . " = :" . key($params); 
     next($params); 
    } 
    reset($params); 
    $sql .= " WHERE id = :id 
      AND " . $config['userId'] . " = :userId"; 

    if ($this->serverConnector == null) { 
     $this->serverConnector = new ServerConnector(); 
    } 
    if ($this->db == null) { 
     $this->db = $this->serverConnector->openConnectionOnUserDb($this->dbname); 
    } 
    $stmt = $this->db->prepare($sql); 
    $updated = date("Y-m-d H:i:s"); 
    $stmt->bindParam(':updated',$updated); 
    $stmt->bindParam(':id',$id); 
    $stmt->bindParam(':userId',$this->userId); 
    while ($param = current($params)) { 
     $stmt->bindParam(":".key($params),$param); 
     next($params); 
    } 
    reset($params); 
    $stmt->execute(); 
} 

EDIT: Не беспокойтесь о включают заявление, в $ конфигурации [] - массив, а класс-переменные. Это все работает. Уже протестированы их значения.

+0

Так что же не работает? – Halcyon

+0

Вы ** УВЕРЕННО **, что ни один из этих динамических параметров не дублирует 'updated',' id' или 'userID'? имена параметров должны быть уникальными в запросе. Вы никогда не беспокоились о проверке возвращаемых значений вызовов привязки и просто предполагаете, что они преуспели. –

+0

Проверка каждого звонка-перехвата является хорошей практикой? Спасибо за вашу помощь, хотя Akam уже решила проблему. – JustBasti

ответ

0

Изменить эту часть:

while ($param = current($params)) { 
     $stmt->bindParam(":".key($params),$param); 
     next($params); 
    } 

To:

foreach($params as $key => &value){ 
$stmt->bindParam(":$key",$value); 
} 

Поскольку согласно PHP Manual: PDOStatement::bindParam

Связывает переменную PHP к соответствующему имени или вопросительный знак заполнитель в SQL который использовался для подготовки заявления . В отличие от PDOStatement :: bindValue(), переменная привязана как ссылка и будет оцениваться только в момент, когда вызывается PDOStatement :: execute().

+0

то же самое в здании sql :) –

+0

работал для меня, спасибо :) – JustBasti

+0

Хорошо, вы можете принять его сейчас :), я думаю, что 'PDOStatement :: bindValue()' может работать для вашего метода –

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