Variable plötzlich nicht mehr vorhanden

  • Hab jetzt schon 1-2 Stunden probiert... Bin wohl einfach mal wieder zu blind/blöd dafür :D
    Hoffe ihr könnt mir weiterhelfen.

    Also ich binde in meine index.php die folgendes ein:

    PHP
    <?php
    include('includes/config.inc.php');
    include('includes/functions.inc.php');
    ?>

    In der selben index.php rufe ich eine PHP-Funktion auf die in der functions.inc.php steht:

    Aufruf:

    PHP
    <?php
    if (check_login()) {
        echo "Eingeloggt";
    }
    ?>

    Funktion:

    So das Problem was ich jetzt habe ist folgendes. Ihr seht in der Funktion die Variable $resource, dort steht die Datenbank Resource ID drin. Ich kann diese Variable in der index.php oder functions.inc.php ganz oben ausgeben, es steht auch das drin was drin stehen soll. Doch hier in dem Fall bekomm ich ständig folgenden Fehler:

    Code
    [B]Notice[/B]:  Undefined variable: resource in [B]/www/htdocs/.../includes/functions.inc.php[/B] on line [B]36[/B]
    
    
    [B]Warning[/B]:  mysql_query(): supplied argument is not a valid MySQL-Link resource in [B]/www/htdocs/.../includes/functions.inc.php[/B] on line [B]36[/B]
    
    
    [B]Warning[/B]:  mysql_num_rows(): supplied argument is not a valid MySQL result resource in [B]/www/htdocs/.../includes/functions.inc.php[/B] on line [B]37[/B]

    Hat jemand eine Idee was ich hier falsch mache? Danke :)

    Lg Santos

    Don't follow me, I run into walls.

  • functionen haben einen eigenen Namensraum, das heisst es sind nur die Variablen bekannt, welche auch in der Funktion deklariert wurden.
    Verfügbar sind natürlich die Globals($_GET, $_POST etc.). Du müsstest also die $resource variable als global deklarieren:

    PHP
    function tuWas() {
    global $resource, $var2, $var3;
    //mach was tolles
    }


    DAvon würde ich dir allerdings schwer abraten. Die Gründe kannst du dir ergooglen, sind ne Menge ;)
    Besser wäre es, du übergibst die $resourtce an die Funktion als Argument.


  • Arbeitest du mit mehreren verschiedenen DB-Verbindungen parallel? Sonst kannst du $resource auch einfach weglassen.

    Edit: Da du dort mit $_COOKIE arbeitest und diese Werte vom Client kommen solltest du dringend mysql_real_escape_string verwenden.
    Und was mir noch auffällt, du führst den Query der in $last_hit_sql steht nie aus.

    Edit2: Achja, und Datum/Zeit sollte nich als Unix-Timestamp in der DB gespeichert werden. SQL stellt genügend passende Feldtypen dafür zu Verfügung, die eine Menge Vorteile bieten und keine Nachteile (von denen ich wüßte).

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

    3 Mal editiert, zuletzt von SinnlosS (12. Oktober 2010 um 14:34)

  • @Sinnlos: Nein ich arbeite bei diesem Projekt nur mit einer Datenbankverbindung. Für was genau ist dieses mysql_real_escape_string? Das mit dem nichtausgeführten Query ist mir auch aufgefallen :D Da hab ich wohl vergessen das zu tippen was ich mir gedacht hatte :D
    Ich sehe darin keinen Vorteil für mich das Datum und die Zeit nicht als Unix-Timestamp zu speichern. Aber danke für deine Vorschläge :)

    Don't follow me, I run into walls.

  • Für was genau ist dieses mysql_real_escape_string?


    Ich könnte dir ja jetzt die Doku empfehlen, aber du als pfiffiges Kerlchen kommst bestimmt selber auf die Idee, dort mal nachzusehen, oder?

  • Für was genau ist dieses mysql_real_escape_string?


    Wie bandit schon sagt -> Doku

    Aber um mal ein kleines Beispiel zu bringen:
    Nimm mal an ein, ein Besucher manipuliert seinen Cookie, so dass sein Benutzername auf auf einmal so aussieht: '; DROP DATABASE;
    Wenn du das in deinen Query einsetzt sieht der so aus: SELECT passwort_hash,last_hit FROM ht_user WHERE username = ''; DROP DATABASE;
    Könnte unerwünschte Auswirkungen haben. ;)
    mysql_real_escape_string sorgt dafür, dass entsprechende Zeichen ausreichend maskiert werden um sie gefahrlos in SQL-Statements benutzen zu können.
    D.h. JEDER Wert der vom Client kommt (also alles aus POST, GET, COOKIE) soll IMMER mit mysql_real_escape_string entschärft werden, bevor der Wert in einem SQL-Statement verwendet wird.

    Noch besser ist allerdings direkt mysqli oder pdo mit prepared Statements zu verwenden. Da wird das automatisch gemacht und du brauchst dich nicht mehr selber drum kümmern.

    Ich sehe darin keinen Vorteil für mich das Datum und die Zeit nicht als Unix-Timestamp zu speichern. Aber danke für deine Vorschläge :)



    Der einzige Fall in dem es keinen Unterschied macht ist der, wenn du in deinen PHP-Skripten auch ausschließlich den Unix-Timestamp verwendest und nicht mehr in andere Datumsformate umwandelst. Aber selbst dann könntest du, wenn du z.b. datetime als Feldtyp verwendest, in deinem SELECT-Statement einfach schreiben SELECT UNIX_TIMESTAMP(`mein_datetime_feld`) ... und bekommst das gleiche Ergebnis.
    Die SQL-Eigenen Feldtypen für Datum und Zeit zu verwenden hat zwei große Vorteile:
    1. Die Lesbarkeit in der Datenbank. Wenn du in phpmyadmin direkt mal was nachschauen willst, mußt du einen UNIX-Timestamp erstmal umständlich umrechnen um ein lesbares Datum zu erhalten (es sei denn du bist irgendein überkrasses Rechengenie und machst das auf einen Blick).
    2. Du kannst mit den Datumswerten direkt in deinem SQL-Statement schon wunderbar rechnen, alles ins passende Format bringen etc. Und das ist einiges schneller als die Berechnungen und Umformungen von PHP vornehmen zu lassen.
    Ein Beispiel mal aus einem aktuellen Projekt von mir, bei dem ich gerne mal sehen würde wie das jemand in einer Abfrage ohne weiteren Programmcode umsetzt, wenn er seine Daten als Unix-Timestamp speichert:


    Es geht um die Ermittlung von Terminen an einem bestimmten Tag.
    Diese stehen in der Tabelle `schedule__resource_content`.
    Es gibt einmalige Termine (isRegular=0), tägliche Termine (isRegular=1), wöchentliche Termine (isRegular=2) und monatliche Termine (isRegular=3).
    Mit dieser einen Abfrage hole ich mir für einen bestimmten Tag alle Termine ohne weitere Abfragen zu starten oder in PHP noch selektieren zu müssen.
    Wie gesagt, das würde ich gerne mal sehen bei Speicherung des Datums als Unix-Timestamp (ich schließe nicht aus, dass es möglich ist, allerdings wüßte ich grad nicht wie und es wäre vermutlich etwas komplizierter und schlechter lesbar).


    Wenn du nur Hobby-mäßig kleinere Webseiten ohne komplexere Funktionalitäten entwickelst, und auch keine weitergehenden Ambitionen hast was das Programmieren angeht, dann verwende ruhig weiter den Unix-Timestamp, die Performance-Unterschiede werden sich bei simplen Seiten mit durchschnittlichen Besucherzahlen nicht bemerkbar machen.
    Falls du aber auf lange Sicht vorhast professioneller zu programmieren kann ich dir wirklich aus eigener Erfahrung raten so früh wie möglich solche Konventionen zu nutzen, denn sie machen durchaus Sinn. Und je mehr du dich an einen anderen Weg gewöhnst, desto schwerer wird es später sich das wieder abzugewöhnen.

    Ich weiß, das ist ein Thema auf dem ich gerne rumreite, aber es wird halt so oft "falsch" gemacht. Und mir konnte bisher noch niemand einen klaren Vorteil bei der Verwendung des Unix-Timestamps gegenüber den Datums-Feldtypen von SQL nennen.

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  • Okay also wenn ich das richtig verstanden hab müsste ich das dann, jetzt mal ganz einfach dargestellt, so machen oder?

    PHP
    $username = mysql_real_escape_string($_POST['username']);
    $query = "SELECT last_hit FROM ht_user WHERE username = '{$username}'";
    mysql_query($query);

    Don't follow me, I run into walls.

  • Jap, genau so.
    Und das mit allen in SQL-Statements verwendeten Daten die vom Client kommen.

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  • Alles klar, danke für den Tipp :) Das werd ich mit Sicherheit noch einbauen.

    Da ich jetzt keinen neuen Thread eröffnen will und es auch eher nur eine nicht ganz so wichtige Frage ist, stell ich sie einfach mal hier...
    Vielleicht habt ihr ja eine Idee. Ich bin dabei eine Highscoreliste zu bauen. Geördnet wird dort nach "Geld". Wer das meiste Geld hat ist auf Platz 1. Natürlich will ich den Rang des Users auch auf seinem Profil anzeigen. Dort mach ich das zur Zeit so:

    PHP
    $rang_sql = "SELECT COUNT(*) AS anzahl FROM ht_user WHERE geld > '{$user['geld']}' AND gesperrt = '0'";
    $rang_result = mysql_query($rang_sql,$resource);
    $rang = mysql_fetch_array($rang_result);
    $rang = $rang['anzahl'] + 1;


    In $user['geld'] steht das Geld des Users auf dessen Profil man sich derzeit befindet.
    Jetzt kommen wir zu meinem Problem dabei. Das hab ich schon ewig aber langsam nervt es mich :D Wenn mehrere Leute den selben Betrag an Geld haben, dann bekommen sie den selben Rang. Das ganze ist dann in etwas so:

    Spieler 1 ; 200€ ; Rang 1
    Spieler 2 ; 150€ ; Rang 2
    Spieler 3 ; 150€ ; Rang 2
    Spieler 4 ; 150€ ; Rang 2
    Spieler 5 ; 100€ ; Rang 5

    Vielleicht habt ihr ja eine Idee wie man das besser umsetzen könnte. Meine Lösung ist mit Sicherheit die schlechteste ^^

    Don't follow me, I run into walls.

  • Naja, wenn der Geldbetrag das einzige Kriterium ist, nach dem der Rang bestimmt wird, dann ist das so ja schon richtig. Dann haben Personen mit dem gleichen Geldbetrag auch den gleichen Rang. Wenn du ein weiteres Kriterium für den Rang hinzufügst kannst du das natürlich ändern, aber ein weiteres Kriterium brauchst du.
    Eine Möglichkeit wäre zum Beispiel der Zeitpunkt seit wann derjenige diesen Geldbetrag hat als weiteres Sortier-Kriterium. Wenn also zwei Spieler 150,- EUR haben hat der Spieler den besseren Rang, der schon länger 150,- EUR besitzt.
    Dafür müsstest du deine Tabelle `ht_user` um eine Spalte erweitern in der du bei jeder Änderung des Geldbetrags die aktuelle Zeit speicherst (z.B. `geld_lastModified`).
    Die Abfrage könnte dann so aussehen:

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  • Das hört sich doch gut an! Ich hätte da eine Idee für ein zweites Kriterium...
    Die Tabelle ht_user hat ein Feld "registriert" dort wird die Zeit gespeichert wann sich der User registriert hat.
    Wenn nun 2 User 150€ haben, sollte derjenige, der sich später registriert hat eigentlich den besseren Rang haben oder? Schließlich hat er den selben Betrag in kürzerer Zeit bekommen. Könnte ich das in dem Sinne genauso machen wie das was du als Beispiel genannt hast?

    Don't follow me, I run into walls.

  • Klar, das kannst du auch machen, dann nimmst du in meiner Beispiel-Abfrage einfach 'registriert' stattn 'geld_lastModified' und änderst das <-Zeichen in einer >-Zeichen.

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  • Vielen dank! Das ganze sieht jetzt so aus und scheint so zu funktionieren, wie es soll :D
    Das ist doch schon viel besser als ich es vorher die ganze Zeit hatte...

    PHP
    $rang_sql = "SELECT COUNT(*) AS anzahl FROM ht_user WHERE (geld > '{$user['geld']}' OR (geld = '{$user['geld']}' AND registriert > '{$user['registriert']}')) AND gesperrt = '0'";
    $rang_result = mysql_query($rang_sql,$resource);
    $rang = mysql_fetch_array($rang_result);
    $rang = $rang['anzahl'] + 1;

    Don't follow me, I run into walls.