Array dynamisch mit $POST befüllen

m.scatello

Erfahrenes Mitglied
Wenn ich das auf deinen Quellcode in #21 beziehe, dann steht in Zeile 19
PHP:
unset($list[$i]);
und erst in Zeile 29 steht
PHP:
$i = 0;
 

coldstone28

Mitglied
Ich glaube ich verstehe was du meinst.
Die Zuweisung
PHP:
$i = 0;
muss vor dem
PHP:
unset($list[$i]);
passieren, weil Top-Down abgearbeitet wird.
Korrigiere mich bitte wenn ich es falsch verstanden habe.
Wenn ich das aber mache, kann ich zwar einzelne Elemente löschen, wenn MEHRERE Elemente (Zeilen) vorhanden sind.
Wenn ich aber nur EINE Zeile habe, dann löscht er das nicht.
Wenn ich dass so lasse wie gehabt, dann funktioniert es. Ist das reiner Zufall?

Ok, ich korrigiere mich.
Mal funktioniert es, mal nicht. :(
Wenn ich die json Datei lösche und alle Elemente von vorne hinzufüge kann ich diese auch einzeln löschen. Wenn ich aber schon Daten in meiner Json Datei habe und es dann starte um weitere Elemente hinzuzufügen, kann ich die letzte Zeile nicht löschen.
 
Zuletzt bearbeitet:

Sempervivum

Erfahrenes Mitglied
In Posting #22 steht, wo das $i definiert werden muss. Du willst ja den Eintrag im Array mit dem Index des GET-Parameters löschen.
Wenn ich das aber mache, kann ich zwar einzelne Elemente löschen, wenn MEHRERE Elemente (Zeilen) vorhanden sind.
Da verstehe ich nicht, wie Du das meinst.
 

coldstone28

Mitglied
Hier mal der ganze Code:
PHP:
<?php

//schreiben
$fh = fopen("telefonliste.json", "a");
$txt = file_get_contents("telefonliste.json");

if($txt == "" or $txt == null) {
    $list = array();
} else {
    $list = json_decode($txt, true);
}

if(isset($_POST['Name'])) {
    $list[] = array('Name' => $_POST['Name'],
                        'Telefonnummer' => $_POST['Telefonnummer']);
}
$txt = json_encode($list);
file_put_contents("telefonliste.json", $txt);

 if(isset($_GET["delete"])) {
$i = $_GET["delete"];     
unset($list[$i]);
 }
$txt = json_encode($list, true);
file_put_contents("telefonliste.json", $txt);
?>


<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>Telefonliste</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" type="text/css" media="screen" href="./css/main.css" />
</head>
<body>
  <header>
    <h2>Telefonliste</h2>
  </header>
  <main>
    <ul id="todolist">
<?php

//lesen
$txt = file_get_contents('telefonliste.json');
$list = json_decode($txt, true);
$i=0;       
foreach ($list as $entry) {
  
    echo         
        '<li>
        <a href="index.php?action=mark&id= "class="markiert" title="Kunde ist markiert"></a>
        <span>' . $entry['Name'] . '</span>
        <span>' . $entry['Telefonnummer'] . '</span>

        <a href="index.php?delete=' .  $i . '" class="delete" title="löschen">löschen</a>
      </li>';
$i++;}
?>
    </ul>
    <div class="spacer"></div>
    <form id="add-todo" action='index.php' method='post'>

      <input type='text' placeholder='Name' name='Name'>
      <input type='text' placeholder='Telefonnummer' name='Telefonnummer'>
      <input type='submit' value='hinzufügen'>
    </form>
  </main>
</body>
</html>
 

m.scatello

Erfahrenes Mitglied
Versuche es mal so:
PHP:
<?php
  $txt = file_get_contents("telefonliste.json");

  if($txt == "" or $txt == null)
      $list = array();
  else
    $list = json_decode($txt, true);

  if(isset($_POST['Name']))
  {
     $list[] = array('Name' => $_POST['Name'],
                     'Telefonnummer' => $_POST['Telefonnummer']);
                    
     $txt = json_encode($list);
    
     file_put_contents("telefonliste.json", $txt);
  }
  else if(isset($_GET["delete"]))
  {
    if (isset($list[$_GET["delete"]]))
       unset($list[$_GET["delete"]]);
      
     if (count($list))
        $txt = json_encode($list, true);
     else
        $txt = "";
    
     file_put_contents("telefonliste.json", $txt);
  }
?>
 

coldstone28

Mitglied
Funktioniert leider auch nicht.
Wenn ich die json Datei lösche und alles neu einlese Funktioniert es.
Beim zweiten Anlauf wird der letzter Eintrag nicht gelöscht.
Es kommt auch keine Fehlermeldung. Er löscht es halt nur nicht.
 

m.scatello

Erfahrenes Mitglied
Dann hilft wohl nur

Richtig debuggen

  1. Man bemerkt, dass ein Skript nicht das tut, was es soll.
  2. Man schreibt an den Anfang des Scriptes die Zeile: error_reporting(-1);
  3. Man verwendet ini_set('display_errors', true); damit die Fehler auch angezeigt werden.
  4. Man versucht, die Stelle die daran Schuld sein kann, schonmal einzugrenzen. Falls dies nicht geht, wird zunächst das komplette Skript als fehlerhaft angesehen.
  5. An markanten Stellen im Skript lässt man sich wichtige Variableninhalte ausgeben und ggf. auch in bedingten Anweisungen eine kurze Ausgabe machen, um zu überprüfen, welche Bedingung ausgeführt wurde. Wichtig bei MySQL Fehlern (...not a valid MySQL result resource...): mysqli_error() verwenden oder Abfrage ausgeben und zb mit phpmyadmin testen.
  6. Schritt 5 wird so lange wiederholt, bis Unstimmigkeiten im Skript auffallen
  7. Damit hat man das Problem (Unstimmigkeit) gefunden und kann versuchen diese zu beheben. Hierzu dienen dann die PHP-Dokumentation und andere Quellen als Ratgeber.
  8. Lässt sich das konkrete Problem trotzdem nicht beheben, kann man in Foren um Rat fragen.
  9. Das Programm läuft und man kann die Debug-Ausgaben wieder entfernen.
 

m.scatello

Erfahrenes Mitglied
Das Problem ist unset, da der Index im Array nicht neu generiert wird, das hilft:
Code:
if (isset($list[$_GET["delete"]]))
{
   unset ($list[$_GET["delete"]]);
      
   $list = array_values($list);
}
 

coldstone28

Mitglied
Vielen dank erstmals. Bis jetzt klappt es soweit.
Nun wollte ich daß mit der Markierung einzelner Einträge machen.
Habe meinen Array um ein weiteres key erweitert

PHP:
if(isset($_POST['Name'])) {
    $list[] = array('Markierung' => 'nicht_markiert',
                    'Name' => $_POST['Name'],
                        'Telefonnumer' => $_POST['Telefonnummer']);
}

Habe jetzt 2 anker in meiner Schleife.
habe jetzt die 2 anker einfach so stehen lassen um erstmal das ändern der markierung in der json datei zu machen
PHP:
$txt = file_get_contents('telefonliste.json');
$list = json_decode($txt, true);
$i=0;    
foreach ($list as $entry) {
    echo      
        '<li>
        <a href="index.php?action=mark&id=nicht_markiert"class="markiert" title="markieren"></a>
        <a href="index.php?action=mark&id=markiert"class="nicht markiert" title="markieren"></a>

        <span>' . $entry['Name'] . '</span>
        <span>' . $entry['Telefonnummer'] . '</span>

        <a href="index.php?delete=' .  $i . '" class="delete" title="löschen">löschen</a>
      </li>';
$i++;}

Mit einer if Bedingung wollte ich, je nachdem welches GET übergeben wird, den Eintrag Markierung in meinem Array ändern.



PHP:
if(isset($_GET['action'])) {
    if($_GET['id'] == 'markiert') {
    $list['Markierung'] = 'markiert';
} else {
    $list['Markierung'] = 'nicht_markiert';
}
}


Ich glaube ich mache bei der neuen Zuweisung ins array was falsch, weis aber nicht was.
Er übergibt in die json datei nur markiert oder nicht_markiert.
Wie kann ich gezielt das auf den jeweiligen namen ändern?
 
Zuletzt bearbeitet: