Beiträge von Jav

    Im Eingangsbeitrag schreibst Du:

    Zitat

    Nur werden von Anfang an, obwohl nichts in der Txt-Datei ist schon 2 felder ausgegeben. Verstehe es nicht.

    Wenn "nichts" in der Datei steht, ist die Dateigrösse 0, dann können auch keine 2 Felder ausgegeben werden, zumindest nicht wegen des Dateiinhaltes. Daher war es interessant zu wissen, wie du die Datei erzeugt hast. Wenn das Problem aber gelöst ist, ist ja gut.


    Zu den Array-Keys:

    Wenn du einem neu angelegten leeren Array ein Element hinzufügst, ist der Index des ersten Elementes immer 0. Du könntest zB mit count() prüfen, ob überhaupt ein Element vorhanden ist.


    Im ersten Beispielcode ist die Zeile 10 ohne Funktion, da keine Zuweisung zu einer Variablen erfolgt. Die Datei wird dadurch auch nicht geändert. Ansonsten ist in den Beispielcodes nicht erkennbar, warum da Keys überschrieben werden sollten, da ja nur der Dateiinhalt eingelesen und in ein Array aufgesplittet wird.

    1. Etwas Wichtiges fehlt, nämlich wie du die Datei anlegst. Da dürfte der Fehler für die erste (falsche) Ausgabe sein. Mit einem einfachen Erzeugen einer leeren Datei konnte ich das Problem nicht nachstellen bzw. wurde dieses vermieden:

    Code
    $fd=fopen("datei.txt","w+");
    fclose($fd); // leere Datei mit 0 Byte Länge erzeugt


    2. Das letzte "78." ohne folgenden Text wird wohl angelegt, weil explode zuerst den Trenner erkennt, ein Element anlegt und dieses dann befüllen würde, aber nichts mehr zum Befüllen da ist (so meine einfache Erklärung). Dies kannst du leicht umgehen, in dem du den String vor dem foreach mit trim() behandelst.


    3. Wenn ich den hier im Forum geposteten Beispieltext per Copy & Paste verwende, enthält dieser ein zusätzliches "\r\n". Das ist so nicht erkennbar und kann an den verschiedenen Editoren oder Browsern liegen.


    4. Nur als Frage: Warum verwendest du eine Zeilenschaltung als Trennzeichen? Damit ist den Benutzern eine Zeilenschaltung im Eingabetext nicht mehr möglich, denn die würde ja als Trennzeichen interpretiert werden. Hängt natürlich stark vom Einsatz ab, ob das zuzulassen wäre.

    Da ich das mysqli-Modul bei mir deaktiviert habe, kann bzw. werde ich da nichts testen, deshalb behaupte ich mal keck und mit Vorbehalt, dass das erste echo samt folgender öffnender Klammer falsch ist (gibt keine schliessende Klammer dazu). Zudem ist das Paragrafenzeichen vor dem row nach dem while ein Tippfehler und soll wohl ein Dollarzeichen sein. Zusätzlich fehlt noch eine schliessende Klammer für das while. Bei der Ausgabe für das echo fehlt das Dollarzeichen vor row.

    Die Korrekturen für die 4 Fehler eingebaut ergibt sich:

    1. while( $row = mysqli_fetch_assoc( mysqli_query( $conn, $sql ) ) )
    2. {
    3. echo $row[POSITION];
    4. }

    Mit _query wird die Abfrage ausgeführt.

    Mit _fetch werden die Ergebnisse (Datensätze) einzeln aus der Ergebnismenge geholt.

    Durch das while werden solange Ergebnisse ausgegeben, bis die gesamte Ergebnismenge abgefragt wurde.

    Gegenfrage: Funktioniert es bei dir mit der Hash-Variablen? Dann muss es noch einen Trick geben, und ich lerne gern dazu ;)


    Edit:
    Ich sehe gerade, du hast das noch garnicht probiert, sonst hättest du das mit dem immer gleichen Hash nicht geschrieben.

    Aber danke fürs Gespräch.

    $password = "Stef123";

    $pepper = "Pfeffer";

    $passwordHash = password_hash( $password . $pepper, PASSWORD_DEFAULT);

    $b = password_verify($password . $pepper, $passwordHash );

    echo ( $b==TRUE ) ? " passt " : " passt nicht ";


    Wenn man das so sieht, sagt der gesunde Programmiererverstand: "Das passt!".

    Denkste! Passt nämlich nicht!


    Es ist aber noch wirrer: Lässt man sich den erzeugten $passwordHash jedesmal ausgeben, gibt es jedes Mal einen anderen Hash! Da scheint es mit dem Vergleich mit in der DB gespeicherten Hashes schwierig zu werden. Doch es gibt Entwarnung: Das funktioniert tatsächlich!


    Des Rätsels Lösung:

    Für den PasswortHash können keine Variablen eingegeben werden, weil die $-Zeichen im Hash weitere Variablen auflösen wollen, was natürlich zu keinem vernünftigen Ergebnis führen würde. Üble Geschichte!

    Das Verifizieren würde z. B. Funktionieren, wenn der Aufruf lautet:

    password_verify($password.$pfeffer, '$2y$10$awVVwJUcz4hZFBt8czSopeF3dqr2Ju9U5ZsXqriTO2X/6G4WQ1ka');

    Vorausgesetzt, das war auch der zuletzt erzeugte Hash.


    Ist schon tricky, dieses password_hash / password_verify :)

    Hallo,


    da ich in der vergnüglichen Situation bin, mit grösseren Zahlen zu hantieren, sprich: aus verschiedenen Datentypen und Zahlensystemen zu konvertieren, zu verarbeiten und auszugeben, kam es zu einigen Interessanten Effekten. Ganz besonders hatte es mir dieser angetan: Die Dezimalzahl 9223372036854775807 ( 2 ^ 63 - 1 ) umwandeln in eine Hexadezimalzahl. Korrekt wäre das Ergebnis:

    7FFF FFFF FFFF FFFF

    Doch selbst auf einem Online-Umrechner einer Universität kam als Ergebnis 8000 0000 0000 0000 heraus, was ja schon etwas nachlässig ist. Auf verschiedenen anderen, die ich probierte, wurden die letzten 4 Stellen mal eben gerundet auf "6000", was ja auch nicht im Sinne des Erfinders sein kann. Dazu kommt noch, dass so manche garnicht erst über 32-Bit-Zahlen hinauskommen.


    Bevor ich mich nun daran mache, die letzten tausend Seiten durchzuprobieren, frage ich erstmal direkt nach:


    Kennt jemand eine gute Seite, die leicht zu nutzen ist, nicht übermässig Werbung lädt, und auch noch korrekte Ergebnisse liefert?


    Ich würde mich nämlich gerne mit meinen Ergebnissen bei anderen Seiten absichern; die ganze Rechnerei macht ja keinen Sinn, wenn die Ergebnisse letztlich falsch sind ;)


    Grüsse und Danke im Voraus!

    Noch habe ich da keinen Kurs gemacht.

    Hab da grad mal reingesehen: Für einen PHP-Anfänger-Kurs 10 Euro statt 145 bei 144 Lektionen in 16 Stunden - soo viel falsch machen kann man da eigentlich nicht für den Preis. Wäre noch interessant, was das Kleingedruckte so sagt, aber da wühle ich mich so ungern durch.

    Hat du schon was Passendes für dich gefunden?

    Um den Fehler nachzubauen, müsste man wissen, von wo aus du das Uploadscript aufrufst. Ich denke mal, es liegt lediglich am fehlenden Pfad. Also müsste das ungefähr so aussehen:

    $datei_endung = exif_imagetype("pfad/zum/passenden/Ordner/$name");


    Das Suffix ist die Dateinamenserweiterung. Wikipedia sagt ohne den trennenden Punkt. Je nach Vorgehensweise kann man Prüfungen aber auch mit dem Punkt machen, weil die letzten 3 Zeichen von .txttxt eben auch "txt" ergeben (das Suffix ist natürlich txttxt).

    Zum leeren Index kann ich noch nichts sagen, das muss ich mir noch ansehen.


    ABER:

    1. Einige Kleinigkeiten im HTML wären zu korrigieren (body-Tag an falscher Stelle, 500KB-Angabe stat 1,024MB).

    2. $_FILES[][type] soll zwar den mime-Typ angeben, doch PHP.net selbst gibt an:

    Zitat

    $_FILES['userfile']['type']

    The mime type of the file, if the browser provided this information. An example would be "image/gif". This mime type is however not checked on the PHP side and therefore don't take its value for granted.

    Konsequenterweise sollte man [type] also aus dem Gebrauch streichen und die notwendigen Prüfungen anders vornehmen (siehe mein Beitrag dazu hier).


    3. Mit deinem Code prüfst du auch nicht den MIME-Type, sondern das Suffix. Da solltest du dann auch entsprechend passende Variablennamen für nehmen: $mime_type legt nahe, dass es um den MIME-Typ geht und eben nicht nur um das Suffix.


    4. Ich bin ein Fan von Speichern der Bilddateinamen. Die Pfade mit in die DB zu schreiben eher nicht; hier macht m. E. eine einzige Variable, die leicht zu ändern ist, für mich viel mehr Sinn.



    Soweit erstmal beim flüchtigen Drüberhuschen :)


    edit:

    zu 4.: Natürlich nur, wenn es 1 Bilderordner ist. Sind die Bilder in vielen verschiedenen Ordnern, womöglich noch mit Unterordnern, kann das Speichern der Pfade evtl. sinnvoller sein. Aber das will dann auch gepflegt werden. ;)

    um Bilder in die Datenbank einzulesen und auszulesen.

    [ ... ]

    und brauch es für ein Projekt im Studium.


    Die erste Frage, die sich mir stellt: Wozu willst Du die Bilder in die Datenbank einlesen?

    Normalerweise reicht es, die Dateinamen zur Verfügung zu haben und dann das passende Bild aus der Datei zu laden.


    Das Zweite wäre: Es finden keinerlei Prüfungen dessen statt, was hochgeladen wurde. Du speicherst zwar den Mimetyp ab, aber was, wenn da eben nicht z. B. image/png enthalten ist, sondern application/octet-stream ?

    Für solche Prüfungen eigenen sich z. B. mime_content_type und exif_imagetype; für Bildgrössenprüfungen bietet sich getimagesize an, und die Dateigrösse lässt sich leicht mit filesize kontrollieren.


    Als Drittes: Bei dieser Zeile

    $statement=$pdo->prepare("INSERT INTO imagedb VALUES('', '$data', '$mime')");

    muss man als Gefragter annehmen, dass die Tabelle auch mit diesen drei Spalten, in dieser Reihenfolge und mit passenden Typen erstellt ist. Zur Fehlersuche und zum Fehlerausschluss ist es aber hilfreicher, wenn man sieht, was tatsächlich erstellt wurde.

    Das Vierte: Bei dieser Zeile

    $statement->execute();

    kann ein Fehler vorkommen, den du aber nicht abfragst. Also erhälst Du keine Fehlermeldung, wenn es nicht gerade ein kritischer Fehler ist. Bei execute also besser so etwas wie

    if ( $statement->execute() )

    {

    // mach' das Gewünschte

    }

    else

    {

    // Fehlerausgabe

    }

    Bei deinem SELECT dürfte das zwar etwas überdimensioniert sein, aber schadet auch nicht. Und vielleicht vertippt man sich ja auch mal bei einer SELECT-Abfrage, was zu ansonsten unbemerkten Fehlern führen kann.


    Und (erstmal) zum Schluss: Wieviele Header kann man senden, nachdem man eine oder mehrere Ausgaben gesendet hat?

    1. while($row = $statement->fetch(PDO::FETCH_BOTH))
    2. {
    3. header("Content-type: $row->mimetype");
    4. echo $row->image;
    5. }

    Dass das zu keinen Fehlern geführt haben soll, macht mich etwas stutzig. Könnte nur sein, dass das Programm garnicht dort ankam oder die Query keine zur übergebenen ID passenden Bilder gefunden hat. Stelle ich das mit einer foreach-Schleife nach, wird mir zwar auch kein Fehler ausgegeben (was mich ebenfalls stutzig macht), aber auch nur das erste Bild angezeigt. Mache ich das mit den Bilddateinamen, werden alle Bilder ausgegeben (siehe Erste Frage).

    Da bei mir mitunter mehrere Dutzend einzubindende Dateien zu berücksichtigen sind, wäre mir deine Methode doch zu umständlich. Also, die erste Antwort: Ja, es können mehrere Dateien mit einer PHP-Datei inkludiert werden. Zweite Antwort: Ja, es kann ausgewählt werden, welche Datei(en) inkludert werden soll(en).

    Nun zur Antwort auf die Frage nach dem Wie. Hier gibt es sicher viele Ansätze, auf die ich nicht im Einzelnen eingehen will, sondern mal eine Möglichkeit vorstelle. Wichtig ist zum Beispiel, dass die inkludierende Datei anhand von Parametern entscheiden kann, was inkludiert weden soll. Als solche Parameter sind z. B. Namen von POST-Requests auslösenden Buttons geeignet (oder input-Typ Submit, oder ... ).

    Im form-Element wird als action die PHP-Datei angegeben, die entscheiden soll. Diese Datei fragt die Superglobale $_POST ab. Auch dafür sind verschiedene Möglichkeiten vorhanden, vor allem, weil einfache und/oder Array-Variablen abgefragt werden müssen. Sind nur wenige unterschiedliche Werte zu erwarten, kann auch direkt $_POST danach abgefragt werden.

    Als Beispiel: Deine Buttons heissen btnMutieren, btnSpeichern und btnBestaetigen. Die vierte Möglichkeit ist, dass kein Button geklickt wurde, dann ist die Standardausgabe gefragt. Als Code:

    Was spricht dagegen, es mal mit zusätzlichen


    countItem ++;

    $('<div/>').appendTo('#loadcontent').load('content.html #' + countItem).hide().fadeIn(1000);

    countItem ++;

    $('<div/>').appendTo('#loadcontent').load('content.html #' + countItem).hide().fadeIn(1000);


    zu probieren?

    Wenn ich nicht zufällig und unbeabsichtigt den Vorschautext zu deinem Beitrag gesehen hätte, hätte ich das völlig ignoriert wegen deines Nicks, der sowas von an Spam-Bots erinnert. ;)