PHP Datenbank ID hochzählen?

hazzilein

Lieutenant
Registriert
Mai 2008
Beiträge
692
Hallo, ich komme einfach nicht weiter, bin leider PHP Neuling.

Ich muss im Rahmen meines Studiums als Übung eine kleine Datenbank aufbauen.

Dabei speichere ich Vorname Größe Alter usw. in einer Datei ab.

Die einzelnen Zeilen in der Datei werdenmit ";" getrennt und dann wieder mit explode zerlegt und in einer Tabelle ausgegeben

Jetzt soll das ganze aber objektorientiert sein. Ich hab also eine Klasse für meine Person und eine Funktion das mir aus dem ganzen eine Zeile erstellt.

Dem Konstruktor geb ich folgendes mit, hängt euch nicht mit dem Zähler auf der ist jetzt unwichtig und war dazu da um auszulesen wieviele Freunde wir schon gespeichert haben:

als erstes geb ihr ihm das $id mit, also meine ID, die beim ersten Freund 1 dann 2 dann 3 sein soll.

public function __construct($id,$n,$a,$g=NULL,$h=NULL,$c=NULL,$u){
//Konstruktor Perosn aufrufen
// Person parent von Freund
parent::__construct($n);
self::$zaehler++; // variable oben, self bezeichnet klasse
//$this -> name = $n;
$this -> id1 = $id;
$this -> alter = $a;
$this -> groesse = $g;
$this -> haarfarbe = $h;
$this -> cool = $c;
$this -> url = $u;
}


Dann hier die Funktion die mir die Zeile erstellt.

public function alsCSVZeile(){
return

$this -> id1 . ";" .
$this -> name . ";" .
$this -> alter . ";" .
$this -> groesse . ";" .
$this -> haarfarbe . ";" .
$this -> cool . ";" .
$this -> url; // beendet return
}


Und hier letzt endlich in der anderen PHP Datei der Aufruf dass eine Person erstellt wird und der Aufruf zur Umwandlung in eine Zeile.

$freunde[] = new Freund($idhelper,$_POST['vorname'],$_POST['alter'],$_POST['groesse'],$_POST['haarfarbe'],$_POST['istcool'],$str2);

for($i = 0; $i < count($freunde); $i++){
$zeile .= ("\n" .$freunde[$i] -> alsCSVZeile());


Ich gebe hier also eine Variable $idhelper mit, mit welcher ich die ID festlegen will.

Habs auch schon oft hinbekommen aber wenn ich dann sagen wir die Nummer 5 lösche, erstellt er mir die letzte ID doppelt weil das bei mir bisher immer von der Zeilenanzahl abhängig war.


Ich komme einfach nicht darauf wie ich das hochzählen lassen kann und dann mit der variable $idhelper übergebe...

Wenn ich mit $idhelper++ arbeiten möchte muss ich mir zuerst mal einen Anfangswert festlegen, und den nimmt er dann immer wieder als Ausgangspunkt wenn er die Datei durchläuft, wie kann ich das lösen?

Dachte schon daran nur einmal den $idhelper auf 0 zu setzen wenn die Seite das erste mal aufgerufen wird, aber das kann ich nicht. Und zweitens wenn man dann wieder neu aufruft steht der Zähler bei jedem neuen Starten der Seite ja wieder auf 0 und zählt hoch...

Angehängt noch die Dateien, falls jemand mal reinschaun will.

Wäre echt super wenn sich das mal jemand ankucken könnte... probier schon seit 5 Stunden ohne Pause herum und hab schon etliche Gedanken ausprobiert...

PS: Dass dann ID Sprünge nach dem löschen drin sind ist egal, also es muss nicht alles neu durchnummeriert werden, was ich auch schon ausprobiert hab...

mfg
Ergänzung ()

Edit:

Hab jetzt was gefunden mit der ich ne random ID erstelle mit 23 Zeichen. Das denke ich ist nich so gut oder? Würde halt einwandfrei klappen aber es sollte von 1 an weg zählen.
 

Anhänge

  • ln3.rar
    2,8 KB · Aufrufe: 116
Bei Random-IDs müsstest du auch prüfen, ob sie schon vergeben wurde - auch wenn es unwahrscheinlich ist.

Wieso machst du keine Klasse für die eigentliche Datenbank, und dort dann eine Funktion rein wie "nextID()", welche die nächste freie ID zurückliefert? Du könntest die letzte vergebene ID ja auch in einer separaten Datei speichern...
 
Naja wenn man objektorientiert arbeitet, dann sollten IDs uninteressant sein. Es gibt Datenstrukturen die sich zum Speichern von solchen Informationen eignen. IDs brauch man eigentlich nur für Relationale Datenbanken. Ist bei dir aber nicht der Fall.

Versuch doch mal die Personen in einem Array / Vektor oder einer Liste zu speichern. Wenn du die Personen verknüpfen willst, kannst du diese direkt als Referenz übergeben und intern im Personenobjekt die ganzen Freunde-Referenzen wiederum in einem Vektor oder einer Liste speichern. Die Datenstruktur sollte dir auch die richtige Größe / Anzahl der Freunde wiedergeben.
 
Naja es ist ein Leistungsnachweis ;) und da ist das eben so gefordert :/

