Как проверить, был ли мой запрос на обновление MySQL успешным в Code Igniter?

У меня есть функция модели, которая обновляет пользователя в приложении Code Igniter:

// updates first of a user, return true if successful, false if not. public function updateFirstName($userId, $newFirstName) { $this->db->query("UPDATE users SET firstName='$newFirstName' WHERE id=$userId"); return // whether request was successful? } 

Как вернуть логическое значение, которое обеспечивает обновление пользователя ID $userId ? Например, он должен возвращать false, если пользователь не был найден с ID $userId .

Solutions Collecting From Web of "Как проверить, был ли мой запрос на обновление MySQL успешным в Code Igniter?"

Как прокомментировано , вы пробовали $this->db->affected_rows() ?

Это скажет вам, сколько строк было обновлено.

Проверьте это для получения дополнительной информации. Активные записи

 public function updateFirstName($userId, $newFirstName) { return $this->db ->where('id', $userId) ->update("users", array('firstName' => $newFirstName)); } 

Таким образом, вы также избежите инъекции sql, которые были у вас раньше

 if ($this->db->affected_rows() > 0) { return TRUE; } else { return FALSE; } 

или

 if ($this->db->affected_rows() > 0) return TRUE; else return FALSE; 

или

 return ($this->db->affected_rows() > 0) ? TRUE : FALSE; 

РЕДАКТИРОВАТЬ

также (намного лучше)

 return ($this->db->affected_rows() > 0); 

Лучшее решение, которое я нашел, – это управлять разницей между ERROR и 0 затронутыми строками. 0 затронутых строк не обязательно плохо, но ошибка – это то, о чем вы хотите знать:

 if ($this->db->_error_message()) { return FALSE; // Or do whatever you gotta do here to raise an error } else { return $this->db->affected_rows(); } 

Теперь ваша функция может различаться …

 if ($result === FALSE) { $this->errors[] = 'ERROR: Did not update, some error occurred.'; } else if ($result == 0) { $this->oks[] = 'No error, but no rows were updated.'; } else { $this->oks[] = 'Updated the rows.'; } 

Просто немного быстрого взлома – вы должны сделать код намного более подробным, если у вас есть другие люди, которые его используют.

Дело в том, что используйте _error_message, чтобы различать 0 обновленных строк и реальную проблему.

Вы можете использовать $this->db->affected_rows() в Codeigniter, который возвращает числовое значение при выполнении запросов типа «запись» (вставка, обновление и т. Д.).

В MySQL DELETE FROM TABLE возвращает 0 затронутых строк. Класс базы данных имеет небольшой взлом, который позволяет ему возвращать правильное количество затронутых строк. По умолчанию этот хак включен, но его можно отключить в файле драйвера базы данных. (Из руководства пользователя CI). Для удаленной строки в Ci она возвращает 1.

Вы можете использовать $this->db->affected_rows(); проверить, выполняется ли запрос успешно или нет.

Я использую этот код для проверки запроса на обновление.

 $status = $this->db->query("UPDATE users SET firstName='$newFirstName' WHERE id=$userId"); if($status) return true; else return false; 
 public function updateInfo($newinfo) { $this->db->update("some_table", $newinfo); return ($this->db->affected_rows() > 0); } 

Это либо вернет true, либо false

Попробуй это:

 public function updateFirstName($userId, $newFirstName) { $this->db->where('id', $userId); $this->db->set('firstName', $newFirstName); $sql = $this->db->update('users'); if ($sql) { return TRUE; } // $sql - boolean true or false } 

Используйте хранимую процедуру, вы можете проверить результат.

Ниже приведен пример хранимой процедуры:

 CREATE DEFINER=`root`@`localhost` PROCEDURE `usp_UpdateInfo`(tableId int,tableName varchar(100) charset utf8,description varchar(400) charset utf8) BEGIN declare exit handler for sqlexception select 0 as `result`; update table set `name` = tableName, description = description where id = tableId; select 1 as `result` ; END 

Код примера PHP:

 $this->load->database(); $rs = $this->db->query('call usp_UpdateInfo(?,?,?)',array($tableId,$tableName,$description)); $this->db->close(); return $rs->result_array();