pegmen: Datenbank User löschen

Hallo ihr, möchte in einer Datenbank neue User anlegen und über den Button löschen in der entstandenen Tabelle die Möglichkeit nutzen, auch wieder User zu löschen. Funktioniert leider nicht. Wollte das Ganze so gestalten, das alles mit Leerzeichen überschrieben wird. Findet jemand meinen Fehler? Danke pegmen
<html>
<head>
<title>Mini Datenbank</title>
</head>
<body>
<!--  Ein Formular zur Eingabe der Daten eines neuen Benutzers -->
<b>Anlegen von Usern:</b><br><br>
<form action=db.php" method="get">
<table>
<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>Login:</td>
<td><input type="Text" name="login"></td></tr>
<tr><td>Passwort:</td>
<td><input type="Text" name="pass"></td></tr>
<!--autom.Erzeugen einer ID mittels time()-->
<tr><td>autom. ID:</td>
<td><input type="Text" name="id" value ="<?php echo time();?>"></td></tr>
<tr><td>Userlevel:</td>
<td><select name="userlevel">
<?php for($i=1; $i<21; $i++) { ?>
<option value="<?php echo $i; ?>"><?php echo $i; ?></option>
<?php } ?>
</select></td></tr>
<tr><td colspan="2">
<input type="Submit" name="submit" value="User Speichern"></td></tr>
</table>
</form>
<?php
 /* Anlegen eines Datenbank-Arrays $csv_array zum auslesen der Einträge. */

function csv_write ( $csv_array, $fp ){
 $zeile = implode(",",$csv_array)."\r\n";
 fputs($fp,$zeile);
}

function read_csv($fp){
  while ( !feof ( $fp ) ) {
 $zeile = fgetcsv ( $fp, 4096 );
   if ( count ( $zeile ) == 6 ) {
 $csv_array[]= $zeile;
 }
 }
 return $csv_array;
}

if ($HTTP_GET_VARS["submit"] == "User Speichern") {

$fpr = @fopen("db.txt","r");
  if ( $fpr == true ) {
 $inhalt = false;
  while ( !feof ( $fpr ) ) {
 $lieszeichen = fgetc ( $fpr );
  if ( ( ord ( $lieszeichen ) != 0 ) && ( ord ( $lieszeichen ) != 10  ) && ( ord ( $lieszeichen ) != 13 )  &&
    ( ord ( $lieszeichen ) != 32 ) ) {
 $inhalt = true;
    break;
  }
  }
  fclose ( $fpr );
 }
   if ( $inhalt == true ) {
 $fp = fopen("miniDb.txt","a+");

if ($fp == true ) {

$allewerte = true;
 $datensatz = array ( $HTTP_GET_VARS["vorname"],
   $HTTP_GET_VARS["nachname"],
   $HTTP_GET_VARS["login"],
   $HTTP_GET_VARS["pass"],
   $HTTP_GET_VARS["userlevel"],
   $HTTP_GET_VARS["id"] );

foreach ( $datensatz as $val ){
  if ( $val == "" ) {
    echo ( "Bitte alle Werte ausfüllen");
 $allewerte = false;
  break;
   }
  }
  if ( $allewerte == true ){

csv_write($datensatz,$fp);
  }
      fclose($fp);
   }
 }
  if ( $inhalt == false ) {
 $fp = fopen("miniDb.txt","w+");

if ($fp == true ) {

$allewerte = true;
 $datensatz = array ( $HTTP_GET_VARS["vorname"],
   $HTTP_GET_VARS["nachname"],
   $HTTP_GET_VARS["login"],
   $HTTP_GET_VARS["pass"],
   $HTTP_GET_VARS["userlevel"],
   $HTTP_GET_VARS["id"] );

foreach ( $datensatz as $val ) {
   if ( $val == "" ) {
    echo ( "Bitte alle Werte ausfüllen");
  $allewerte = false;
    break;
  }
  }
   if ( $allewerte == true ){
    csv_write($datensatz,$fp);
    }
      fclose($fp);
  }
 }
}
 $fp = @fopen("miniDb.txt","r");
  if ($fp == true) {

?>
<p>
<b>Folgende User sind bereits vorhanden:</b>
</p>
<form action="miniDB.php" method="get">
<table cellspacing="0" cellpadding="2" border="1" bordercolor="Black" width="75%">
<tr>
<td>Vorname</td>
<td>Nachname</td>
<td>Login</td>
<td>Passwort</td>
<td>Userlevel</td>
<!-- <td>ID</td> -->
<td>Löschen</td>
</tr>
<?php

$zeile = read_csv($fp);

for ( $i = 0; $i < count ( $zeile ) ; $i++ ) {
  echo "<tr>";
  for ( $j = 0; $j < count ( $zeile[$i] ); $j++ ) {
   if ( $j <  count($zeile[$i]) -1 ) {
   echo "<td>".$zeile[$i][$j]."</td>";
   }else {
   echo "<td>";
?>
<input type="checkbox" name="loesch[]" value="<?php echo $zeile[$i][$j];?>">
<?php
echo "</td>";

}
}
  echo "</tr>";
}

?>
<tr>
<td colspan="7">
<input type="submit" name="submit" value="User loeschen"></td>
</tr>
</table>
</form>
<?php
   fclose($fp);
}
 if ( $HTTP_GET_VARS["submit"] == "User loeschen" ){
 $fp = @fopen("miniDb.txt","r+");
 if ( $fp == true ) {

$leer = " ";
  $leerstring = " ";
  $gelesen = 0;
  $geloescht = 0;

$zeile = read_csv($fp);
  for ( $i = 0; $i < count($zeile); $i++ ){

$gelesen += strlen(implode(",",$zeile[$i]));

for ( $j = 0; $j < count($zeile[$i]); $j++ ) {

if ( is_array ( $HTTP_GET_VARS["loesch"] ) ) {

foreach ( $HTTP_GET_VARS["loesch"] as $key => $value ){

if ( $zeile[$i][$j] == $value ){

$row = implode(",",$zeile[$i] );
       $geloescht += strlen($row);
    for ( $k = 0; $k < strlen($row); $k++ ){

$leer .= str_replace(substr($row,$k,1)," ",$row);
 $leerstring .= substr($leer,strpos($leer," ",$k),1);

}

fseek ( $fp, $gelesen - strlen($row) );

/*Jetzt wird ab der gesetzen Zeigerposition $leerstring geschrieben und ein "\r\n" angehängt.
Das ist der Zeilenumbruch unter Windows. Leider stimmt danach das Ergebnis nicht mehr :-( */
       fputs($fp,$leerstring,strlen($leerstring));
       fputs($fp,"\n");

fseek($fp, - strlen($leerstring)-2,SEEK_CUR);
}
}
  }else{
  echo "Bitte markieren Sie die Benutzer die Sie löschen wollen"."<br>";
  $loeschnone = true;
  break;
 }
 }
  if ( $loeschnone == true ){
   break;
 }

}

}
 @fclose($fp);
}
?>

