Ein ARRAY speichern und abrufen

Das weiß ich schon, dass Debuggen das A und O ist.
Ich bin nur absolut eine Niete im Programmieren da ich nur Webdesigner bin und kein Web-Programmierer.
Ich habe hier schon viel gelernt, aber dennoch ist PHP immer wieder eine Qual für mich, obwohl ich eigentlich lernwillig bin.
Ich kenne auch den Eifelturm, aber ich könnte ihn niemals nachbauen..

Ihr macht das Tag für Tag und vergesst, dass Ihr auch mal angefangen habt..

Wie soll ich debuggen, wenn ich mir selbst da bei diesem Script schon schwer tue und dann mit dem Fehler-Code wieder der Verzweiflung nahe bin, da ich diesen nicht verstehe..
 
Wie soll ich debuggen, wenn ich mir selbst da bei diesem Script schon schwer tue und dann mit dem Fehler-Code wieder der Verzweiflung nahe bin, da ich diesen nicht verstehe..
So wie ein Säugling laufen lernt: Schritt für Schritt. Klar wirst du am Anfang immer wieder Rückschläge haben. Aber wenn du es nie anfängst, dann lernst du es auch nie.

Übrigens habe ich habe ich seit Jahren keinen Kontakt mehr zu PHP und aktuell mache ich auch gar nichts mit Webprogrammierung. Die Herangehensweise beim Debuggen ist bei vielen Programmiersprachen aber oft ähnlich.

In der Datenbank entsteht ein Array.
Bildschirmfoto 2020-02-14 um 11.14.58.png
Dann frage dich mal, warum da "Array" als String drinsteht. Das kann doch nur von der Zeile stammen, die das INSERT (oder UPDATE) macht.
 
Im Moment funktioniert gar nichts mehr.
Ich habe mein ganzes Script, wo ich jetzt seit 3 Tagen am verzweifeln bin, verschossen..
 
