2015-06-28 5 views
-2

Error: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '@g.com, 'User'.'phone' = 87665r5, 'User'.'address' = 23lsdhf, 'User'.'location' ' at line 1Ошибка: SQLSTATE [42000]: Синтаксическая ошибка или нарушение доступа: 1064 У вас есть ошибка в синтаксисе SQL; проверьте ручной

SQL-запрос: UPDATE 'cake'.'users' AS 'User' SET 'User'.'username' = paul, 'User'.'password' = eben, 'User'.'email' = [email protected], 'User'.'phone' = 87665r5, 'User'.'address' = 23lsdhf, 'User'.'location' = lskjaflasi, 'User'.'pincode' = 867567 WHERE 'User'.'id' = 1

Мой код

 if($this->request->data) 
     {$User=$this->request->data[User]; 
    $this->User->updateAll($User,array("User.id" => $v));} 

Как я могу обновить всю форму?

+0

Вы не завернули свои строковые значения в одинарных кавычках. –

+0

@HoboSapiens есть какой-либо простой способ обернуть их в одинарные кавычки Спасибо – Paul

ответ

2

updateAll() не автоматически переносит строковые значения в кавычки, в отличие от использования save(). Вы должны сделать это сами. От the docs: -

Literal values should be quoted manually using DboSource::value().

Вам нужно обернуть каждое значение строки в $this->request->data с цитатами, используя что-то вроде value() метода DATASOURCE перед вызовом updateAll(): -

$db = $this->getDataSource(); 
$value = $db->value($value, 'string'); 

Желательно, чтобы не просто передать $this->request->data в updateAll() в любом случае, так как кто-то может вводить данные в вашу базу данных. Вместо этого создайте новый массив данных сохранения из ваших данных запроса и, соответственно, сверните строки. Например: -

$user=$this->request->data[User] 
$data = array(
    'username' => $db->value($user['username'], 'string'), 
    'password' => $db->value($user['password'], 'string'), 
    'email' => $db->value($user['email'], 'string'), 
    'phone' => $db->value($user['phone'], 'string'), 
    'address' => $db->value($user['address'], 'string'), 
    'location' => $db->value($user['location'], 'string'), 
    'pincode' => $db->value($user['pincode'], 'integer') 
); 
$this->User->updateAll($data, array("User.id" => $v)); 

Update

В качестве альтернативы использованию updateAll() вы бы лучше использовать save() для того, что вы здесь делаете. Пока ваши сохранения данных содержит первичный ключ записи, то (напримерUser.id) будет выполнять UPDATE, а не INSERT: -

$this->request->data['User']['id'] = $v; 
$this->User->save($this->request->data); 

save() будет обрабатывать все строки для вас, так что нет никакой необходимости для упаковки они сами цитируют.

+0

Спасибо @drmonkeyninja есть ли другие возможности, которые вы могли бы мне предложить? Благодаря.! – Paul

+0

@Paul Я обновил ответ, чтобы показать лучший способ, используя 'save()', поскольку 'updateAll()' немного избыточен в вашем конкретном примере. Если вам нужно использовать 'updateAll()' и вам нужно легко обернуть все строковые значения кавычками, вы можете использовать функцию PHP 'array_map' для быстрого переноса каждого значения в кавычки. – drmonkeyninja

+0

Спасибо @drmonkeyninja – Paul