Как мне проверить, был ли мой запрос на обновление MySQL успешным в CodeIgniter? - PullRequest
21 голосов
/ 28 марта 2012

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

// 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.

Ответы [ 10 ]

36 голосов
/ 28 марта 2012

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

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

11 голосов
/ 28 марта 2012
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; 

EDIT

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

return ($this->db->affected_rows() > 0);
11 голосов
/ 28 марта 2012

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

public function updateFirstName($userId, $newFirstName) {

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

Таким образом вы также избежите инъекций sql, которые вы имели до

10 голосов
/ 21 октября 2013

Лучшее решение, которое я нашел, - это управлять разницей между ОШИБКОЙ и 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 обновленных строк и реальную проблему.

4 голосов
/ 10 сентября 2012

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

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

3 голосов
/ 15 июня 2014

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

$status = $this->db->query("UPDATE users SET firstName='$newFirstName' WHERE id=$userId"); 
if($status)
   return true;
else
    return false;
3 голосов
/ 28 марта 2012

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

2 голосов
/ 06 ноября 2016

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

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

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();
0 голосов
/ 06 марта 2016

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

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
}
0 голосов
/ 05 апреля 2015
public function updateInfo($newinfo) {
    $this->db->update("some_table", $newinfo);
    return ($this->db->affected_rows() > 0);
}

Это будет либо верным, либо ложным

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...