Benutzt du kein Versionskontrollsystem, wo du einfach auf den ursprünglichen Zustand zurückrollen kannst? Würde ich dir echt empfehlen :)
(Die poor man's solution ist den Projektordner einfach zu kopieren.)
 
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.
Übrigens finde ich ja echtes Breakpoint-Debugging viel effizienter als Print-Debugging. Vor allem kannst du komplexe Datenstrukturen direkt inspizieren, ohne dir Gedanken darüber machen zu müssen, wie sie strinigified aus einem print-Aufruf herauskommen.

Aber Breakpoint-Debugging setzt natürlich noch ein bisschen mehr Versiertheit voraus.
 
PHP:
<?php
session_start();
require_once("../inc/config.inc.php");
require_once("../inc/functions.inc.php");
require_once("../inc/system.inc.php");
require_once("../inc/header2.inc.php");

if(isset($_POST['speichern'])){
     $error = false;
     $userid = $_POST['userid'];
     $sicherheitscode = $_POST['sicherheitscode'];
     $auftragsnummer = $_POST['auftragsnummer'];
     $auftragsart = $_POST['auftragsart'];
     $auftragsvergabe = $_POST['auftragsvergabe'];
     $kurzbeschreibung = $_POST['kurzbeschreibung'];
     $beschreibung = $_POST['beschreibung'];
     $vorname = $_POST['vorname'];
     $nachname = $_POST['nachname'];

$statement = $pdo->prepare("INSERT INTO auftraege (userid, sicherheitscode, auftragsnummer, auftragsart, auftragsvergabe, kurzbeschreibung, beschreibung, vorname, nachname)
    VALUES (:userid, :sicherheitscode, :auftragsnummer, :auftragsart, :auftragsvergabe, :kurzbeschreibung, :beschreibung, :vorname, :nachname) ");
    $result = $statement->execute(array('userid' => $userid, 'sicherheitscode' => $sicherheitscode, 'auftragsnummer' => $auftragsnummer, 'auftragsart' => $auftragsart, 'auftragsvergabe' => $auftragsvergabe, 'kurzbeschreibung' => $kurzbeschreibung, 'beschreibung' => $beschreibung, 'vorname' => $vorname, 'nachname' => $nachname));
    }

if(isset($_GET['bild_speichern'])) {
             $error = false;
             $bild = $_POST['bild'][$i];
             $auftragsnummer = $_POST['auftragsnummer'][$i];
             for ($i = 0; $i < count($_POST['auftragsnummer']); $i++) {
                  $bild = $_POST['bild'][$i];
                  $statement = $pdo->prepare("UPDATE auftraege SET bild = :bild WHERE auftragsnummer = :auftragsnummer)");
                  $statement->execute(array('bild' => $bild, 'auftragsnummer' => $auftragsnummer ));
              }
            }

$userid = $_SESSION['userid'];

$sql = "SELECT * FROM auftraege WHERE userid = $userid ORDER BY id DESC LIMIT 0,1";
$user = $pdo->query($sql)->fetch();



    // Funktionen definieren
    // -----------------------------------------------
    function checkUpload($myFILE, $file_extensions, $mime_types, $maxsize)
    {
        $errors = array();
        // Uploadfehler prüfen
        switch ($myFILE['error']){
            case 1: $errors[] = "<span class='red'>Bitte wählen Sie eine Datei aus, die <b>kleiner als ".ini_get('upload_max_filesize')."</b> ist.</span>";
                    break;
            case 2: $errors[] = "<span class='red'>Bitte wählen Sie eine Datei aus, die <b>kleiner als ".$maxsize/(2048*2048)." MB</b> ist.</span>";
                    break;
            case 3: $errors[] = "<span class='red'>Die Datei wurde nur teilweise hochgeladen.</span>";
                    break;
            case 4: $errors[] = "<span class='red'>Es wurde keine Datei ausgewählt.</span>";
                    return $errors;
                    break;
            default : break;
        }
        // MIME-Type prüfen
        if(count($mime_types)!=0 AND !in_array(strtolower($myFILE['type']), $mime_types)){
            $fehler = "Falscher MIME-Type (".$myFILE['type'].").<br />".
                      "Erlaubte Typen sind:<br />\n";
            foreach($mime_types as $type)
                $fehler .= " - ".$type."\n<br />";
            $errors[] = $fehler;
        }
        // Dateiendung prüfen
        if($myFILE['name']=='' OR (count($file_extensions)!=0 AND !in_array(strtolower(getExtension($myFILE['name'])), $file_extensions))){
            $fehler = "Falsche Dateiendung (".getExtension($myFILE['name']).").<br />".
                      "Erlaubte Endungen sind:<br />\n";
            foreach($file_extensions as $extension)
                $fehler .= " - ".$extension."\n<br />";
            $errors[] = $fehler;
        }
        // Dateigröße prüfen
        if($myFILE['size'] > $maxsize){
            $errors[] = "Datei zu groß (".sprintf('%.2f',$myFILE['size']/(2048*2048))." MB).<br />".
                        "Erlaubte Größe: ".$maxsize/(2048*2048)." MB\n";
        }
        return $errors;
    }

    // gibt die Dateiendung einer Datei zurück
    function getExtension ($filename)
    {
        if(strrpos($filename, '.'))
             return substr($filename, strrpos($filename, '.')+1);
        return false;
    }

    // erzeugt einen Zufallswert
    function getRandomValue()
    {
        return substr(md5(rand(1, 9999)),0,8).substr(time(),-6);
    }

    // erzeugt einen neuen Dateinamen aus Zufallswert und
    // Dateiendung
    function renameFile ($filename)
    {
        return  getRandomValue().".".getExtension($filename);
    }

    // Werte zur Dateiprüfung initialisieren
    // -----------------------------------------------
    $maxsize = 5*2048*2048;
    $file_extensions = array('jpg', 'jpeg', 'jpe', 'gif', 'png', 'pdf');
    $mime_types = array('image/pjpeg', 'image/jpeg', 'image/gif', 'image/png', 'application/pdf', 'image/x-png');

    // Upload-Ordner definieren
    // -----------------------------------------------
    $ordner = "benutzer_dateien/";
    
    $anzahl_dateifelder = 5;
?>

<!DOCTYPE html>
<html>
    <head>
      <title>Möbel-Jaeger Login</title>
      <link rel="stylesheet" href="../css/style.css">
    </head>
    <body>
        <div class="container abstand_footer" style="margin-top:-50px;">
            <div class="col-lg-6">           
                <h1>Bilder hochladen</h1>
                
            </div>
            <div class="col-lg-6">
                <label for="exampleInputAuftragsgeber">Auftragsgeber</label>
                <br />
                <span class="auftragsgeber"><?php echo $user['vorname']." ".$user['nachname'] ?></span>
            </div>
            <div class="col-lg-12">
                <hr />
                <?php
                    // Falls der Benutzer auf "Upload" gedrückt hat,
    // werden die Dateien überprüft
    if(isset($_POST['submit']) AND $_POST['submit']=='Upload'){

        // jede Datei einzeln testen
        for($i=0; $i<$anzahl_dateifelder; $i++){
            $myFILE['name'] = $_FILES['Datei']['name'][$i];
            $myFILE['type'] = $_FILES['Datei']['type'][$i];
            $myFILE['tmp_name'] = $_FILES['Datei']['tmp_name'][$i];
            $myFILE['error'] = $_FILES['Datei']['error'][$i];
            $myFILE['size'] = $_FILES['Datei']['size'][$i];

            // Fehlerarray erzeugen
            $errors = array();

            $errors = checkUpload($myFILE, $file_extensions, $mime_types, $maxsize);
            if(count($errors)){
                echo "<p>\n".
                     "Die ".($i+1).". Datei (".$myFILE['name'].") konnte nicht gespeichert werden.<br />\n";
                foreach($errors as $error)
                    echo $error."<br />\n";
                echo "</p>\n";
            }
            else {
                do {
                    $neuer_name = renameFile($myFILE['name']);
                } while(file_exists($ordner.$neuer_name));
                if(@move_uploaded_file($myFILE['tmp_name'], $ordner.$neuer_name)){
                     echo "<p>\n".
                    
                          "<span class='green'>Die ".($i+1).". Datei (".$myFILE['name'].") wurde erfolgreich gespeichert.</span><br />\n".
                          "</p>\n";
                          
                         echo "  <div class=\"col-lg-4\"></div>\n";
                         echo " <hr />";
                         echo " <form ".
                              "action=\"#?bild_speichern\" ".
                              "method=\"post\">\n";
                         echo "  <input type=\"text\" name=\"bild[]\" value=\"".$neuer_name."\" />\n";
                         echo "  <input type=\"text\" name=\"auftragsnummer[]\" value=\"".$user['auftragsnummer']."\" />\n";
                }
                else{
                     echo "<p>\n".
                          "Die Die ".($i+1).". Datei (".$myFILE['name'].") konnte nicht gespeichert werden.<br />\n".
                          "Es ist ein Upload-Fehler aufgetreten.<br />\n".
                          "Bitte versuchen Sie es später erneut.<br />\n".
                          "<br />\n".
                          "Sollte der Upload noch immer nicht funktionieren, informieren Sie uns bitte per Email.<br />\n".
                          "<a href=\"".$_SERVER['PHP_SELF']."\">Zurück zum Upload-Formular</a>\n".
                          "</p>\n";
                }
            }
            }
            echo "  <hr />";
            echo "  <input type=\"submit\" name=\"bild_speichern\" class=\"btn btn-success\" value=\"Bilder speichern\" />\n";
            echo " </form>\n";
            echo "<p>\n".
                 "<a href=\"".$_SERVER['PHP_SELF']."\">Zurück zum Upload-Formular</a>\n".
                 "</p>\n";
        }
    // Beim ersten Aufruf des Skriptes wird das
    // Upload-Formular angezeigt
    else{
        echo "<h3>Erlaubte Dateiendungen sind:</h3>\n";
        foreach($file_extensions as $extension)
            echo " &nbsp;&nbsp;&nbsp;<span class='red'> .".$extension."</span>";
        echo "<h3>Erlaubte Dateigröße:</h3>\n";
        echo " <span class='red'> maximal ".($maxsize/(1024*1024))." MB\n</span><hr />";
        echo " <form ".
             "action=\"".$_SERVER['PHP_SELF']."\" ".
             "method=\"post\" ".
             "enctype=\"multipart/form-data\">\n";
        echo "  <input type=\"hidden\" name=\"MAX_FILE_SIZE\" value=\"".$maxsize."\" />\n";
        for($i=0; $i<$anzahl_dateifelder; $i++){
            echo "  <label for=\"Datei\">".($i+1).". Datei auswählen</label>\n";
            echo "  <input type=\"file\" name=\"Datei[".$i."]\" id=\"Datei[".$i."]\" />\n";
            echo "  <br />\n";
        }
        echo "  <input type=\"submit\" name=\"submit\" class=\"btn btn-info\" value=\"Upload\" />\n";
        echo " </form>\n";
    }
                ?>
                </div>
        </div>
    <?php
        require_once("../inc/footer.inc.php");
    ?>   
    </body>
</html>


Es geht hierbei nur um das Formular
Zeile 174 - 194
$neuer_name und $user['auftragsdummer'] werden auch korrekt angezeigt und die Bilder werden auch in den Ordner geladen.
Aber das Speichern von $neuer_name will nicht in der Datenbank funktionieren
 
Ich hoffe, mich verständlich Ausgedrückt zu haben..
Ich schildere mal die gesamte Seite..

Ich habe ein Logensystem, wo jeder User eine eigene Userid bekommt.. logisch
Nach dem einloggen kommt er auf das erste Formular, wo nur Texte eingegeben werden.
Durch das Speichern entsteht so die Datenbankspalte mit all den Inhalten, außer dem "bild".. Das funktioniert auch..

Außerdem wird man beim Speichern auf die Download-Seite weitergeleitet.
Dort kann man mehrere, in diesem Fall fünf Bilder gleichzeitig hochladen.

Klickt man dann nach der Auswahl der Bilder auf Download, zeigt das Download-Script die Daten der Bilder und sendet die Bilder in einen Ordner.. Auch das funktioniert einwandfrei...

Jetzt zu meinem Problem:
Ein weiteres Formular soll nun die fünf Benennungen wie z.B. 123456.jpg der Bilder zu einem ARRAY der vorhandenen Datenzeile hinzu uploaden.
In den Inputfeldern werden als Value auch die richtigen Daten angezeigt..
PHP:
echo "  <input type=\"text\" name=\"bild[]\" value=\"".$neuer_name."\" />\n";
echo "  <input type=\"text\" name=\"auftragsnummer[]\" value=\"".$user['auftragsnummer']."\" />\n";
Und das genau funktioniert nicht!
Obwohl ich meine, alles richtig gemacht zu haben..

PHP:
if(isset($_POST['bild_speichern'])) { 
$error = false;
     $bild = $_POST['bild'][$i];
     $auftragsnummer = $_POST['auftragsnummer'][$i];
for ($i = 0; $i < count($_POST['bild']); $i++) {
     $bild = $_POST['bild'][$i];   
  
$statement = $pdo->prepare("UPDATE auftraege SET auftragsnummer = :auftragsnummer, bild = :bild  WHERE auftragsnummer = $auftragsnummer");
$statement->execute(array('auftragsnummer' => $auftragsnummer, 'bild' => $bild));
}
}
PHP:
echo " <form ".
"action=\"#?bild_speichern\" ".
"method=\"post\">\n";
echo "  <input type=\"text\" name=\"bild[]\" value=\"".$neuer_name."\" />\n";
echo "  <input type=\"text\" name=\"auftragsnummer[]\" value=\"".$user['auftragsnummer']."\" />\n";
echo "  <input type=\"submit\" name=\"bild_speichern\" class=\"btn btn-success\" value=\"Bilder speichern\" />\n";
echo " </form>\n";
 
Zuletzt bearbeitet:
Siehe Kommentare im Quellcode:
PHP:
if(isset($_POST['bild_speichern']))
{
   $error = false;
 
   $bild = $_POST['bild'][$i];  // Wo kommt hier $i her????
   $auftragsnummer = $_POST['auftragsnummer'][$i]; // Wo kommt hier $i her????
 
   for ($i = 0; $i < count($_POST['bild']); $i++)
   {
       $bild = $_POST['bild'][$i];  

       // Hier überschreibst du immer wieder den Eintrag von bild in der Datenbank!
       $statement = $pdo->prepare("UPDATE auftraege SET auftragsnummer = :auftragsnummer, bild = :bild  WHERE auftragsnummer = $auftragsnummer");
     
       $statement->execute(array('auftragsnummer' => $auftragsnummer, 'bild' => $bild));
   }
}

Nicht übel nehmen, aber von wem ist der komplette Quellcode? Wenn du solche Dinge nicht selber erkennst, muss man vermuten, dass du den gesamten Quellcode nicht selber geschrieben hast.
 
Den Quelltest habe ich auch nicht geschrieben, nur ein wenig geändert.
Ich dachte, wenn man ein Form wie dieses...
PHP:
echo "  <div class=\"col-lg-4\"></div>\n";
echo " <hr />";
echo " <form ".
     "action=\"#?bild_speichern\" ".
     "method=\"post\">\n";
echo "  <input type=\"text\" name=\"bild[]\" value=\"".$neuer_name."\" />\n";
echo "  <input type=\"submit\" name=\"bild_speichern\" class=\"btn btn-success\" value=\"Bilder speichern\" />\n";
echo " </form>\n";
mit eckiger Klammer, muss mann beim UPDATE immer [$i] schreiben..

Ich wähle z.B. 3 Bilder aus und mein Form bekommt diese Infos..
Bildschirmfoto 2020-02-15 um 13.22.30.pngBildschirmfoto 2020-02-15 um 13.22.47.png
das erste Inputfeld beinhaltet den Bildnamen, der automatisch mit Zahlen generiert wird, das zweite ist der Auftragsnummer, die durch das erste Form schon mitgegeben wurde und bereits schon in der Datenbank abgespeichert ist.
die Inputfelder werden natürlich später als Typ hidden umgeschrieben.

Das Formular zum Speichern findest Du im Ggesamten Script oben Zeile 174 - 194
 
Zurück