PDO liest die Letzte ID nicht richtig aus

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • PDO liest die Letzte ID nicht richtig aus

    HiHo,

    Ich nutze seit kurzen in all meinen Scripten PDO.
    Allerdings musste ich feststellen das er die letzte eingetragene ID nicht richtig ausliest.

    Ist zb die ID in der Datenbank 87, liest er nur 8 aus. Ist die ID 12, liest er nur 1 aus.

    Es scheint aber alles RIchtig zu sein.

    Quellcode

    1. $pdoparams = array(
    2. ':paket' => $_GET['pakage'],
    3. ':anrede' => $_POST['anrede'],
    4. ':name' => $_POST['name'],
    5. ':adresse' => $_POST['adresse'],
    6. ':ort' => $_POST['plz'] . ' ' . $_POST['ort'],
    7. ':phone' => $_POST['phone'],
    8. ':email' => $_POST['email'],
    9. );
    10. $sql = 'INSERT INTO ' . KUNDEN . '
    11. (paket, anrede, name, adresse, ort, phone, email)
    12. VALUES (:paket, :anrede, :name, :adresse, :ort, :phone, :email)';
    13. $stmt = MyDB::getInstance()->prepare($sql);
    14. $stmt->execute($pdoparams);
    15. // AUsgabe der letzten Kunden ID
    16. $Kunden_ID = MyDB::getInstance()->lastInsertId();
    Alles anzeigen


    Habt ihr eine Lösung dafür?
  • Moin!

    Das ist aber mehr als ungewöhnlich. Sicher, dass die richtige Spalte den Auto-Increment hat?

    Mach doch mal ein SELECT zur Verifizierung:

    Quellcode

    1. $sql = "SELECT *
    2. FROM ' . KUNDEN . '
    3. WHERE id = :kundenid ";
    4. $stmt = MyDB::getInstance()->prepare($sql);
    5. $stmt->execute($pdoparams);
    6. $row = $stmt->fetch(array(
    7. ':kundenid' => $Kunden_ID
    8. ));
    9. print_r($row);



    Und was genau ist der Fehler? Dass der zurückgegebene Wert nicht mit dem Wert in der Datenbank übereinstimmt - oder dass dir der Wert allgemein nicht gefällt, weil es nicht die nächst höhere Zahl ist.

    Wenn du auf deiner Tabelle ein OPTIMIZE TABLE durchführst, dann werden alte IDs wieder neu vergeben.
  • d0nut schrieb:


    Und was genau ist der Fehler? Dass der zurückgegebene Wert nicht mit dem Wert in der Datenbank übereinstimmt - oder dass dir der Wert allgemein nicht gefällt, weil es nicht die nächst höhere Zahl ist.



    Er lliest die richtige ID aus, er gibt mir aber nur die 1 Ziffer der ID wieder. Er kürzt einfach die ID bis auf die erste Ziffer was nicht richtig ist.

    Ja die SPalte ist richtig

    Quellcode

    1. CREATE TABLE IF NOT EXISTS `kunden` (
    2. `id` mediumint(8) NOT NULL auto_increment,
    3. `anrede` text collate utf8_bin,
    4. `name` text collate utf8_bin,
    5. `adresse` text collate utf8_bin,
    6. `ort` text collate utf8_bin,
    7. `phone` text collate utf8_bin,
    8. `email` text collate utf8_bin,
    9. `activ` int(11) NOT NULL,
    10. `cookie_key` text collate utf8_bin,
    11. `login_date` int(11) NOT NULL,
    12. `pass` text collate utf8_bin,
    13. PRIMARY KEY (`id`)
    14. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=90 ;
    Alles anzeigen


    d0nut schrieb:


    Wenn du auf deiner Tabelle ein OPTIMIZE TABLE durchführst, dann werden alte IDs wieder neu vergeben.


    Das bringt mir ja auch nix. Es löst ja nicht das Problem das er nur die erste Ziffer einer mehrstelligen ID ausgibt.

    Auch ein COUNT mit PDO will nicht. Ich habe 89 Kunden, lese ich diese mit PDO aus, sagt er mir ich habe 54.

    Quellcode

    1. $sql = "SELECT COUNT(id) FROM " . KUNDEN;
    2. $stmt = MyDB::getInstance()->prepare($sql);
    3. $stmt->execute();
    4. $k_row = $stmt->fetch();
    5. $Smarty->assign(array(
    6. 'IN_KUNDEN' => $k_row['COUNT(id)'],
    7. ));


    Da stimmt doch vorne und hinten was nicht. Die PDO Klasse habe ich hier aus der Wiki

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Fragz ()

  • sicher, dass es sich bei INSERT und CREATE um die selben Tabellen handelt?
    Was ist mit der Spalte "paket" - die fehlt doch gänzlich beim CREATE. Es muss sich um eine andere Tabelle handeln..

    Ansonsten beweise es mir in dem du dieses Script mal ohne Änderungen ausführst (ACHTUNG: löscht Tabelle):

    Quellcode

    1. <?php
    2. require_once 'MyDB.php';
    3. $sql = 'DROP TABLE IF EXISTS kunden';
    4. $stmt = MyDB::getInstance()->prepare($sql);
    5. $stmt->execute($pdoparams);
    6. $sql = 'CREATE TABLE IF NOT EXISTS `kunden` (
    7. `id` mediumint(8) NOT NULL AUTO_INCREMENT,
    8. `anrede` text collate utf8_bin,
    9. `paket` text collate utf8_bin,
    10. `name` text collate utf8_bin,
    11. `adresse` text collate utf8_bin,
    12. `ort` text collate utf8_bin,
    13. `phone` text collate utf8_bin,
    14. `email` text collate utf8_bin,
    15. `activ` int(11) NOT NULL,
    16. `cookie_key` text collate utf8_bin,
    17. `login_date` int(11) NOT NULL,
    18. `pass` text collate utf8_bin,
    19. PRIMARY KEY (`id`)
    20. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=90';
    21. $stmt = MyDB::getInstance()->prepare($sql);
    22. $stmt->execute($pdoparams);
    23. $pdoparams = array(
    24. ':paket' => $_GET['pakage'],
    25. ':anrede' => $_POST['anrede'],
    26. ':name' => $_POST['name'],
    27. ':adresse' => $_POST['adresse'],
    28. ':ort' => $_POST['plz'] . ' ' . $_POST['ort'],
    29. ':phone' => $_POST['phone'],
    30. ':email' => $_POST['email'],
    31. );
    32. $sql = 'INSERT INTO kunden
    33. ( paket, anrede, name, adresse, ort, phone, email)
    34. VALUES (:paket, :anrede, :name, :adresse, :ort, :phone, :email)';
    35. $stmt = MyDB::getInstance()->prepare($sql);
    36. $stmt->execute($pdoparams);
    37. $Kunden_ID = MyDB::getInstance()->lastInsertId();
    38. if($Kunden_ID != 90) throw new Exception('kunden id ist '.$Kunden_ID);
    39. $stmt->execute($pdoparams);
    40. $Kunden_ID = MyDB::getInstance()->lastInsertId();
    41. if($Kunden_ID != 91) throw new Exception('kunden id ist '.$Kunden_ID);
    42. echo "success";
    Alles anzeigen