InternInhaltsverzeichnisGlossarBausteineLinklisteTutorialsKommentare

Thema: PHP - Bilder in einer Datenbank-Tabelle speichern und ausgeben Artikel anzeigen

Alex schrieb am Donnerstag, den 21 April 2022 #21
So nun bekomm ich das nächste Problem, ich weis bzw nehme an es nerft aber ich habe halt niemanden mit dem ich mich austauschen kann.
ich habe nun folgendes erstellt um eine Bearbeitenfunktion zu erstellen

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

<?php
$out_change 
'';
require 
'connect.php';
$select $db->query("SELECT * FROM `bilder` ORDER BY id");

$pictures $select->fetchAll();
    foreach (
$pictures as $picture
        {
            
$out_id            $picture["id"];        
            
$out_thumb        $picture["thumb"];

$out_change .='

<div class="form-check">
<input class="form-check-input" type="checkbox" value="" id="flexCheck_'.$out_id.'">
<label class="form-check-label" for="flexCheck_'.$out_id.'>">
<img src="'.$out_thumb .'">
</label>
</div>';


    }
    
echo 
$out_change
?>


Deinen Codeschnipsel "Checkbox (Mehrfachauswahl) und DB-Ausgabe" hab ich gesehen aber ich bekomme das nicht umgesetzt ich krieg einfach die pdo syntax nicht in meinen Kopf kann die nur übernehmen aber nicht umsetzen ist mir zu abstrakt bei meiner verqueren denkweise.
Auch fehlt mir die Logik wie ich nun die Auswahl nutze.
Wenn dich meine Fragen nerven, sag es mir, ist ok. dann hör ich auf aber ansonsten wäre ich sehr dankbar über anschauliche Beispiele.
Werner schrieb am Freitag, den 22 April 2022 #22
Hallo Alex,
zuerst solltest du die SQL-Anweisung: "SELECT * FROM `bilder` ORDER BY id" nicht verwenden, und statt dem * Sternchen aufzählen welche DB-Spalten ausgelesen werden sollen, das hilft nicht nur dir bei einer späteren Änderung, sondern zb. auch mir beim Helfen.

Um einen Datensatz bearbeiten zu können, musst du die ID des Datensatzes an einem Formular übergeben,
zb. per Radiobutton oder als Link zu einem Formular.
Mit dieser ID wird dann der Datensatz aus der DB-Tabelle ausgelesen und in einem Formular zur Bearbeitung dargestellt.

Wie das genau funktioniert, habe zb. unter: » werner-zenk.de/scripte/sqlite_datenbank.php gezeigt.
Das ist zwar jetzt SQLite, aber die Vorgehensweise bleibt die gleiche, schaue es dir an und lerne daraus.

Deine Fragen Nerven nicht, nur solltest du immer genau erklären, worum es eigentlich geht. Das du die PHP-Fehleranzeige immer bei der Entwicklung einschalten musst ist dir aber schon klar?

1
2
error_reporting(E_ALL);
ini_set('display_errors', true);

Immer am Anfang des PHP-Script einfügen, dann sagt dir PHP, ob es irgendwelche Probleme gibt.

Vielleicht hilft dir aber auch Erster Eintrag in eine MySQL-Datenbank mit PHP, dort geht es vornehmlich um die Grundlagen zur Formularverarbeitung und wie man die Datensätze von einem Formular in eine DB-Tabelle bringt.
Alex schrieb am Donnerstag, den 28 April 2022 #23
Also das reporting hilft.
Aber nun komm ich zu einer neuen Frage.
Ich habe eine exif gps abfrage eingebaut.

Bekomme beim upload eines Bildes folgende Fehlermeldung:
Warning: exif_read_data(phpDYr2l9): Process tag(x0000=GPSVersion): Illegal format code 0x0000, suppose BYTE in . .

Was den Fehler auslöst kann ich rekonstruieren und nachvollziehen.
Der gpseintrag im bild ist fehlerhaft. Ok aber wie kann ich sowas abfragen.

Die Werte Frage ich so ab:
1
2
3
4


if(ISSET($exif['GPS']['GPSLatitudeRef']) && ISSET($exif['GPS']['GPSLatitude']) && ISSET($exif['GPS']['GPSLongitudeRef']) && ISSET($exif['GPS']['GPSLongitude'])) 


Die $error Variable die viel genutzt wird ist doch eine selbstdefinierte Variable,
oder ist die schon php technisch impliziert.
Ich weiß mir fehlt viel Wissen.
Werner schrieb am Donnerstag, den 28 April 2022 #24
Hallo Alex,

das hat zunächst einmal nichts mit PHP zu tun.
Von welchen Kameras kommen die Exif-Daten, gibt es da Gemeinsamkeiten und Unterschiede in den Daten.
Da musst du wohl recherchieren und die Exif-Daten analysieren.
Auf dieser Grundlage kannst du dann einen Filter in PHP programmieren, so etwas ist nicht einfach, da wirst du dann auch in Zukunft Anpassungen vornehmen müssen.

Zitat:
Die Werte Frage ich so ab:
if(ISSET($exif['GPS']['GPSLatitudeRef']) && ISSET($exif['GPS']['GPSLatitude']) && ISSET($exif['GPS']['GPSLongitudeRef']) && ISSET($exif['GPS']['GPSLongitude']))

So eine Überprüfung würde ich nie schreiben, der Code hat keine Formatierung, da ist alles in einer Zeile!
Dem PHP-Interpreter ist es egal, wie dein Code aussieht, Hauptsache dieser funktioniert.
Aber, jetzt kommts, Code sollte in erster Linie lesbar und klar verständlich sein. Das ist das oberste Ziel. Programmcode ist nicht für den Computer, sondern für uns Menschen da.

Da gibt es kostenlose Editoren, die dir den PHP-Code automatisch formatieren damit dieser besser lesbar wird.
Mit dem Programm Visual Studio Code von Microsoft ist dies leicht umsetzbar.
Ich hatte zuerst Probleme mich in diesem Editor zurecht zu finden aber mittlerweile finde ich VSC einen der besten Editoren für Webentwickler » werner-zenk.de/tipps/visual-studio-code-tipps.php

Zitat von Alex:
Die $error Variable die viel genutzt wird ist doch eine selbstdefinierte Variable,
oder ist die schon php technisch impliziert.

Das ist eine selbstdefinierte Variable und soll in diesem Beispiel irgendwelche Werte in einer Variablen speichern.
Beachte das diese Variable als Array gesetzt ist $error = [];, somit lassen mehrere Meldungen vom Programm darin ablegen.

Und noch etwas, schreibe deine PHP-Funktionen in Kleinbuchstaben, ISSET() vs. isset() oder so wie diese auf php.net/de/isset definiert sind.
Alex schrieb am Freitag, den 29 April 2022 #25
Hallo ja da ist einiges was ich hier leider etwas unsauber dargestellt habe. das ISSET groß war ist hier Zufall. AUch der zusammengestauchte Text liegt daran dass ich teilweise per smartphone am code rumwerkle . VS Code nutzte ich lange. bin aber auf npp umgestiegen mit ftp schnittstelle schon besser auch komme ich da mit dem suchen /ersetzen usw besser klar auch die funktion mit den zeichen am anfang entfernen uvm. hat mich da überzeugt. vscode, php storm, netbeans etc. bringen mir leider nur weitere Probleme da ich dann ins Einrichten verfalle, was debugger und linter etc betrifft.

Also zurück zur Frage.
Ist es denn nicht grundsätzlich möglich eine Fehlerprüfung zu generieren die auf das Erscheinen einer beliebigen Fehlermeldung zielt.

Schliesslich wird ja bei einem Fehler etwas ausgelöst, sprich wie in diesem Fall wurde im (ich nenne es mal Exif Container der jpg Datei) ein fehlerhafter Wert erkannt und hat dadurch den Fehler gemeldet

Da hier z.Bsp. Exif mit verschiedenen Zuständen arbeitet (FALSE,TRUE,NULL) etc. und wie Du schon angemerkt hast Kameramodellspezifisch usw. abhängig ist. suche ich einfach(schwer) die Lösung: Ist der EXIF Eintrag korrekt zeige an sonst lass es bleiben.
Der von mir beschriebene Fehler geht auf ein paar durch andere Programme veränderte bzw defekte exifeinträge zurück.

Ich will einfach diese Fehler verhindern und eine eigene Warnung ausgeben bzw diese Bilder überspringen jedoch wäre eine komplette Fehlerauswertung wohl etwas zu viel. Es sollen halt nur vorhandene und valide Angaben ausgegeben werden.
Meine Abfrage ist doch eindeutig :
1
2
3
4
5
6
7
8
9

if (
    isset($exif['GPS']['GPSLatitudeRef']) && 
    isset($exif['GPS']['GPSLatitude']) && 
    isset($exif['GPS']['GPSLongitudeRef']) && 
    isset($exif['GPS']['GPSLongitude'])
   )
{dann Zeige an,}

Also Wenn $exif['GPS']['GPSLatitudeRef'] und $exif['GPS']['GPSLatitude'] und ... vorhanden sind.
...
OK habe mein Fehler entdeckt 😕, auch fehlerhafte Einträge sind Einträge also vorhanden.
wie kann ich dann die Fehlerausgabe abfragen die ist ja nicht der Inhalt der Einträge. Ach mann das ist doof. ich versuchs mal mit einer TRUE/FALSE Abfrage.
Na ich werde mal weiter suchen
Alex schrieb am Mittwoch, den 4 Mai 2022 #26
So. Nun hab ich es fast zusammen ich hab es sogar hinbekommen die gps map in meinem offcanvasinfoblock anzeigen zu lassen.
Wenn du magst stelle ich den kompletten Code hier ein. Jedoch hab ich noch einen kleinen Punkt zu ändern was die uploadgrösse betrifft. Ich habe ja deinen Code bzgl der thumbnail Erstellung genutzt. Ich würde diesen nun so einbauen um meine uploads zu schrumpfen. Und thumbnails nicht extra zu speichern wie bisher
Werner schrieb am Donnerstag, den 5 Mai 2022 #27
Hallo Alex,
Zitat:
Ich würde diesen nun so einbauen, um meine uploads zu schrumpfen. Und thumbnails nicht extra zu speichern wie bisher

Dann verwende einfach die Thumbnail-Funktion zum Schrumpfen. Die Thumbnail-Größe evtl. anpassen und folgenden PHP-Code entfernen:

1
2
3
4
5
6
7
      // Bild-Datei auf den Server hochladen
      if (move_uploaded_file($_FILES["file"]["tmp_name"], $directory . $newname)) {
        $output = '<p>Die Bild-Datei: &bdquo;' . $newname . '&rdquo; wurde hochgeladen.</p>';
      }
    } else {
      $output = '<p>Bitte nur Bilddateien hochladen!</p>';
    }
