Beiträge von cottton

    Kann man auch mit preg_match_all() machen.

    Wenn es um Bilder geht, kannst Du via imagecreatefromstring() prüfen, ob das Format von Deinem System unterstützt wird.

    http://php.net/manual/en/function.imagecreatefromstring.php

    Zitat


    An image resource will be returned on success. FALSE is returned if the image type is unsupported, the data is not in a recognised format, or the image is corrupt and cannot be loaded.

    Ist das Ergebnis false, dann ist es kein Bild (oder unterstütztes Format).


    Geht es um andere Dateien, dann gibt es sicherlich auch ähnliche Möglichkeiten - kommt ja dann aber auf den Typ an.

    Würde das per Typ entscheiden lassen.

    PHP
    // pseudo code
    if isImage(file)
        validateImage(file)
    elseif isPdf(file)
        validatePdf(file)
    elseif ...

    Die Endung|Extension bekommst Du via:

    PHP
    $extension = pathinfo($file, PATHINFO_EXTENSION);

    Gibt auch finfo_file()

    http://php.net/manual/de/function.finfo-file.php


    100% sicher sein kannst Du aber nicht.

    Habe selbst jedenfalls noch keine Möglichkeit gesehen, die alles abdeckt.

    PHP
    Array (    
        [0] => app\models\Timetable Object (
            [_attributes:yii\db\BaseActiveRecord:private] => Array (
                [id] => 12                   
                [field] => 1522069200                    
                [status] => free                   
                [bookingID] => 0                
            )
            [_oldAttributes:yii\db\BaseActiveRecord:private] => Array ()
    )

    Wie gibst Du das denn aus?

    Das ist ein Array mit Objekten.

    Auf dem Offset 0 liegt ein Objekt "yii\db\BaseActiveRecord" mit der Eigenschaft "_attributes".

    "_attributes" ist allerdings private.


    Hier ist die Docu: https://www.yiiframework.com/doc/api/2.0/yi…aseactiverecord

    Evtl kannst Du per getFields() die fields bekommen.

    Oder per fields() --siehe https://www.yiiframework.com/doc/api/2.0/yi…fields()-detail

    Sieht komisch aus.

    Du gibst die Daten vor <!DOCTYPE html> aus (Zeile 34).

    Ungeachtet vom Script:

    Du kannst den kompletten Inhalt der Datei einlesen und Duplikate entfernen.

    Wenn Die Datei aber sehr lang ist, dann könnte das länger dauern - und Du solltest sowieso zu einer Datenbank wechseln.

    Mal angenommen die Datei ist nicht sehr groß:

    PHP
    $file = 'foo/bar/baz.txt';
    $data = file($file); // liest datei in ein array
    $data = array_unique($data); // entfernt duplikate
    file_put_contents($file, $data); // (über-)schreibt die datei

    file(): http://php.net/manual/de/function.file.php

    array_unique(); http://php.net/manual/de/function.array-unique.php

    Evtl wäre das csv Format auch sinnvoll. Einfach mal google: "php csv".

    Dann brauchst Du das Tabs|Leerzeichen -gefummel nicht mehr "\n".$_GET['guid']." //".$_GET['name'] :D

    Und wie mache ich das dann?

    Ich hab's von dieser Seite

    https://www.php-einfach.de/mysql-tutorial/daten-loeschen/

    Von dieser Seite genommen:

    SQL Erklärung:

    SQL
    DELETE FROM `users` 
    WHERE 
        userId = :user_id -- diesen user - klar
        AND strikes >= 3  -- falls er (noch) 3 oder mehr strikes hat
        LIMIT 1           -- auf jeden fall nur einen user löschen (falls an der query mal gearbeitet wird ... siehe meinen vorigen post ...)
    ;

    Notes:

    Ich empfehle die Tabelle `user` zu nennen (Einzahl).

    Würde auch kein camelcase (userId) in SQL verwenden. Alles klein und Leerzeichen als Unterstrich. zB user_id.

    Ist aber nicht wichtig.

    Ohne Fehlermeldung keine Lösung.

    Aber Du stellst 2 Varianten von Code:

    Code
    if($userData["strikes"] == "3") {
    // und
    if($userData["strikes"] === "3")

    === vergleicht Wert und Typ.

    == vergleicht nur den Wert - versucht zB String "3" zu Integer 3 umzuwandeln

    Ich empfehle:

    Code
    if((int)$userData["strikes"] === 3) {
        // (int) zwingt den inhalt von $userData["strikes"] zu einem integer.
    }

    Hinweis:

    Ich empfehle dringend LIMT 1 bei einem DELETE zu nutzen, welches nur eine Zeile löschen soll.

    DELETE FROM users WHERE userId = :userId LIMIT 1;

    So vermeidest Du durch einen "Unfall" alle|mehrere Zeilen zu löschen.

    Hey,

    schau mal hier: Umgehen mit IPv6. Dies hilft dir bestimmt.

    https://de.wikipedia.org/wiki/IP-Adresse unter Aufbau. Dort wird es dir erklärt.

    Grüße,

    Stef

    Wer mal IP-Adressen speichern muss|will: dem MySQL-Server die Arbeit überlassen:

    Der MySQL-Server wird schneller sein als PHP.

    Außerdem wollen wir in PHP immer mit IP-Strings arbeiten.

    Der MySQL-Server (Storage) soll sich um das Speichern|Format kümmern.

    Tabelle erstellen:

    SQL
    CREATE TABLE `my_table_name` (
        -- ...
        `ip` varbinary(16) NOT NULL COMMENT 'INSERT: `ip` = INET6_ATON(:ip) ; SELECT: INET6_NTOA(`ip`) AS `ip`',
        -- ... 
    );

    Erklärung:

    varbinary(16) stellt genug platz für ipv4 und ipv6.

    Beim INSERT lässt man den MySQL-Server den gegebenen Wert (zB ipv4 String) per INET6_ATON in einen binary String umwandeln.

    INSERT: INET6_ATON

    SQL
    INSERT INTO `my_table_name` SET `ip` = INET6_ATON(:ip);

    Beim SELECT das Ganze ümgekehrt:

    SELECT: INET6_NTOA

    SQL
    SELECT INET6_NTOA(`ip`) AS `ip` FROM `my_table_name`;

    INET6_NTOA und INET6_ATON könenn beides: ipv4 und ipv6. (Es gibt auch INET_ATON |INET_NTOA für nur ipv4. Aber wir wollen ja beides abdecken.)

    Suchen - WHERE Bedingung:

    Wir suchen im Bsp nach einer Row mit einer Bestimmten IP.

    Da die IPs in der Tabelle binary sind, können wir nicht mit `ip` = :ip suchen.

    Wir wandeln die gesuchte (!) IP in binary um, damit binary mit binary verglichen wird.

    Wir sollten NICHT die binary IPs in jeder Row umwandeln lassen.


    @basti1012

    Kann und will Dir irgendwie auch nicht helfen. Kann ja kaum Deine Texte lesen.

    Wollte das nur posten, damit es wenigstens einmal richtig im Thread steht.

    BTW: hör auf ständig angreifbare (SQL-Injection) SQL-queries zu posten!

    Ich kann es nicht mehr sehen. Die Ausrede "is ja nur um den Fehler zu finden" zieht nicht.

    Es geht mir dabei auch nicht um Deinen Code. Es geht um die Benutzer|Besucher hier im Forum, die dann vlt. noch den Gleichen Mist kopieren!

    Warum bin ich so direkt:

    Ich bin als total Anfänger hier ins Forum gekommen und habe inzwischen einen sehr schönen Job als PHP dev.

    Ich bin hier geblieben, weil ich das Forum immer als korrekt angesehen hab.

    Hat mal jemand "Mist" geschrieben, kam sofort ein Anderer und hat das klar gestellt (früher war das Basi und Lauras - beide wohl nicht mehr aktiv :/ ).

    Was Du machst, ist das Forum mit immer den gleichen Fehlern (hier im Bsp SQL-Injection) zu überfluten.

    Das muss aufhören.

    Ja, aber das setzt voraus, dass man versteht, was da binär passiert.

    Ok, man könnte es einfach so nutzen, ohne es zu verstehen. Man muss ja nicht alles wissen. Aber ich bin der Meinung, man muss den Code verstehen, den man nutzt.

    Ist evtl ein Bisschen zu schwer für den Anfang.

    Man könnte auch eine Tabelle anlegen, die Benutzerrechte speichert.

    Tabellen Bsp.:

    Jetzt könnte man die Rechte wie zB "AllowReadBewerbungen" einen Wert zuweisen

    oder eine 3te Tabelle anlegen, um dessen ids zu nutzen.

    Mir gings hier aber nur um die Alternative.

    Gibt noch viel mehr Ansätze. Aber dazu musst Du einfach mal googlen ("php manage user permissions") und Dich für eins entscheiden.

    EDIT: zu @m.scatello Bsp - falls Du Dich dafür entscheidest: https://stackoverflow.com/questions/2925…twise-operators

    Du hängst Dich zu sehr an "follow" auf.

    Was Du bauen musst|willst|solltest, ist ein komplett neues|eigenständige Feature - "friend".

    Folgen kann jeder. Auch wenn einer evtl nicht will, dass jemand ihm folgt.

    Aber Befreundet sein - das muss von beiden Seiten akzeptiert werden (einer lädt ein, der Andere stimmt zu).

    DRAFT:

    Die Tabellen brauchen wohl keine id (auto increment id).

    Denn wenn Du die Request (tbl friend_request) löschst (abgelaufen|verweigert), oder die Freundschaft aufgelöst wird (tbl friend),

    dann würde das Lücken hinterlassen (ids verbrannt).

    INDEX:

    tbl friend_request index auf user_id_from, user_id_to, created_at

    tbl friend index auf user_id_from, user_id_to

    DEFAULT VALUE:

    tbl friend_request und friend column created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP

    (Sorry, bissl unübersichtlich, aber muss schlafen gehen :D)


    EDIT:

    Wenn beide - zB user 1 und 5 - sich gegenseitig eine Freundschaftsanfrage zusenden,

    dann kann es gleich als akzeptiert angesehen werden.

    Bsp:

    2018-05-22 00:00:10 user 1 erstellt friends request auf user 5.

    Suche in tbl friend_request, ob user 1 schon eine request auf diesen user erstellt hat.

    Ja? Dann gleich in tbl friend eintragen.

    Sonst: Eintrag in tbl friend_request.

    (5 min später)

    2018-05-22 00:05:10 user 5 erstellt friends request auf user 1.

    Suche in tbl friend_request, ob user 1 schon eine request auf diesen user erstellt hat.

    Ja? Dann gleich in tbl friend eintragen.

    Sonst: Eintrag in tbl friend_request.

    Hoffe es ist irgendwie verständlich :)