You are not logged in.

  • Login

1

Thursday, July 22nd 2010, 11:39pm

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.

PHP Quellcode

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


Habt ihr eine Lösung dafür?

2

Friday, July 23rd 2010, 8:54am

Moin!

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

Mach doch mal ein SELECT zur Verifizierung:

PHP Quellcode

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

3

Friday, July 23rd 2010, 9:30am


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

SQL Code

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



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.

PHP Quellcode

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


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

This post has been edited 2 times, last edit by "Fragz" (Jul 23rd 2010, 12:29pm)


4

Friday, July 23rd 2010, 8:16pm

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):

PHP Quellcode

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

5

Friday, July 23rd 2010, 10:15pm

HiHo,

Ja es handelt sich um die selben Tabellen. Habe vor dem Copy hier in das Forum einige Spalten entfernt da es sonst den Rahemn gesprängt hätte.

Hat sich aber erledigt, habe auf meine alte DB Klasse zurückgegriffen.

6

Saturday, July 24th 2010, 11:39am

In welcher PHP Version entwickelst du denn?

7

Saturday, July 24th 2010, 12:50pm

Unter php5 in der neusten version

9

Saturday, July 24th 2010, 6:12pm

Hab ich garnicht mehr versucht. dazu hätte ich alles wieder ändern müssen

10

Monday, July 26th 2010, 3:19am

Durch einme Zufall in einem anderen Script bin ich auf die Lösung gestossen

Nicht

PHP Quellcode

1
$Kunden_ID = MyDB::getInstance()->lastInsertId();


Sondern

PHP Quellcode

1
$Kunden_ID = MyDB::getInstance()->lastInsertId($sql);

Similar threads

Social bookmarks