Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: PDO::lastInsertId - jak pobrać przy bindowaniu?
Forum PHP.pl > Forum > PHP
Kwpolska
Chcę stworzyć superprosty CMS do użytku prywatnego jako uzupełnienie bloga, i największy problem mam z dodawaniem w panelu administracyjnym. Wszystko inne jest OK, tylko z tym nieszczęsnym ID mam problem. Czy wie ktoś, co trzeba tu poprawić? W manualu nic nie znalazłem, a z podpowiedzi z ##php na freenode nic nie wiem teraz (namącili).
  1. try
  2. {
  3. $pdo = new PDO('mysql:host=localhost;dbname=a7967401_wp;port=3306', 'a7967401_wp', '/* Haslo wyciete */');
  4. $pdo -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  5.  
  6. $stmt = $pdo -> prepare('INSERT INTO `kwportal_entries` (`id`, `title`, `contents`) VALUES(
  7. :id,
  8. :title,
  9. :contents)');
  10.  
  11. $stmt -> bindValue(':id', /* questionmark.gif */, PDO::PARAM_INT);
  12. $stmt -> bindValue(':title', $_POST['title'], PDO::PARAM_STR);
  13. $stmt -> bindValue(':contents', $_POST['cnt'], PDO::PARAM_STR);
  14.  
  15. $ilosc = $stmt -> execute();
  16.  
  17. if($ilosc > 0)
  18. {
  19. echo 'Dodano.';
  20. }
  21. else
  22. {
  23. echo 'BŁĄD!';
  24. }
  25.  
  26. }
  27. catch(PDOException $e)
  28. {
  29. echo 'Wystąpił błąd biblioteki PDO: ' . $e->getMessage();
  30. }
vokiel
Po linii 15.
  1. $lastInsertId = $pdo>lastInsertId();
Kwpolska
Zrobienie tak, jak poleca vokiel sprawi, że będę miał podany ID, ale już PO wysłaniu do bazy. Jak sprawić, żeby ID był pobrany tak, jak na schemacie poniżej?
Kod
     +-------------------+
     | pobranie id       |
     | (w dowolny        |
     | sposób)           |
     +-------------------+
               |
              \|/
     +-------------------+
     | wysyłanie         |
     | danych z $id++    |
     +-------------------+
wry
domyslam sie ze pole id to klucz glowny i do tego autoincrementowany (jesli nie to zrob tak zeby byl) wiec mozesz smialo usunac z zapytnia id przez co nie bedziesz musial bindowac :id z zadna wartoscia silnik bazy danych sam sie zatroszczy o to zeby wypelnic ta krotke
darko
  1. // najpierw
  2. $result = $pdo->query("select last_insert_id()");
  3. $temp = $result->fetch(PDO::FETCH_NUM);
  4. $last_id = $temp[0];
  5. // później
  6. $stmt -> bindValue(':id', ++$last_id, PDO::PARAM_INT);

Poza tym jak wspomniano wyżej wartości autoinkrementowanych nie trzeba wstawiać samodzielnie, albo wystarczy podać "NULL" ("łańcuch znaków, nie typ).
vokiel
Kolumna ID w bazie powinna być typu int, z autoincrement. Wtedy nie potrzebujesz pobierać największego istniejącego id, inkrementować go, i takim dodawać do bazy. W taki sposób masz 1 zamiast 2 zapytań.


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.