2015-12-27 3 views
0

Я пытаюсь создать собственный класс для управления операциями с базой данных. Я новичок в ООП, поэтому, если у вас есть предложения, скажите мне. Кстати, у меня есть метод обновления, который в качестве параметра указывал имя таблицы, поля для обновления, значения, с которыми я хочу обновить поля, а также поля и значения, чтобы помещать туда предложение. В это время у меня есть два разных массива: один для заданной части и один для части. Я строю строку запроса так PDOStatement Object ([queryString] => UPDATE Ordini SET Nome=':Nome', Cognome=': Cognome', Telefono=': Telefono' WHERE ID=':ID')Обновление Php с использованием PDO

Теперь я хотел бы привязать params к переменным и выполнить запрос, и это проблема. Я стараюсь, но запрос не обновляет поля. - В значениях $ у меня есть значения, которые я хочу связать с переменными в части SET - В $ wv у меня есть значения, которые я хочу привязать к переменным в части WHERE - В $ fieldsQuery у меня есть заполнители для SET часть («: Nome», например) - В $ fieldsWhere у меня есть заполнители для части WHERE

Как я могу привязать в правильном порядке заполнители с переменными?

public function update($table=NULL, $fieldsQuery=NULL, $fieldsValues = NULL, $whereFields=NULL, $whereValues=NULL, $whereOperators = NULL) 
{ 
    if($fieldsQuery != NULL) 
     $fields = explode(",", $fieldsQuery); 
    if($fieldsValues != NULL) 
     $values = explode(",", $fieldsValues); 
    if($whereFields != NULL) 
     $wf = explode(",", $whereFields); 
    if($whereValues != NULL) 
     $wv = explode(",", $whereValues); 

    $fieldsQuery = array_map(function($field) { return ":$field";}, $fields); 
    $bindValuesSet = array_combine($fieldsQuery, $values); 
    //return an array in which every field is => Fieldname=':Fieldname' 
    $bindSetInitial = array_combine($fields, $fieldsQuery); 


    //transform every item in array from field to :field 
    $fieldsWhere = array_map(function($field) { return ":$field";}, $wf); 
    $bindValuesWhere = array_combine($fieldsWhere, $wv); 
    $bindWhereInitial = array_combine($wf, $fieldsWhere); 

    //implode an array mantaining both key and value 
    $fieldsValues = implode(', ', array_map(function ($v, $k) { return sprintf("%s='%s'", $k, $v); }, $bindSetInitial, array_keys($bindSetInitial))); 
    $fieldsWhere = implode(', ', array_map(function ($v, $k) { return sprintf("%s='%s'", $k, $v); }, $bindWhereInitial, array_keys($bindWhereInitial))); 

    $query = $this->db->prepare('UPDATE ' . $table . ' SET ' . $fieldsValues . ' WHERE ' . $fieldsWhere); 

    $query->bindParam(':Nome', $values[0]); 
    $query->bindParam(':Cognome', $values[1]); 
    $query->bindParam(':Telefono', $values[2]); 
    $query->bindParam(':ID', $wv[0], PDO::PARAM_INT); 

    $query->execute(); 
    print_r($query->debugDumpParams()); 
} 
+1

там не должно быть никаких цитат в ' ': Cognome'' и т.д., и там это пространство там и т. д. .. проверить на наличие ошибок http://php.net/manual/en/pdo.error-handling.php –

+0

Я подозреваю, что пространство в 'implode (',',' и кавычки в 'return sprintf ("% s = '% s'", '- вам нужно их удалить. –

+0

Во-первых, спасибо за помощь! Я удалил кавычки. Теперь строка запроса выглядит так: UPDATE Ordini SET Nome =: Nome, Cognome =: Cognome, Telefono =: Telefono WHERE ID =: ID. Я ищу космическую проблему –

ответ

1

':Nome' не является заполнителем для подготовленного заявления. Это просто строка ':Nome'

Заполнитель № :Nome (без `) и без пробелов, таблеток и т. Д. I.e. : Nome есть не подстаканник тоже.

Таким образом, вы запрос должен быть:

UPDATE Ordini SET Nome=:Nome, Cognome=:Cognome, Telefono=:Telefono WHERE ID=:ID 

И благодаря @ Fred-II- - читать error handling section of PDO

+0

уверен, но это не проблема. проблема в их построении, где кво tes и пробелы добавляются как-то, и я еще не понял. –

+0

Здесь 'sprintf ("% s = '% s' ", $ k, $ v)' Я полагаю. И пробелы исходят от «взрыва». 'trim' не наш друг. –

+0

Я сказал это в комментарии по их вопросу. –

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