Alex schrieb am Donnerstag, den 16 Juni 2022 #28
Sonun bin ich schon weiter, um hier nicht allzuviel wieder reinzupasten der code ist immer länger hab ich nun eine Frage.
Kannst du mir helfen wie ich eine formulareingabe ohne reload ausführe.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

<?php
// wurde der Favoritbutton geklickt (Check submit Form und hidden Input)
if(isset($_POST["setfav_btn"]) && ($_POST["fav_bild_id"])) 
{
    
$favid $_POST["fav_bild_id"];
    
$query_favcheck "SELECT `favorite` from `gal_bilder` WHERE `id` = '".$favid."'";
    
$result_favcheck mysqli_query($connect$query_favcheck);
            while (
$row_favcheck mysqli_fetch_array($result_favcheck))
            {
                
$favcheck $row_favcheck["favorite"];
            
    if (
$favcheck <= 0)
        {
            
$set_fav=1;
            
$ausgabe_favcheck='das Bild mit der ID:'.$favid.' wurde als Favorit markiert';
        }
    else
        {
            
$set_fav=0;
            
$ausgabe_favcheck='das Bild mit der ID:'.$favid.' wurde als Favorit demarkiert';
        }
}
$update "UPDATE `gal_bilder` SET `favorite` = $set_fav WHERE `gal_bilder`.`id` = '".$favid."'";

$make_update mysqli_query($connect$update);
echo 
$ausgabe_favcheck;
}
?>
<form name="set_fav_form" id"set_fav_form_id" action="" method="post">
<input type="hidden" name="fav_bild_id" id="id_fav_bild_id" value="'. $bild_id.'">                   
<button class="fav_btn" type="submit" role="submit" id="setfav_btn" value="1" name="setfav_btn"></button>
</form>


