Ответ 1
Как прокомментировано, вы пробовали $this->db->affected_rows()
?
Это скажет вам, сколько строк было обновлено.
У меня есть функция модели, которая обновляет пользователя в приложении 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?
}
Как вернуть логическое значение, которое обеспечивает обновление идентификатора пользователя $userId
? Например, он должен возвращать false, если не было найдено ни одного пользователя с идентификатором $userId
.
Как прокомментировано, вы пробовали $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();