Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][MySQL]mysql_insert_id mały klopot
acztery
post
Post #1





Grupa: Zarejestrowani
Postów: 945
Pomógł: 7
Dołączył: 15.03.2005
Skąd: katowice

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




A nowy rekord się dodaje?


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
acztery
post
Post #3





Grupa: Zarejestrowani
Postów: 945
Pomógł: 7
Dołączył: 15.03.2005
Skąd: katowice

Ostrzeżenie: (0%)
-----


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 ...
Go to the top of the page
+Quote Post
nospor
post
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




No jeśli nowy rekord się dodaje to ID powinno być zwrócone.
Czy na pewno ID jest autoincrement?


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
acztery
post
Post #5





Grupa: Zarejestrowani
Postów: 945
Pomógł: 7
Dołączył: 15.03.2005
Skąd: katowice

Ostrzeżenie: (0%)
-----


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

Ten post edytował acztery 6.05.2011, 07:11:13
Go to the top of the page
+Quote Post
nospor
post
Post #6





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
acztery
post
Post #7





Grupa: Zarejestrowani
Postów: 945
Pomógł: 7
Dołączył: 15.03.2005
Skąd: katowice

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
thek
post
Post #8





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 05:08