Kann mit jemand erklären wie ich das Problem löse, dass wenn ich z.b. sage $idhelper = 1; und dann woanders $idhelper++; es eben dazu kommt dass er dann wenn er von vorne beginnt wieder bei 1 startet und nicht bei dem vorherigen ersten Wert. Das ist ja das einzige Problem dabei...

Ich hatte schon überlegt wenn ich schreibe:

if(!$idhelper){
$idhelper = 0;
}
else{
$idhelper++;
}

Was ja soviel heißt wie: Wenn es §idhelper nicht gibt dann erstell ihn mir und beleg ihn mit dem Wert 0, falls es idhelper schon gibt zähle um 1 hoch... aber ging nicht
 
Zuletzt bearbeitet:
Ich habe das doch schon gesagt... "Du könntest die letzte vergebene ID ja auch in einer separaten Datei speichern... "
 
Tut mir leid ich hab da nich ganz verstanden was du damit gemeint hast, bzw versteh es immer nochnicht genau ;) Ich versuch grad ne funktion auf die Beine zu stellen, bei jedem Aufruf wird um 1 erhöht und zurückgegeben. Aber muss erst schaun ob ich dann wo den Ausgangswert unberührt hinschreiben kann.
 
Und wie initialisierst du diesen Wert, der soll ja kaum bei jedem Lauf anfangs 0 sein...

Speicher dir doch einfach die letzte vergebene (oder die nächste zu vergebende) ID in einer Datei ab... merken musst du sie ja eh irgendwo...
 
$file1 = fopen("freunde.csv", "r");
if($file1){
while(!feof($file1)){
$zeile1 = fgets($file1);
$freunde1[]=explode(";", $zeile1);
}
$id = 0;
foreach ($freunde1 as $f => $freund1){
$idhelper = $freund1[0];
$idhelper++;
}

fclose($file1);
}



Damit hab ich das ganze jezt gelöst. Allerdings besteht das Problem dass wenn ich 5 Einträge mache, den dritten lösche, ich dann ein "loch" in dem Verlauf der IDs habe... also 1 2 4 5 6 usw..

Geht also auch ohne es in ner extra Datei zu speichern, ich hols mir quasi aus der selben Datei raus die ich eh schon hab.
 
Ich finde die Löcher alles andere als verkehrt... was spricht gegen ein Loch bei den IDs?

Angenommen es wäre ein Forum, und ein User mit ID 3 wird gelöscht, aber seine Postings versehentlich nicht... willst du nun Gefahr laufen, dem neuen User diese Postings zuzuordnen?

Und dass es mit der selben Datei geht, in der auch die Daten abgespeichert werden, hab ich gar nicht abgestritten. Aber an sich finde ich es relativ umständlich, über alle Einträge einmal drüber zu iterieren nur um die letzte ID zu bekommen... was ist übrigens, wenn die Datei aus welchen Gründen auch immer mal nicht sortiert nach IDs abgespeichert wird? Warum iterierst du drüber, wenn du eh nur den letzten Wert beachtest? Es entsteht auch keine Lücke übrigens, wenn der letzte User der Liste gelöscht wird - dann hast du das Problem von vorhin theoreitsch, dass eine früher vergebene ID erneut vergeben wird...
 
Zuletzt bearbeitet:
Ich hab auch versucht den Pointer an das Ende zu setzten und dann gleih die letzte Zahl im letzten Array auszulesen aber irgendwie hab ich das nicht so hinbekommen wie ich wollte.

Obwohl jetzt fällt mir ein ich könnte ja von hinten nach vorne durch gehen und dann mit break stoppen oder? .. Muss ich gleich mal versuchen

Das mit einer extra Datei für die letzte ID werd ich auch mal testen.
 
Es ist völlig normal, in einer Datenbank "Löcher" in der ID-Sequenz zu haben. Bei Systemen wie MySQL etc. ist das genauso. Insofern verhält sich dein Programm schon völlig korrekt :)
 
Zurück
Oben