PHP-Adressbuch

J1M1

Erfahrenes Mitglied
Hallo!

Ich erstelle gerade ein Adressbuch für meine Website... Das Problem ist, dass man die alten Einträge nicht wie beim Gästebuch ans Ende anhängen kann, sondern ich will dass die Einträge nach dem Namen alphabetisch geordnet sind... Leider weiß ich nicht wie ich das machen soll.

Hier ist der Code von einem PHP-Gästebuch (das Fettgedruckte ist der Code, dass die alten Einträge einfach nur ans Ende hängt und somit geändert werden muss):
PHP:
 <html>
<head>
<title>Gästebuch</title>
</head>
<body>
<div align="center">
<a href="eintrag.html" target="_self">Neuer Eintrag</a><br>
<br>
<?php


$name = $HTTP_POST_VARS['name'];
$email = $HTTP_POST_VARS['email'];
$text = $HTTP_POST_VARS['adresse'];

if($submit)

{
if(($email == "") || ($name == "") || ($adresse == ""))
echo "<b>Fehlgeschlagen! Bitte alle Felder ausfüllen!</b>";

else
{

// Variable X wird auf null gesetzt
$x = 0;

$dateiname = "abook.txt";

$datei = fopen($dateiname, "r");

while (!feof($datei)) {
$x++;
$saved[$x] = fgets($datei, 1024);

}
// Datum und Uhrzeit ermitteln
$datum = date("d.m.Y");
$zeit = date("H:i");

$datei=fopen("abook.txt", "w");

$text=strip_tags($adresse);

// Hier wird der neue Eintrag in die Datei geschrieben
fwrite($datei,"<table border=0 width=500 bgcolor=000000 cellspacing=1 cellpadding=3><tr><td bgcolor=ffffff><a href=\"mailto:$email\"><b>$name</b></a> schrieb am $datum um $zeit Uhr</td></tr><tr><td bgcolor=white>$adresse</font></td></tr></table>\n");


for ($i=1;$i <= $x; $i++) {
fwrite($datei, "$saved[$i]");
}
// Datei schliessen
fclose($datei);
}
}



$dateiname = "abook.txt";
$datei = fopen($dateiname, "r");
fpassthru($datei);
?>
</div>
</body>
</html>

Hoffe auf Ideen....

Mfg J!M!
 
Ich würde versuchen die Datei auszulesen , die Werte an gewissen Trennszeichen zu zerlegen , diese dann alle in ein Array speichern.

Den neusten Antrag hinten ran hängen an das Array mit array_push() um dann alles mit sort() zu sotieren. Und dieses Array dann wieder zu einen Text zusammenfügen und komplett reinspeichern.

Datei müsstest du dazu mit dem modus w öffnen um den alten Inhalt noch rauszuhaun dann bevor du es wieder neu reinschreibst.

PHP:
       $x = 0; 
       
       $adressen = array();
    $saved = "";
      $dateiname = "abook.txt"; 
      $datei = fopen($dateiname, "r"); 
       
       while (!feof($datei)) { 
         $saved .= fgets($datei, 255); 
      } 
       
       $saved = explode("Trennzeichen" , $saved);
       for($i = 0 ; $i < count($saved) ; $i++)
       {
       	array_push($adressen , $saved[$i);
       }
       
       $eintrag = array_push($adressen, $neuer_eintrag) 
       // neuer eintrag ist quasi das was du im Mailform da angegeben hast
       $eintrag = join ("Trennzeichen" , sort($adressen));

So würde ich es probieren mal , und ist ungetestet nun aber ich vermute so könnte es klappen :)

Edit wo ich eben drüber nachdenke , könntest du es bei der Abfrage sotieren , im Prinzip musst du bei beiden die Email / Namen oder was auch immer rausfiltern mittels regulären Ausdrücken und diese dann sotieren. Ansonsten versucht er immer die Tabelle zu sotieren was ja nun quatsch ist im eigentlichen.Also würde ich das eigentlich direkt bei der Ausgabe machen dann.
 
Zuletzt bearbeitet:
Hallo,
es geht noch einfacher. Du liest die Textdatei mit [phpf]file[/phpf] in ein Array. Dieses Array kannst du dan sortiert ausgeben.

