Funktionsaufruf bricht FOR Schleife ab

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

  • Funktionsaufruf bricht FOR Schleife ab

    Also ich habe ein Script gebastelt das CSV Datenbankdateien verwaltet. Hierzu lese ich über FOR Schleifen jeweils zeilenweise aus der Datei in einen Array ein und wieder aus.
    Nun habe ich eine Schleife geschrieben die eine checkbox die hinter jeder zeile ist ausliest und wenn diese aktiviert ist die funktion delete_line ausführt. Leider funktioniert das aber nur mit der ersten markierten Zeile. Hat jemand eine idee woran das liegt?

    Quellcode

    1. for($i=1; $i<$zeile; $i++)
    2. {
    3. if(isset($_POST['del'][$i]) != "")
    4. {
    5. $his=$i;
    6. delete_line($datenbank,$i);
    7. echo "ok";
    8. $i=$his;
    9. }
    10. }
    11. echo "<br>";
    12. echo"<meta http-equiv=\"refresh\" content=\"0; URL=changes.php\">";
    13. echo"</table><a href=\"tedit.php\">Fortfahren</a>";
    14. unset($del);
    15. }
    16. function delete_line($file, $line, $change_in = "") {
    17. $entries = file($file);
    18. if(empty($change_in)) {
    19. unset($entries[$line-1]);
    20. } else {
    21. $entries[$line-1] = $change_in;
    22. }
    23. $newentries = implode("", $entries);
    24. $datei = fopen($file, "w");
    25. fputs($datei, $newentries);
    26. fclose($datei); }
    Alles anzeigen
    &#8222;Wenn man zwei Stunden lang mit einem Mädchen zusammensitzt, meint man, es wäre eine Minute. Sitzt man jedoch eine Minute auf einem heißen Ofen, meint man, es wären zwei Stunden. Das ist Relativität.&#8220; - Albert Einstein
  • hi,

    poste mal mehr code, damit wir wissen welchen wert $zeile hat
    außerdem ist die abfrage suboptimal - vielleicht funktioniert sie, aber sie ist nicht gut
    if(isset($_POST['del'][$i]) != "")

    isset liefert ein boolean - perfekt für eine schleifenbedinung
    => if(isset($_POST['del'][$i]))

    in die funktion delete_line() könntest du dann noch eine ausgabe machen
    z.b. echo 'versuche '.$line.' zu loeschen<br />';

    dann wissen wir ob die funktion aufgerufen wird
  • $Zeile wird zu Beginn des Scripts auf die Zeilenanzahl der CSV Datei gesetzt.
    Das Problem ist aber das offenbar die FOR Schleife mit dem ersten Aufruf meiner Zeilenänder/lösch Funktion abgebrochn wird
    &#8222;Wenn man zwei Stunden lang mit einem Mädchen zusammensitzt, meint man, es wäre eine Minute. Sitzt man jedoch eine Minute auf einem heißen Ofen, meint man, es wären zwei Stunden. Das ist Relativität.&#8220; - Albert Einstein
  • Quellcode

    1. <html>
    2. <head>
    3. <meta http-equiv="expires" content="0">
    4. <meta http-EQUIV="pragma" content="no-cache">
    5. <title>Programm &Auml;ndern</title>
    6. <link href="../../style/css/text.css" rel="stylesheet" type="text/css">
    7. <link href="../../style/css/div.css" rel="stylesheet" type="text/css">
    8. </head>
    9. <div id="content">
    10. <form action="<? echo $PHP_SELF?>" method="POST" name=save>
    11. <table width="100%" border="1">
    12. <tr>
    13. <td>&nbsp;</td>
    14. <td><strong>Kursbezeichnung</strong></td>
    15. <td><strong>Wochentage</strong></td>
    16. <td><strong>Raum/Turnhalle</strong></td>
    17. <td><strong>Ort/Stadtteil</strong></td>
    18. <td>&nbsp;</td>
    19. </tr>
    20. <?php
    21. //CSV Datenbanktool von Johannes Gottschalk im Auftrag von Objekt+Grafik U.Lunenberg
    22. // Umgebungsvariablen
    23. $datenbank="../kurse.tab";
    24. // wichtige Aufrufe
    25. $zc=file($datenbank); //Lädt die Datenbank in ein Array
    26. $countedline=count($zc); //Zählt die Zeilen des Arrays
    27. unset($zeile); //löscht die Variable $Zeile
    28. $Dateizeiger = fopen($datenbank, "r"); //Öffnet die Datenbank zum lesen
    29. while(($Daten = fgetcsv($Dateizeiger, 1000, "|")) !== FALSE) //Liest die Datenbank Zeilenweise bis zum Ende aus
    30. {
    31. // $tdsum = count($Daten); // Zellen zählen oder fest einstellen
    32. $tdsum = "4"; //Anzahl der Zellen auf 4 festgesetzt
    33. $zeile++; //Zeilenzähler +1
    34. echo"<tr><td> ",$zeile,"</td>"; //Ausgabe HTML
    35. for($i = 0; $i < $tdsum; $i++)
    36. {
    37. echo"<td>",
    38. "<input type=\"text\" value=\"",
    39. $Daten[$i],"\"",
    40. "name=\"feld[",
    41. $zeile,
    42. $i,
    43. "]\">",
    44. "</td>";
    45. }
    46. if($countedline<2){
    47. echo"<td>Achtung - letzter Datensatz</td>"; }
    48. else{
    49. echo"<td><input type=\"checkbox\" name=\"del[",
    50. $zeile,
    51. "]\">l&ouml;schen</td></tr>"; }
    52. }
    53. // neuer Eintrag
    54. if(isset($_POST['new']) != "")
    55. {
    56. echo"<tr bgcolor=\"red\"><td>NEU</td>";
    57. for($i = 0; $i < $tdsum; $i++)
    58. {
    59. echo"<td>",
    60. "<input type=\"text\"",
    61. "name=\"newrow[",
    62. $i,
    63. "]\">",
    64. "</td>";
    65. }
    66. echo"<td><input type=\"submit\" name=\"addent\" value=\"Hinzuf&uuml;gen\"></td>";
    67. }
    68. else
    69. {
    70. echo"<input type=\"submit\" name=\"speichern\" value=\"speichern\">",
    71. "<input type=\"submit\" name=\"new\" value=\"neuer Eintrag\">";
    72. }
    73. fclose($Dateizeiger);
    74. if(isset($_POST['addent']) != "")
    75. {
    76. unset($ndat);
    77. for($i = 0; $i < $tdsum; $i++)
    78. {
    79. $ndat.=$_POST['newrow'][$i];
    80. $abfr=$tdsum;
    81. $abfr--;
    82. if($i<$abfr)
    83. {
    84. $ndat.="|";
    85. }
    86. else
    87. {
    88. $ndat.="\n";
    89. }
    90. $abfr++;
    91. }
    92. echo$ndat;
    93. $dateischreiber = fopen($datenbank, "a");
    94. fwrite($dateischreiber, $ndat);
    95. fclose($dateischreiber);
    96. echo"<meta http-equiv=\"refresh\" content=\"0; URL=changes.php\">";
    97. }
    98. ?>
    99. </table>
    100. </form>
    101. <?
    102. if(isset($_POST['speichern']) != "")
    103. {
    104. unset($ndat);
    105. $zeile++;
    106. for($irow=1; $irow<$zeile; $irow++)
    107. {
    108. for ($icol=0; $icol<$tdsum; $icol++)
    109. {
    110. unset($fln);
    111. $fln=$irow;
    112. $fln.=$icol;
    113. $ndat.=$_POST['feld'][$fln];
    114. $icol++;
    115. if($icol<$tdsum)
    116. {
    117. $ndat.="|";
    118. }
    119. else
    120. {
    121. $ndat.="\n";
    122. }
    123. $icol--;
    124. }
    125. }
    126. unlink($datenbank);
    127. $dateischreiber = fopen($datenbank, "a");
    128. fwrite($dateischreiber, $ndat);
    129. fclose($dateischreiber);
    130. for($i=1; $i<$zeile; $i++)
    131. {
    132. if(isset($_POST['del'][$i]) != "")
    133. {
    134. $his=$i;
    135. delete_line($datenbank,$i);
    136. echo "ok";
    137. $i=$his;
    138. }
    139. }
    140. echo "<br>";
    141. echo"<meta http-equiv=\"refresh\" content=\"0; URL=changes.php\">";
    142. echo"</table><a href=\"tedit.php\">Fortfahren</a>";
    143. unset($del);
    144. }
    145. // Zuerst: Dateiname, Zeilennummer (Anfang: 1!),
    146. // Text der ersetzt wird (optional, sonst "")
    147. function delete_line($file, $line, $change_in = "") {
    148. $entries = file($file);
    149. if(empty($change_in)) {
    150. unset($entries[$line-1]);
    151. } else {
    152. $entries[$line-1] = $change_in;
    153. }
    154. $newentries = implode("", $entries);
    155. $datei = fopen($file, "w");
    156. fputs($datei, $newentries);
    157. fclose($datei); }
    158. ?>
    159. </div>
    160. </body>
    161. </html>
    Alles anzeigen
    &#8222;Wenn man zwei Stunden lang mit einem Mädchen zusammensitzt, meint man, es wäre eine Minute. Sitzt man jedoch eine Minute auf einem heißen Ofen, meint man, es wären zwei Stunden. Das ist Relativität.&#8220; - Albert Einstein
  • deine fehlerbeschreibung stimmt nicht ganz
    es können doch auch mehrere einträge gleichzeitig gelöscht werden
    das problem ist, dass du zeilenbedingt löschst

    wenn du also zeilen 2 und 3 löschst, dann löschst du erst zeile2
    daraufhin werden alle zeilen nach 2 um 1 nach oben geschoben
    der 2te eintrag der gelöscht wird ist also der 4te eintrag

    lösen tust du das indem du einfach die komplette datei nochmal schreibst und eintrag 2 und 3 weglässt.
    das geht sowieso viel schneller als für jede zeile ein öffnen/schreiben operation durchzuführen

    du brauchst deine checkboxen übrigens nicht del[1-n] zu nennen... checkbox inhalte werden automatisch in ein array gepackt