Direct Admin Web Error Log

  • Hoi,


    Ik zat eens in me Web Error Log te kijken en zag wat errors waar ik wel wat mee kon, dus opgelost.
    Alleen deze snap ik effe niet.


    PHP Notice: Undefined index: id in huppeldepup in line 4.Oke kijken, line 4

    Code
    $result = mysqli_query($base,"UPDATE klant SET online=NOW() WHERE id_klant='".$_SESSION['id']."' LIMIT 1") or die(mysqli_error($base));


    Hij geeft dus een error in het log maar het doet gewoon wat ie moet doen en dan toch die error. Als ie niet bekend is dan schrijft ie hem toch niet weg, of ben ik nu gek? :D


    Iemand een idee cq oplossing?


    Gr peter

  • Guest, wil je besparen op je domeinnamen? (ad)
  • Hij heeft het over de "$_SESSION['id']", de reden is waarschijnlijk dat er geen controle op zit of de id echt gezet is. Zet boven de query dit neer:


    PHP
    if(!isset($_SESSION['id'))
        $_SESSION['id'] = '';

    Hierdoor zal error meteen verdwijnen, daarnaast de reden dat alles gewoon werkt omdat dit niet perse een error is, en dat staat er ook, het is een notice. Notices en warnings zijn geen errors en het programma draait dus gewoon door. Alleen bij fatal errors stopt de code.

    PHP, JAVA, C#, JAVASCRIPT, HTML(5), CSS(3) developer.
    Vragen?! Stuur me gerust een prive bericht :) !

  • Kan je deze Notice ook ergens anders lezen?


    want met deze zie ik ze niet:


    Code
    error_reporting(E_ALL);
    ini_set('display_errors','on'); 
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

    En wil altijd wel alles 'error' cq notice vrij hebben.

  • De query "gaat goed" omdat deze qua syntax (vorm) goed is.


    Alhoewel de volgende query "correct" is:

    SQL
    UPDATE klant
    SET online=NOW()
    WHERE id_klant=''
    LIMIT 1

    levert deze (waarschijnlijk) nooit een resultaat op. Ook zie ik niet helemaal waarom die LIMIT 1 er bij moet. Het kan geen kwaad, maar op deze manier krijg ik de indruk dat je er niet van uit kan gaan dat het goed gaat als je dit weglaat :). Dat zou inhouden dat je de informatie in je sessie niet helemaal kan vertrouwen, en als dat aan de orde is heb je andere problemen :).


    En je krijgt de notice omdat $_SESSION['id'] niet bestaat. Ofwel omdat je sessie niet gestart is ten tijde van het uitvoeren van de query, of dat $_SESSION['id'] niet geinitieerd is. Dit laatste kan weer verschillende redenen hebben als:
    - een gebruiker was niet ingelogd op het moment van uitvoeren van de query
    - de sessie was verlopen bij het (opnieuw) opvragen van een pagina


    Je zou dit inderdaad op kunnen lossen door op het bestaan van $_SESSION['id'] te controleren, maar die controle zelf hoort waarschijnlijk op een andere plaats thuis, en niet direct voor de uitvoer van de query... Bijvoorbeeld bij het laden van de pagina - daar had je waarschijnlijk al ingelogd moeten zijn om de pagina te mogen zien, dat (bij het opvragen van de pagina) zou dan ook een geschiktere plaats moeten zijn als je het mij vraagt.

  • oke maar hij voert het wel uit dus dan zou je toch zeggen dat de sessie bestaat?


    Ik heb hiervoor wel een check.

    Code
    //Start een sessie
    	session_start();
    	ob_start();
    	if(!isset($_SESSION['id'])){
    	header('Location: ../index.php');
    	}

    daarna komt pas de query. Dus ga er nog maar eens induiken want iets werkt niet helemaal lekker.


    Tja LIMIT 1, ik doe dat tegenwoordig standaard als ik weet dat het maar om 1 klant gaat.


    Tja, en de errors report, ik heb het boven aan de pagina staan maar Directadmin geeft ze wel aan en ik zie niks op de pagina, dan praat ik over de NOTICE. Beetje strange....

  • :)


    Headers zijn onderdeel van output. Deze worden pas verstuurd op het moment dat er output wordt geproduceerd.


    Er ontbreekt een exit in dat if-statement. ALLE code die daarna nog volgt wordt dus gewoon uitgevoerd. Zoals ik al eerder heb beschreven: header('Location: ...') transporteert je niet direct automagisch naar een nieuwe locatie.


    Ik denk dat het de moeite loont als je je code controleert op dit soort constructies. Wat mogelijk nog beter is is dat je een redirect-functie of methode maakt, zodat je de "exit" nooit meer vergeet. Daarbij wordt je code ook nog eens een stuk korter:

    PHP
    <?php
    function redirect($link) {
        header('HTTP/1.1 303 See Other');
        header('Location: '.$link);
        exit;
    }
    ?>

    ik kan dit ook niet vaak genoeg zeggen en benadrukken: het verschil tussen het plaatsen of ontbreken van een exit-statement kan het verschil betekenen tussen een veilige of onveilige applicatie.

  • Snap het effe niet....
    Waar ik $_SESSION['id'] maak, zet ik uit.


    dan ga ik inloggen.
    Heb het volgende staan:



    Code
    echo "KlantID{$_SESSION['id']}";
    if(!isset($_SESSION['id'])){
    		echo'leeg';
    	} else { echo 'bestaat'; }

    regel 1 laat niks zien, geen id.
    Dan zou je zeggen dat ie niet bestaat.
    Maar regel 4 laat ie wel zien, bestaat.
    Dus hij is leeg maar ook weer niet.... vat hem effe niet....

  • Ik zou zeggen, dump je sessie-data eens naar je scherm:

    isset() retourneert ook false als de waarde van de variabele NULL IS. Let er op dat er een NOT-operator (het uitroepteken) voor je isset() statement staat.


    Voor de leesbaarheid zou je ook kunnen overwegen om ofwel het volgende te gebruiken:

    PHP
    <?php
    if (isset($a) === false) {
        echo '$a is not set';
    } else {
        echo '$a is set';
    ?>

    Of je draait de delen om:

    PHP
    <?php
    if (isset($a)) {
        echo '$a is set';
    } else {
        echo '$a is not set';
    ?>

    Misschien is dat nog beter: gebruik zo min mogelijk operators waardoor je je mogelijk kunt vergissen.


    Of gebruik te maken van empty, maar je moet dan ook goed opletten dat de variabele ook als "leeg" wordt beschouwd als de waarde van de variabele een "lege" waarde heeft (de lege string, het cijfer 0 (al dan niet tussen quotes), false of NULL).

    PHP
    <?php
    if (empty($a)) {
        echo '$a is empty';
    } else {
        echo '$a is not empty';
    }
    ?>

Participate now!

Heb je nog geen account? Registreer je nu en word deel van onze community!