Jochbart: Anzeigen der echo's funktioniert nicht php

Hallo alle zusammen,

ich bin gerade dabei ein Formular mit einer MySQL Datenbank zu verbinden um auch dort Bilder zu speichern. Leider habe ich das Problem, dass es mir meine Fehler nicht ausgibt sondern lediglich es nicht macht. Vielleicht kann ja mir jemand das Problem erklären.

Danke und Gruß,

Jochbart

<?php
require 'inc/db.php';
if (isset($_POST['aktion']) and $_POST['aktion']=='speichern') {
    $uberschrift = "";
    if (isset($_POST['uberschrift'])) {
        $uberschrift = trim($_POST['uberschrift']);
    }
    $beschreibung = "";
    if (isset($_POST['beschreibung'])) {
        $beschreibung = trim($_POST['beschreibung']);
    }
   // $bild_ = "";
   // if (isset($_POST['bild_'])) {
    //    $bild_ = trim($_POST['bild_']);
   // }
    $bild_ = "";
    if (isset($_FILES['bild_']['name'])) {
        $bild_ = trim($_FILES['bild_']['name']);
        $ziel = "hochgeladenes/";
        $zieldatei = $ziel . basename($_FILES["bild_"]["name"]);
        $error = 0;
        
        $imagesize = getimagesize($_FILES["bild_"]["tmp_name"]);
        if(imagesize === false) {
            $error = 1;            
        }
        else {
            $imagesize["nime"];            
        }
        
        $endung = pathinfo($zieldatei, PATHINFO_EXTENSION);
        if($endung != "jpg" && $endung != "jpeg" && $endung != "png" && $endung != "bmp" && $endung != "gif") {


//Alle $error = 1 werden nicht angezeigt


            $error =1;
            echo "<p>Dateityp nicht erlaubt</p>";
        }
        
        if(file_exists($zieldatei)) {
            $error = 1;
            echo "<p>Datei bereits vorhanden</p>";
            
        }
        if($_FILES["bild_"]["size"] > 20*1024*1024) {
            $error = 1;
            
        }
        
        if($error !=1) {
            if(move_uploaded_file($_FILES["bild_"]["tmp_name"], $zieldatei)){
            
            echo "Datei erfolgreich hochgeladen";            
        }
        else {
            echo "Fehler";
            
        }
            
        }
        
        
    }
    
    
   // $type = $FILES['bild_']['type'];
   // $data = file_get_contents($FILES['bild_']['tmp_name']);
    //$stmt = $dbh->prepare("insert into formular values('',?,?,?)");
   // $stmt->bindParam(1,$name);
   // $stmt->bindParam(2,$type);
   // $stmt->bindParam(3,$data);
   // $stmt->execute();
    //if (isset($_FILES []['bild_'])) {
    //    $bild_ = trim($_POST['bild_']);
   // }
    
	 $video_ = "";
    if (isset($_POST['video_'])) {
        $video_ = trim($_POST['video_']);
    }
	 $pdf_ = "";
    if (isset($_POST['pdf_'])) {
        $pdf_ = trim($_POST['pdf_']);
    }
	 $schluss = "";
    if (isset($_POST['schluss'])) {
        $schluss = trim($_POST['schluss']);
    }
    $erstellt = date("Y-m-d H:i:s");
    if ( $uberschrift != '' or $beschreibung != '' or $bild_ != '' or $video_ != '' or $pdf_ != '' or $schluss != '')
    {
        // speichern
        $einfuegen = $db->prepare("
                INSERT INTO formular (uberschrift, beschreibung, bild_, video_, pdf_, schluss, erstellt) 
                VALUES (?, ?, ?, ?, ?, ?, NOW())
                ");
				echo "klappt";
        $einfuegen->bind_param('ssssss', $uberschrift, $beschreibung, $bild_, $video_, $pdf_, $schluss);
        if ($einfuegen->execute()) {
            header('Location: index.php?aktion=feedbackgespeichert');
            die();
            echo "<h1>gespeichert</h1>";
        }
    }   
}
if (isset($_GET['aktion']) and $_GET['aktion']=='feedbackgespeichert') {
    echo '<p class="feedbackerfolg">Datensatz wurde gespeichert</p>';
	echo '<p><a href="index.html">Weitere Daten eingeben</a></p>';

}
$daten = array();
if ($erg = $db->query("SELECT * FROM formular")) {
    if ($erg->num_rows) {
        while($datensatz = $erg->fetch_object()) {
            $daten[] = $datensatz;
        }
        $erg->free();
    }   
}
if (!count($daten)) {
    echo "<p>Es liegen keine Daten vor :(</p>";
} else {
?>
    <table>
        <thead>
            <tr>
                <th>ID</th>
                <th>Uberschrift</th>
                <th>Beschreibung</th>
                <th>Bild</th>
				<th>Video</th>
				<th>PDF</th>
				<th>Schluss</th>
                <th>erstellt</th>
            </tr>
        </thead>
        <tbody>
            <?php
            foreach ($daten as $inhalt) {
            ?>
                <tr>
                    <td><?php echo $inhalt->id; ?></td>
                    <td><?php echo bereinigen($inhalt->uberschrift); ?></td>
                    <td><?php echo bereinigen($inhalt->beschreibung); ?></td>
                    <td><?php echo bereinigen($inhalt->bild_); ?></td>
					<td><?php echo bereinigen($inhalt->video_); ?></td>
					<td><?php echo bereinigen($inhalt->pdf_); ?></td>
					<td><?php echo bereinigen($inhalt->schluss); ?></td>
                    <td><?php echo $inhalt->erstellt; ?></td>
                </tr>
            <?php
            }
            ?>
        </tbody>
    </table>
<?php   
}
function bereinigen($inhalt='') {
    $inhalt = trim($inhalt);
    $inhalt = htmlentities($inhalt, ENT_QUOTES, "UTF-8");
    return($inhalt);
}
?>
  1. Tach!

    Leider habe ich das Problem, dass es mir meine Fehler nicht ausgibt sondern lediglich es nicht macht.

    Welches "es" soll denn Fehler ausgeben?

    Vielleicht kann ja mir jemand das Problem erklären.

    An welcher Stelle des Codes stimmen denn Wunsch und Wirklichkeit nicht mehr überein? Kontrollausgaben (mit var_dump() am besten) helfen beim Finden von Abweichungen.

    dedlfix.

    1. Hallo dedlfix,

      mit "es" meine ich mein PHP-Programm, entschuldige. :)

      Ab dem Kommentar "//alle $error = 1 werden nicht angezeigt" dort werden viel mehr die echo's nicht ausgegeben.

      Danke!

      Gruß

      Jochbart

      1. Tach!

        Ab dem Kommentar "//alle $error = 1 werden nicht angezeigt"

        Ist denn in denn in den Variablen, die du verwendest das drin, was drin sein soll? Das musst du überprüfen, das kann ich nicht für dich tun.

        dedlfix.

  2. Hi,

    				echo "klappt";
            $einfuegen->bind_param('ssssss', $uberschrift, $beschreibung, $bild_, $video_, $pdf_, $schluss);
            if ($einfuegen->execute()) {
                header('Location: index.php?aktion=feedbackgespeichert');
    

    Dieser Teil kann gar nicht funktionieren.

    Erst wird eine Ausgabe gemacht, anschließend wird versucht, einen Header zu schicken.

              die();
              echo "<h1>gespeichert</h1>";
    

    Erst sagst Du dem Script: Geh sterben! Dann soll das tote Script noch was ausgeben. Wird wohl auch nicht klappen …

    Ansonsten: der Code ist mir zu unübersichtlich. Die Einrückung scheint zufällig zu sein usw.

    cu,
    Andreas a/k/a MudGuard

  3. Hallo Jochbart,

    zusätzlich zu den bisher gegebenen Tipps solltest du vor dem ersten require ein

    error_reporting(E_ALL);
    

    einfügen, um sicher zu sein, dass keine Fehler unterdrückt werden. Damit bekommst Du ggf. mehr Warnungen als Dir lieb sind, aber Fehler solltest Du so auf jeden Fall bekommen.

    Die Redirektion über den location-Header funktioniert dann zwar nicht mehr (weil Header nur gesetzt werden können solange noch nichts ausgegeben wurde), aber immerhin müsstest Du dann Fehlerausgaben zu Gesicht bekommen.

    Bis Du sicher bist, dass die SQLs tun was sie sollen, solltest Du den location-Header eh auskommentieren. Ein Redirect löscht das Browserfenster, weil eine neue Seite abgerufen wird. SOLLTE also nach dem Setzen des location-Headers noch eine Ausgabe gemacht werden, siehst Du sie nicht (oder höchstens im Netzwerk-Trace der Browser-Entwicklerwerkzeuge).

    Rolf

    --
    sumpsi - posui - clusi
    1. Tach!

      zusätzlich zu den bisher gegebenen Tipps solltest du vor dem ersten require ein

      error_reporting(E_ALL);
      

      einfügen, um sicher zu sein, dass keine Fehler unterdrückt werden.

      Dazu muss auch noch display_errors eingeschaltet sein, das ist in Produktivumgebungen aus gutem Grund meist ausgeschaltet.

      Die Redirektion über den location-Header funktioniert dann zwar nicht mehr (weil Header nur gesetzt werden können solange noch nichts ausgegeben wurde), aber immerhin müsstest Du dann Fehlerausgaben zu Gesicht bekommen.

      Im Fehlerfall ist es meist egal, dass dann noch weitere Dinge, wie die Weiterleitung, nicht mehr arbeiten, oder dass das Display zerschossen ist. Wenn der Fehler erfolgreich beseitigt ist, ist ja wieder alles in Ordnung.

      dedlfix.

      1. Die Redirektion über den location-Header funktioniert dann zwar nicht mehr (weil Header nur gesetzt werden können solange noch nichts ausgegeben wurde), aber immerhin müsstest Du dann Fehlerausgaben zu Gesicht bekommen.

        Im Fehlerfall ist es meist egal, dass dann noch weitere Dinge, wie die Weiterleitung, nicht mehr arbeiten, oder dass das Display zerschossen ist. Wenn der Fehler erfolgreich beseitigt ist, ist ja wieder alles in Ordnung.

        So war es mal, aber bei vielen Installationen dürfte das nicht mehr zutreffen!

        Wenn das Puffern des Outputs eingeschaltet und der Puffer groß genug ist findet die Weiterleitung trotzdem statt, weil PHP Header und Payload im Puffer brav sortiert.

        Aktuell findet sich nach der Installation halbwegs moderner Versionen in /etc/php/7.0/apache2/php.ini wie vermutlich folgt oder ähnlich:

        output_buffering = 4096
        

        ist also On.

        Minimalistisches Testskript:

        <html>
        <h1>Weiterleitung</h1>
        </html>
        <?php header("Location: https://google.de"); php?>
        

        Es gab Zeiten, da hat das nicht funktioniert und einen Fehler geworfen. Blick ins Logfile:

        127.0.0.1 - - [09/Dec/2017:10:57:18 +0100] "GET /test/weiterleitung.php HTTP/1.1" 302 273 "http://localhost/test/" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:57.0) Gecko/20100101 Firefox/57.0"
        

        HTTP 302: Der nachträgliche Einbau der Header geht also sehr wohl! Mindestens bis zum Umzug auf einen fremden Server. Dann sollte man wissen, dass die Ausgabepufferung auch abgeschaltet sein kann. Und natürlich, dass man deshalb nicht damit rechnet, also sowas wie den im Beipiel eingebauten Unsinn durch robuste Programmierung vermeidet.

        1. Da ich ja manchen als ziemlicher performance-besessener bekannt bin:

          output_buffering und op_cache lohnen sich. Der nicht unerhebliche Geschwindigkeitszuwachs in aktuellen PHP-Versionen beruht vor allem auch auf deren Nutzung. Das Zeug gibt es aber schon länger und bietet interessante Optionen für eigene Ideen.