Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL]mysql_insert_id mały klopot
Forum PHP.pl > Forum > Przedszkole
acztery
witam mam taki klopot


  1. public function sqlSave($array,$table,$id='') {
  2. $set = '';
  3.  
  4. while( list($key, $val) = each($array['form'])) {
  5. $set .= '`'.$key.'`=\''. stripslashes($val) .'\', ';
  6. }
  7. $set = substr ($set,0, strlen($set) - 2 );
  8. if (empty($id)) { //insert
  9. mysql_query("INSERT INTO `$table` SET $set");
  10. $id_ = mysql_insert_id();
  11. }
  12. else { //update
  13. mysql_query("UPDATE `$table` SET $set WHERE id = '".$id."'");
  14. $id_ = $id;
  15.  
  16. }
  17.  
  18.  
  19. $cache = new other_cache();
  20. $cache->clearch();
  21. return $id_;
  22. }


i i ta metoda ma zwracac id rekordu dodanego albo edytowanego. (edytowany dziala)
ale mysql_insert_id(); nie dziala

chodzi o zmienną $id_

moze ktos wie o co chodzi
nospor
A nowy rekord się dodaje?
acztery
dodaje i zwraca 0

jeszcze 1 kawalek kodu z modelu to cowczesniej to metoda obslugi bazy...

  1. function m_modules_desc_update($post,$img='')
  2. {
  3.  
  4. if ($img != '')
  5. {
  6. $post['form']['img'] = $this->sqlFiltr($img);
  7. }
  8.  
  9. if ($post['FOR'] != '')
  10. {
  11. $this->sqlQuery("UPDATE modules_desc SET count_mod=count_mod+1 WHERE id='".$this->sqlFiltr($post['FOR'])."'");
  12. $id=$this->sqlSave($post,'modules_desc',$this->sqlFiltr($post['FOR']));
  13. }else{
  14.  
  15. $prefix = $this->MysqlGetOne("SELECT count(*) FROM modules_desc");
  16. $post['form']['id'] = DoRewrite($post['form']['name'])."_".$prefix;
  17. $post['form']['dateadd'] = date("Y-m-d");
  18. $id=$this->sqlSave($post,'modules_desc');
  19. }
  20. return $id;
  21. }


metoda sqlQuery odpowiada za dodania albo edycja jak przekazujemy jakies id ...
nospor
No jeśli nowy rekord się dodaje to ID powinno być zwrócone.
Czy na pewno ID jest autoincrement?
acztery
fuck!

zapomnaiłem.

Tylko, że nie mogę mieć autoincrement narzucone ze starej wersji oprogramowania i klient tak chce zachować.. to jest pole varchal.

tzn ze nie ma sposobu na to ze poznac wartosc ostatnio dodanego pola w kolunie id...

PS wiem ze moge pobrac ostatnio dodany rekord i tyle. ale czy nie bedzie z tym klopotow. jak np w ciagu jednego czasu 100 userow bedzie cos robilo ... wtedy moze się zrobić balagan
nospor
Czegoś tu nie rozumiem.... to skąd ci się to ID bierze skoro to jest varchar?
Ty je gdzieś ustalasz czy jak? No bo jeśli to ty je gdzieś ustalasz to no przecież znasz to id
acztery
Naspor dzięki.

  1. function m_modules_desc_update($post,$img='')
  2. {
  3.  
  4. if ($img != '')
  5. {
  6. $post['form']['img'] = $this->sqlFiltr($img);
  7. }
  8.  
  9. if ($post['FOR'] != '')
  10. {
  11. $this->sqlQuery("UPDATE modules_desc SET count_mod=count_mod+1 WHERE id='".$this->sqlFiltr($post['FOR'])."'");
  12. $this->sqlSave($post,'modules_desc',$this->sqlFiltr($post['FOR']));
  13. $id=$this->sqlFiltr($post['FOR']);
  14. }else{
  15.  
  16. $prefix = $this->MysqlGetOne("SELECT count(*) FROM modules_desc");
  17. $post['form']['id'] = DoRewrite($post['form']['name'])."_".$prefix;
  18. $post['form']['dateadd'] = date("Y-m-d");
  19. $this->sqlSave($post,'modules_desc');
  20. $id=$post['form']['id'];
  21.  
  22. }
  23. return $id;
  24. }


teraz powinno działać


Jeszcze raz 100 dzięki, nie wiem jak mogłem to przeoczyć....
Masz u mnie piwo.
thek
Jjeśli już robisz strukturalnie, to wypadało by sprawdzić czy zapytanie z INSERT się wykonało i czy choć jeden rekord został dodany, zanim wywołasz mysql_insert_id wink.gif Innymi słowy oprócz tego że to ma być int a nie varchar, myślę że bezpieczniejszym rozwiązaniem byłoby albo walnąć wszystko jako transakcję, albo jeśli nie jesteś aż tak obciążany:
  1. $insert = mysql_query("INSERT INTO `$table` SET $set");
  2. if( $insert AND mysql_affected_rows() > 0 ) {
  3. $id_ = mysql_insert_id();
  4. }
Bez tego może dojść do sytuacji, że będziesz próbował ustawić $id_ zarówno dla insert jak i update choć żaden z nich nie zwróci informacji iż zmiany/dodanie zaszły, bo mogło do nich nie dojść, czego powody mogą być różne: wyczerpał się limit dla autoincrement, nie doszło do zmian w rekordzie (update z danymi mimo poprawnego zapytania zwróci dla mysql_query prawdę, ale już 0 dla affected_rows ) lub podobne atrakcje.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.