mfg
forsterm
 
Mhm das Problem das ich bei file() sehen würde das er es Zeilenweise in ein Array speichert.

Also wenn es mit Umbrüchen in der Datei steht dann kommt es da zu Problemen.Des weiteren bin ich mir nicht sicher wie Sort() vorgeht.
Eigentlich sollte ja jeder Eintrag der Tabellen gleich sein bis zu den Einträgen Mail und Name.Da müsste er das eigentlich sotieren dann.Also wäre das mit den Regulären Ausdrücken übertrieben und man würde ja Versuchen nen Quicksort zu schreiben.
Wie gesagt es ist nicht getestet , aber theoretisch sollte das funktionieren. Wenn die Einträge , also die komplette Tabelle in einer Zeile ist sollte das mit file() kürzer klappen.
 
@fipsthethief
kann man sich voll auf dein skript verlassen oder sind da einige fehler dabei?
die fehler die ich gefunden habe schreibe ich als kommentar in dein skript rein... bitte bestätige mir dann ob es wirklich fehler sind...
PHP:
$x = 0; 
       
       $adressen = array();
    $saved = "";
      $dateiname = "abook.txt"; 
      $datei = fopen($dateiname, "r"); 
       
       while (!feof($datei)) { 
//muss hier nicht wie beim Guestbookskript  eigentlich "x++" und "saved[x]"stehen?
         $saved .= fgets($datei, 255); 
      } 
       
       $saved = explode("Trennzeichen" , $saved);
//muss hier die datei nicht erstmal im 'w' modus geöffnet werden?
       for($i = 0 ; $i < count($saved) ; $i++)
       {
           array_push($adressen , $saved[$i);
       }
       
       $eintrag = array_push($adressen, $neuer_eintrag) 
       // neuer eintrag ist quasi das was du im Mailform da angegeben hast
       $eintrag = join ("Trennzeichen" , sort($adressen));

Mfg J!M!

P.S.: trotzdem danke für deine antwort
 
Also ich denk schon das es so klappt , im Prinzip sotiere ich ja das Array damit und da ja alle Einträge soweit gleich sind durch die Tabelle sollte er erst Unterschiede bei einen Namen oder Emain finden. Somit würde ich sagen ja haut hin.

Nein es muss kein $x++ stehen oder $saved[$x] da ich jede Zeile einlese und an einanderhänge.
Also sieht so ca aus dann , $zeileN ... $zeile3,$zeile2,$zeile1.

Das habe ich aus diesem Grunde so gemacht da es in meiner Textdatei nicht in einer Zeile gespeichert war sondern sich die Tabelle über 4 - 5 Zeilen hinzog. Somit hatte ich erstmal alles in einen String und habe es dann anhand eines Trennzeichens zerlegt.

Die Datei wurde erstmal im Modus r geöffnet am Anfang um den Inhalt in Ruhe auszulesen , wenn du sie an dieser Stelle mit Modus w öffnen würdest dann wäre der gesammte Inhalt weggewesen. Des weiteren hab ich dann weiter unten die Datei im Modus w geöffnet als er es reinschreiben sollte ;)

Der Teil fehlt da in diesem Script also nen bissel was musst selber noch machen.

Und wie schon gesagt , wenn deine Einträge immer in einer Zeile sind dann kann man wie schon oben gesagt file() nehmen. Geht flotter ohne das rumgemurkse ;)
 
Der Teil fehlt da in diesem Script also nen bissel was musst selber noch machen.

achso, ich habe mich versehen....
du hast ja nur ein die variable/array $einträge geschrieben... ich dachte du schreibst schon die abook.txt....und so mit in die datei....

das heißt ich müsste dann noch schreiben
PHP:
$datei=fopen("abook.txt", "w"); 
fwrite($datei, "$einträge");
richtig?
wie gesagt, bin nicht so gut in PHP, deswegen stell ich glaueb ich ein bissl zu viel fragen...

danke!

Mfg J!M!
 
richtig ;)

in dem Fall zwar $eintrag , weil $eintrag ist das wo alle Array Elemente sotiert und dann zusammengeführt wurden.