</body>
</html>

  1. Hello,

    Hallo ihr, möchte in einer Datenbank neue User anlegen und über den Button löschen in der entstandenen Tabelle die Möglichkeit nutzen, auch wieder User zu löschen. Funktioniert leider nicht. Wollte das Ganze so gestalten, das alles mit Leerzeichen überschrieben wird. Findet jemand meinen Fehler? Danke pegmen

    Bis zu welcher Stelle bist Du denn gekommen?

    Welche Fehlermeldungen hast Du von System automatisch bekommen=?

    Wie empfindlich sit Deine automatische Fehlerbehandlung eingestellt?

    An welchen Stellen im Script hast Du denn schon Kontrollausgaben eingebaut und was haben die ergeben?

    Harzliche Grüße aus http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
  2. Moin!

    Findet jemand meinen Fehler?

    Eines der wichtigsten Prinzipien ordentlicher Programmierung ist "EVA - Eingabe, Verarbeitung, Ausgabe".

    Dieses Prinzip verletzt du auf äußerst üble Weise. Bei dir beginnt alles mit der Ausgabe - des HTML-Kopfes und Tabellenanfangs. Dann kommt etwas Funktionsdefinition und Eingabeerwartung des beim ersten Seitenaufruf noch gar nicht abgeschickten Formulars. Verarbeitung und Speicherung kommt mittendrin, dann wieder etwas Ausgabe (der Benutzer als Tabelle), und am Ende erneut Verarbeitung (die Löschroutine).

    Dieses Skript ist also dermaßen unübersichtlich durcheinander, dass es kaum glaubhaft ist, dass du dich da drin nach einem halben Jahr Nichtbetrachtung überhaupt noch auskennst.

    Du solltest deine Skripte streng strukturieren:
    Zuerst die Eingabe.
    Dann die Verarbeitung.
    Zuletzt die Ausgabe.

    Im Falle deiner Benutzerverwaltung bedeutet das:
    Ganz oben: Benutzeraktion feststellen. Will er löschen, will er hinzufügen oder ändern, oder will er (weil das der erste Seitenaufruf ist) überhaupt noch nichts besonderes?

    Je nach Benutzerwunsch wird eine entsprechende Funktion aufgerufen, die mit den weiteren Formulardaten und deiner CSV-Datei operiert und die gewünschte Operation ausführt. Hierbei werden auch Variablen mit Daten gefüllt, die im

    dritten Schritt dann in der Ausgabe einer vollständigen HTML-Datei verwendet werden.

    Grundsätzlich zu deinem Löschansatz: In einer Textdatei zu löschen, indem man Leerzeichen drüberschreibt, ist zwar grundsätzlich möglich, aber da sträuben sich mir alle Nackenhaare. Der saubere Ansatz wäre, die Datei komplett in ein Array einzulesen, das gewählte Arrayelement zu entfernen, und das restliche Array wieder komplett als CSV-Datei auf Platte zu schreiben.

    Bei Änderungen an Datensätzen mußt du das ja auch machen, weil sich grundsätzlich ja die Zahl der Zeichen eines Datensatzes verändern kann. Wird sie weniger, könntest du mit Leerzeichen auffüllen, wird sie mehr, hast du ein Problem.

    - Sven Rautenberg