2012-03-28 7 views
15

Mam funkcji modelu, który aktualizuje użytkownika w mojej aplikacji codeigniter:Jak mogę sprawdzić, czy moje zapytanie o aktualizację MySQL zakończyło się pomyślnie w 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? 
} 

Jak mogę zwrócić wartość logiczną, która zapewnia użytkownikowi ID $userId został zaktualizowany? Na przykład powinien zwrócić wartość false, jeśli nie znaleziono użytkownika o identyfikatorze $userId.

+3

Czy próbowałeś $ this-> db-> affected_rows()? Dzięki temu dowiesz się, ile wierszy zostało zaktualizowanych. – ChrisK

+9

Luka w zabezpieczeniach SQL. Byłbym bardziej martwiłby się o to, że twój DB jest pwn3d niż zapytanie powiodło się/nie. –

+2

$ userId = "1 OR 1 = 1"; powinien to zrobić. – ChrisK

Odpowiedz

33

As commented, próbowałeś $this->db->affected_rows()?

Dzięki temu dowiesz się, ile wierszy zostało zaktualizowanych.

+5

Ale co jeśli użytkownik przesyła dane bez żadnych zmian. W takim przypadku dane zostaną znalezione, ale nadal będą miały wpływ na następujące wiersze: –

+0

Nie ma możliwości sprawdzenia, nawet jeśli nie zaktualizowano wierszy, nie oznacza to, że zapytanie nie powiodło się. –

+4

Możesz rozszerzyć kolumnę bazy danych o "last_update" znacznik czasu, więc będzie co najmniej jedną zaktualizowaną kolumną, a wynik '$ this-> db-> affected_rows()' to> 0. – user2814648

1

$this->db->affected_rows(); można używać do sprawdzenia, czy kwerenda działa z powodzeniem lub nie

10

Sprawdź to, aby uzyskać więcej informacji. Active Records

public function updateFirstName($userId, $newFirstName) { 

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

W ten sposób można również uniknąć SQL Injection, że trzeba było przed

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

lub

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

lub

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

EDIT

również (znacznie lepiej)

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

lub po prostu return (bool) ($ this-> db-> affected_rows()> 0); – Philip

+0

miła obsada +1 –

+4

ten post doskonale reprezentuje ewolucję młodszego dewelopera php: D – Aram

4

Można użyć $this->db->affected_rows() w CodeIgniter to zwraca wartość liczbową, gdy robi "write" zapytań typu (INSERT, UPDATE, itd.).

W MySQL DELETE FROM TABLE zwraca 0 dotkniętych wierszy. Klasa bazy danych ma mały hack, który pozwala mu zwrócić poprawną liczbę dotkniętych wierszy. Domyślnie ten hack jest włączony, ale można go wyłączyć w pliku sterownika bazy danych. (Z podręcznika użytkownika CI). W przypadku usuniętego wiersza w Ci zwraca 1.

8

Lepszym rozwiązaniem, które znalazłem, jest zarządzanie różnicą między BŁĘDEM a 0 zmienionymi wierszami. 0 wierszy niekoniecznie jest czymś złym, ale błędem jest coś, czego nie chcą wiedzieć o:

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

Teraz twoja funkcja może różnicować ...

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.'; 
} 

Tylko niektóre szybkie hacking tam - powinieneś oczywiście uczynić kod bardziej rozwlekłym, jeśli masz inne osoby, które go używają.

Chodzi o to, rozważ użycie _error_message do rozróżnienia między 0 zaktualizowanymi wierszami a prawdziwym problemem.

+0

Nie jestem pewien, ale 'if ($ result == 0) { $ this-> oks [] = 'Brak błędu, ale nie zaktualizowano wierszy.'; } 'nie wydaje się być poprawna dla mnie ..' ($ result == 1) 'jest dla pomyślnego zapytania bez błędu nawet przy zaktualizowaniu 0 wierszy. '($ result == 0)' jest dla błędnego zapytania - 'mysql_affected_rows()' działa !! –

1

Używam tego kodu do sprawdzania kwerendy aktualizacji.

$status = $this->db->query("UPDATE users SET firstName='$newFirstName' WHERE id=$userId"); 
if($status) 
    return true; 
else 
    return false; 
+0

dziękuję za pracę ans dla mnie! – Ali

+1

'return (bool) $ status;' pozwoliłoby zaoszczędzić tutaj trzy linie. – Luke

0
public function updateInfo($newinfo) { 
    $this->db->update("some_table", $newinfo); 
    return ($this->db->affected_rows() > 0); 
} 

Będzie to albo powrócić prawda czy fałsz

0

Spróbuj tego:

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

skorzystać z procedury przechowywane, można sprawdzić wynik.

Poniżej znajduje się przykład procedura przechowywana:

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 przykładowy kod:

$this->load->database(); 

$rs = $this->db->query('call usp_UpdateInfo(?,?,?)',array($tableId,$tableName,$description)); 
$this->db->close();  
return $rs->result_array(); 
Powiązane problemy