Im Prinzip ist es das gleiche was du auch machst in deiner Funktion , nur setzt die Array Elemente direkt fest mittels $saved[$x] und jedes Element enthält 102x zeichen.

Ich pack es erstmal in einen String und kümmer mich dann später darum :)
 
Zuletzt bearbeitet:
also irgendwo ist da doch ein fehler...
ist glaube ich auch meiner....

dies ist der quelltext den ich jetzt verwende:
PHP:
<?php
$vorname =  $HTTP_POST_VARS['vorname']; 
$nachname = $HTTP_POST_VARS['nachname']; 
$adresse = $HTTP_POST_VARS['adresse'];
$phone = $HTTP_POST_VARS['phone'];
$mobile = $HTTP_POST_VARS['mobile'];
$email = $HTTP_POST_VARS['email']; 
$msn = $HTTP_POST_VARS['msn'];
$icq = $HTTP_POST_VARS['icq'];

 

if($submit) 

{ 
if(($vorname == "") && ($nachname == "") && ($adresse == "") && ($phone == "") && ($mobile == "") && ($email == "") && ($msn == "") && ($icq == "")) 
echo "<b>Fehlgeschlagen! Bitte alle Felder ausfüllen!</b>"; 

else 
{ 

// Variable X wird auf null gesetzt 
$x = 0; 
       $new = array();
       $adressen = array();
       $saved = "";
       $dateiname = "abook.txt"; 
       $datei = fopen($dateiname, "r"); 
       
       while (!feof($datei)) { 
         $saved .= fgets($datei, 255); 
       } 
       
       $saved = explode("," , $saved);
       for($i = 0 ; $i < count($saved) ; $i++)
       {
           array_push($adressen , $saved[$i]);
       }
       
       $eintrag = array_push($adressen, $vorname, $nachname, $adresse, $phone, $mobile, $email, $msn, $icq); 
       // neuer eintrag ist quasi das was du im Mailform da angegeben hast
       $eintrag = join ("," , sort($adressen));

$datei=fopen("abook.txt", "w"); 
fwrite($datei, "$eintrag"); 
 
fclose($datei); 
} 
} 

$dateiname = "abook.txt"; 
$datei = fopen($dateiname, "r"); 
fpassthru($datei); 

?>

und der HTML-Quellcode ist:
HTML:
<form name="eintrag" action="/book.htm" method="post">
<table border="0" cellpadding="0" cellspacing="6" width="191">
<tr>
<td>Vorname:</td>
<td><input type="text" name="vorname"></td>
</tr>
<tr>
<td>Nachname</td>
<td><input type="text" name="nachname"></td>
</tr>
<tr>
<td>Adresse(=>Straße, Hausnummer, PLZ, Stadt)</td>
<td><input type="text" name="adresse"></td>
</tr>
<tr>
<td>Telefonnummer</td>
<td><input type="text" name="phone"></td>
</tr>
<tr>
<td>Handynummer</td>
<td><input type="text" name="mobile"></td>
</tr>
<tr>
<td>Email:</td>
<td><input type="text" name="email"></td>
</tr>
<tr>
<td>MSN</td>
<td><input type="text" name="msn"></td>
</tr>
<tr>
<td>ICQ</td>
<td><input type="text" name="icq"></td>
</tr>
<tr>
<td><input type="reset" value="Reset"></td>
<td>
<input type="submit" name="submit" value="Eintragen">
</td>
</tr>
</table>
</form>

wenn du nun auf http://hang.ha.funpic.de/new_add.htm gehst und die felder mal ausfüllst und es probierst... erscheint die meldung
Warning: join(): Bad arguments. in /usr/export/www/vhosts/funnetwork/hosting/hang/book.htm on line 106


Mfg J!M!
 
ok... es ist doch nicht mein fehler...

und zwar wenn ich das "sort" wegmache, dann gíbt es da kein problem. es wird glaube ich das "sort" einfach nicht erlaubt.
aber somit ist die haupfunktion weg.
es macht sichauch bemerkbar:
es gibt KEINE zeilenumbrüche, alles ist in eine Zeile geschrieben... etc
 
Zurück