das funktioniert aber weil das bild ja durch ein js script angezeigt wird (Highslide JS) wird da natürlich alles resettet. Ich bin mir zwar nicht sicher ob das funktioniert aber vielleicht hab ich ja glück
Werner schrieb am Freitag, den 17 Juni 2022 #29
Hallo Alex,
du kannst die Formulardaten über AJAX versenden: » werner-zenk.de/scripte/formular_ueber_ajax_erstellen_und_versenden.php

In deinem Script hast du eine riesige Sicherheitslücke, Formulardaten dürfen nicht ungefiltert in die Datenbank gelangen.
Bei mysqli() müssen diese mit mysqli_real_escape_string() behandelt werden:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php
// wurde der Favoritbutton geklickt (Check submit Form und hidden Input)
if(isset($_POST["setfav_btn"]) && ($_POST["fav_bild_id"])) 
{
    
$favid $_POST["fav_bild_id"];
    
$query_favcheck "SELECT `favorite` from `gal_bilder` WHERE `id` = '" mysqli_real_escape_string($connect$favid) . "'";
    
$result_favcheck mysqli_query($connect$query_favcheck);
            while (
$row_favcheck mysqli_fetch_array($result_favcheck))
            {
                
$favcheck $row_favcheck["favorite"];
            
    if (
$favcheck <= 0)
        {
            
$set_fav=1;
            
$ausgabe_favcheck='das Bild mit der ID:' $favid ' wurde als Favorit markiert';
        }
    else
        {
            
$set_fav=0;
            
$ausgabe_favcheck='das Bild mit der ID:' $favid ' wurde als Favorit demarkiert';
        }
}
$update "UPDATE `gal_bilder` SET `favorite` = " $set_fav " WHERE `gal_bilder`.`id` = '" mysqli_real_escape_string($connect$favid) . "'";

$make_update mysqli_query($connect$update);
echo 
$ausgabe_favcheck;
}
?>
<form name="set_fav_form" id"set_fav_form_id" action="" method="post">
<input type="hidden" name="fav_bild_id" id="id_fav_bild_id" value="'. $bild_id.'">                   
<button class="fav_btn" type="submit" role="submit" id="setfav_btn" value="1" name="setfav_btn"></button>
</form>
Alex schrieb am Freitag, den 17 Juni 2022 #30
Ja ich weis dass, das kommt noch nach. ich schrieb ja schon dass ih ein massives problem habe alles umzusetzen. ich versuchte es ja mir deinem Beispiel aber das funktionierte nicht sofort also bin ich erst mal zum für mich funktionierendem zurückgegangen um erst einmal ein Grundgerüst zu haben. ok ich teste mal deinen Vorschlag. würde mir htmlspechialchars abhelfen wegen der sicherheit?