Ein ARRAY speichern und abrufen


CreativPur

Erfahrenes Mitglied
Hi,
irgendwie stehe ich mal wieder voll auf dem Schlauch

Ich habe folgende Datenbank..
PHP:
$pdo = new PDO('mysql:host=localhost;dbname=dbxxxxx', 'dbxxxxx', 'xxxxx');
Ich lade per bild[".$i."] mehrere Bildbezeichnungen hoch.
In der Datenbank entsteht ein Array.
Bildschirmfoto 2020-02-14 um 11.14.58.png

Die Datenbank ist folgend angelegt..
Bildschirmfoto 2020-02-14 um 11.16.19.png

Ist das Korrekt ??

Der Formular für das Speichern...
PHP:
echo "<div class=\"col-lg-4\"></div>\n";
echo " <hr />";
echo " <form ".
     "action=\"#\" ".
     "method=\"post\">\n";             
echo "  <input type=\"hidden\" name=\"bild[".$i."]\" value=\"".$neuer_name."\" />\n";               
echo "  <input type=\"text\" name=\"auftragsnummer\" value=\"".$user['auftragsnummer']."\" />\n";
echo "  <br />";
Der Quelltext für das Update... (mit einer vorhandenen Auftragsnummer wir $bild bzw. Bildnamen nur noch ergänzt)

PHP:
$auftragsnummer = $_POST['auftragsnummer'];   
$bild = $_POST['bild'];   
$statement = $pdo->prepare("UPDATE auftraege SET bild = :bild_neu WHERE auftragsnummer = :auftragsnummer");
$statement->execute(array('auftragsnummer' => $auftragsnummer, 'bild_neu' => $bild));
Ich hoffe, bisher war alles richtig ?

Jetzt benötige ich nach langem hin und her probieren noch den Select-Code, so dass ich das Array abrufen kann..

Vielen Dank
 

CreativPur

Erfahrenes Mitglied
NACHTRAG..
Nachdem ich die Bilder hochgeladen habe und diese auch im Ordner finde, werde ich auf die Prüfseite weitergeleitet.
Wie Ihr sehr, habe ich dort das 2. Formular für die Speicherung der Bild-Namen angelegt..
Bildschirmfoto 2020-02-14 um 11.36.34.png
 

m.scatello

Mitglied
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.
 

CreativPur

Erfahrenes Mitglied
Ich habe bereits ein
error_reporting(E_ALL);

Vielen Dank für deine tollen Vorschläge !!
Ist nur gut, dass es hier noch vereinzelt Spezialisten gibt, die einem mir GUTEN Rat und Hilfestellungen noch zur Seite stehen !

Schönen Abend noch..
 

m.scatello

Mitglied
Tja, wenn man keine Ahnung hat, dann sollte man besser etwas leiser auftreten! "Richtig debuggen" ist mehr als ein guter Rat, denn damit lernst du, wie man Fehler finden kann. Z.B. wenn du dir $_POST['bild'] mal mit var_dump anzeigen gelassen hättest, hättest du selber erfahren, dass das ein Array ist. Und weiterhin würdest du sehen, wie du richtig an die Werte kommst. Aber bloß keine Eigeninitiative zeigen und in einem Forum rummotzen, wenn man keine fertige Lösung bekommt. :( kopfschüttel :(
 

CreativPur

Erfahrenes Mitglied
Das hat nichts mit "AHNUNG" zu tun, sondern mit Menschlichkeit, was für DICH "Großkonzern" ein FREMDWORT zu scheinen mag.
Gerade in diesem Forum als Grünschnabel eingetreten, und schon fett einen raus hängen lassen !!
Da kann man nur mit den Kopf schütteln.

Lass Deine Aggressivität lieber in deinen 4 Wänden aus, aber nicht bei denen, die ernsthaft Rat suchen
 

m.scatello

Mitglied
Du kapierst es einfach nicht, dass "Richtig debuggen" das A und O ist, oder? Und wenn einer hier auf blöd gemacht hast, dann bist du das ja wohl. Und wo bin ich aggressiv geworden?

Und was heißt Grünschnabel? Wo hast du denn hier mal geholfen?
 

ComFreek

Mod | @comfreek
Moderator
Ich interveniere mal, bevor die Anschuldigungen noch persönlicher und beleidigender werden. Bitte bleibt sachlich, auch bei mitunter berechtigter Kritik, die dahinter steckt.

Vielen Dank für deine tollen Vorschläge !!
Dann setze sie doch mal um :)

"Richtig debuggen" ist mehr als ein guter Rat, denn damit lernst du, wie man Fehler finden kann.
Das kann ich so 1 zu 1 unterschreiben.

@CreativPur, ich kann grundsätzlich verstehen, wenn Leute einmalig wenig Initiative zeigen und konkrete (Komplett-)Hilfestellungen erwarten, etwa bei einem Thema, dass sie nur beiläufig zu erledigen wünschen. Aber es scheint mir, dass die Websiteerstellung keine einmalige Sache bei dir ist und du regelmäßiger Kompletthilfestellungen erwartest. Dann solltest du in deinem eigenen Interesse lernen, wie man effizient debugged.
 
Zuletzt bearbeitet:

CreativPur

Erfahrenes Mitglied
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..
 

ComFreek

Mod | @comfreek
Moderator
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.
 

CreativPur

Erfahrenes Mitglied
Im Moment funktioniert gar nichts mehr.
Ich habe mein ganzes Script, wo ich jetzt seit 3 Tagen am verzweifeln bin, verschossen..
 

ComFreek

Mod | @comfreek
Moderator
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.)
 

m.scatello

Mitglied

ComFreek

Mod | @comfreek
Moderator
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.
 

CreativPur

Erfahrenes Mitglied
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
 

CreativPur

Erfahrenes Mitglied
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:

m.scatello

Mitglied
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.
 

CreativPur

Erfahrenes Mitglied
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