Klassen und globale Variablen / sql error reporting [lösung]

  • Wieso bekomme ich nen Fehler? :0

    PHP
    $SYS['hallo']['geht'] = "funktioniert";
    class test{
        function systeminfos(){
            print_r($SYS);
        }
    }
    $ausführen = new test;
    $ausführen->systeminfos();
    // gibt aus >> Notice: Undefined variable: SYS in /var/www/datei.php on line 203


    Btw, wie bekomme ich es hin, das das Array auch in den Funktionen verfügbar ist.

  • PHP
    $SYS['hallo']['geht'] = "funktioniert";
    class test{
        function systeminfos(){
            global $SYS;
            print_r($SYS);
        }
    }
    $ausführen = new test;
    $ausführen->systeminfos();


    durch global wird es verfuegbar. hab aber vergessen, ob es auch aenderungen nach draussen uebernimmt :)
    musste mal testen


    edit:
    oder so (wie ich es nutze)


    durch das erste & in den parametern wird SYS als referenz von aussen "aufgenommen".
    bei der zuweisung in $this->SYS =& wird wieder eine referenz zum eingehenden aufgebaut, wodurch es auf den ggleichen inhalt wie aussen zeig.
    heisst:
    wenn du drin was aenderst, ist es draussen auch geaendert.
    und ungekehrt.

  • Ähhm, mein Verständniss ist gebremst :D
    aber danke :)


    Parse error: syntax error, unexpected '__construct' (T_STRING), expecting function (T_FUNCTION)

  • Hmm, ich glaub, ich habs verstanden:
    die Datei: eine Straße
    Variable: ein Haus
    Referenz: die Hausnummer


    wolf: Was du versuchst ist quasi, die Leute zwischen den verschiedenen Häusern in der Straße umziehen zu lassen. cottton tauscht einfach die Hausnummern aus :D
    Keine garantie...

  • sorry, wollte das eigtl noch nachschieben, habs dann aber vergessen =)


    beim erstellen eines Objekts von Test (also bei $x = new Test()) wird __construct ausgeführt.
    Daher $obj = new Test($SYS)
    Mit der Variante - der Referenz - kannst Du innen den Wert ändern und außen.
    Löschen auch. Einfach mal ausprobieren.

  • Ich bekomme nur iwi was ich drinnen veränder nicht mehr Raus .. Zeile 200 & 211 sind interessant


    außerdem bekomme ich bei dem hier

    PHP: 187
    // IP geblockt?
                    $sql['ipblock'] = $dbconnect->query("SELECT * FROM `blockedip` WHERE `ip` = '".$_SESSION['user']['ip']."';");
                    $sql['ipblock']['rows'] = $sql['ipblock']->rowCount();
                    if ($sql['ipblock']['rows'] >= "1" || $_SESSION['user']['blocked']) {


    Fatal error: Cannot use object of type PDOStatement as array in /var/www/USER/usermanagement.php on line 189
    Kann man das lösen?

  • Muss ja beides (aussen und innen) anzeigen, denn Du verkettest ja Drinnen:

    PHP
    $this->SYS['conf']['db']['message'] /*die msg ist*/ = 
        $this->SYS['conf']['db']['message'] /*die msg*/   .   /*und*/"  || ".$e->getMessage();


    :D


    hier mal n test ohne der Verkettung. Dafür als array:


    zum 2. Fehler:

    PHP
    $sql['ipblock']['rows']


    Daran liegts.
    $dbconnect ist sicherlich ein Objekt von PDO.
    Daher:

    PHP
    $sql['ipblock'] = $dbconnect->query("SELECT * FROM `blockedip` WHERE `ip` = '".$_SESSION['user']['ip']."';");
    // PDO::query — Executes an SQL statement, returning a result set as a PDOStatement object


    Also $sql['ipblock'] ist jetzt ein obkect. Du kannst also keine Array-Ebene reinquetschen =)
    Besser ne temp-var:

    PHP
    $query = $dbconnect->query("SELECT * FROM `blockedip` WHERE `ip` = '".$_SESSION['user']['ip']."';");
  • hmm fürs sql wollt ich das so cool umgehen :D
    aber dein array ebenen kommentar hats gebracht :)

    PHP: 187
    // IP geblockt?
                    $sql['ipblock']['sql'] = $dbconnect->query("SELECT * FROM `blockedip` WHERE `ip` = '".$_SESSION['user']['ip']."';");
                    $sql['ipblock']['rows'] = $sql['ipblock']['sql']->rowCount();
                    if ($sql['ipblock']['rows'] >= "1" || $_SESSION['user']['blocked']) {
  • Das geht auch =)
    BTW: Du nutzt die PDO, dann aber keine Daten direkt in die Query!

    PHP
    // auch wenn es die SESSION ist - beim nächsten mal vergisst du iwas und nutzt POST ect in der query.
    $_SESSION['user']['ip'] = "' AND `ip` = 'nicht vorhanden; --'";
    $dbconnect->query("SELECT * FROM `blockedip` WHERE `ip` = '".$_SESSION['user']['ip']."';");


    Nutze besser ->prepare und ->execute
    http://www.php.net/manual/de/pdo.query.php

  • Bei mir auch mit deinem Beispiel oO


    hier dann nichtmehr :/
    aber was mich viel mehr interresiert.. wieso bekomme ich
    Fatal error: Call to undefined function sqlInfo() in .. on line 243

  • Geht doch =)


    Den Fehler "Fatal error: Call to undefined function sqlInfo() in .. on line 243" bekomme ich nicht. Sehe auch nirgends eine function sqlinfo() genutzt oO?
    Aber hier stimmt was nicht:


    btw: Du musst noch einen evtl Fehler bei ->execute abfangen:

  • wie löst man das mit dem Array in der Mail am besten?


    Mein vermeintliches 'nicht außen ankommen' lag am Zeitpunkt, des Aufrufen des Arrays :pinch::evil:


    jaja das mit den Rows :D --hab ich nachträglich aus Faulheit kurz so gelöst :D ist schon geändert worden ;)

  • implode wuerd ich sagen.

    PHP
    '<br>'.implode('<br>', $SYS['conf']['db']['message']).'<br>'


    oh, jetzt haste editiert ... mom ... lesen :D


    Warum global auf einmal?
    Wenn die function in der gleichen Klasse ist, dann kannste doch $this->SYS nutzen oO?


    Zu dem message array:
    wenn Du dort e-msgs sammelst, dann immer so, dass Du eine "Variante" erwarten kannst.
    Also nicht einmal ein String, oder manchmal ein Array. Dann besser immer ein Array.
    Auch wenn Du im code weißt, dass es nur eine msg wird.
    Dann besser [] = array($single_msg)
    Denn dann kannst Du immer erwarten, dass es ein Array ist.


    und dann halt wie oben schon gesagt: implode()


    und warum schickst Du alle vars in das SYS-Array ? Sogar i ?

  • hmm.. :D
    und wie bekomm ich das hier in ein Array...

    PHP
    $this->SYS['conf']['db']['message'][] = $SQL['ipblock']['stmt']->errorInfo();
    $this->SYS['conf']['db']['message'][]['line'] = __LINE__;



    global, weil es nicht in der Klasse ist...
    kannst du mir das mit dem msg Array mal als Code schreiben? meine Hirndenkfähigkeit ist grad down :D
    wieso ich die alle ins sys Array schicke..? gute frage.
    ok, ich weiß grad nicht ob implode rekursiv auf Arrays wirkt..?

  • implode rec. - nein.
    Würde aber an der stelle, wo du ->errorInfo() ausliest, den String zusammenstellen.
    Am besten (da immer wieder mal gebraucht wird) in einer eigenen func/methode.


    Zu errorInfo():
    http://www.php.net/manual/en/pdo.errorinfo.php

    Zitat


    Element Information
    0 SQLSTATE error code (a five characters alphanumeric identifier defined in the ANSI SQL standard).
    1 Driver-specific error code.
    2 Driver-specific error message.


    was Du brauchst ist [0] und [2] mMn.
    Ich glaube [1] ist/war oft leer. Kann mich aber irren.


    Ich hatte letztens schon mal geposted, was ich nutze:

    PHP
    $err_str = '(SQLSTATE: '.$err_info[0].') '.( 
            (empty($err_info[2])) # wenn ebene [2] leer
                ?error_get_last_str() # dann get last error
                :$err_info[2] # sonst nimm ebene [2]
        ).' -- Query: '.$SQL['ipblock']['query']; # und die query anhaengen


    manchmal war/ist die ebene [2] leer. Daher per error_get_last_str() den letzten error geholt.
    Man kann natürlich auch:

    PHP
    $err_info = $SQL['ipblock']['stmt']->errorInfo();
        echo implode(', ',$err_info);


    Aber dann hast Du keine Bezeichnungen.


    Also noch mal übersichtlicher:


    edit:
    sorry - vergessen: die func "error_get_last_str" ist ja nicht vordefiniert :D
    hier is sie:

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!