Edwin V.

  • Home
  • Over Edwin V.
    • Edit
    • Delete
    • Tags
    • Autopost

    MySQL foutafhandeling in PHP

    Regelmatig zie ik de vraag langs komen over foutafhandeling voor MySQL in PHP. Gebruikers krijgen dan een onduidelijke foutmelding van mysql_fetch_*, terwijl de fout eigenlijk heel ergens anders ligt.

    <?php
    $rResult = mysql_query("SELECT * FROM tabel WHERE iets=true");
    while($aRow = mysql_fetch_assoc($rResult)){
    echo $aRow['kolom'];
    }
    ?>

    Het is mogelijk dat in mysql_query een fout optreed, maar doordat MySQL niet standaard een foutmelding op het scherm weergeeft, kan het voorkomen dat je hier verder niets van merkt. Pas als je bij mysql_fetch_assoc terecht komt geeft PHP een foutmelding, omdat in $rResult een boolean ‘false’ zit en niet de verwachte resource.

    Dit is op te lossen door de functie mysql_error te gebruiken. Hiermee kan je netjes de foutmelding op het scherm weergeven:

    <?php
    $sSql = "SELECT * FROM tabel WHERE kolom=iets";
    $rResult = mysql_query($sSql);
    if(!$rResult){
    echo "Er ging iets fout: ".mysql_error()." (Query: ".$sSql.")";
    } else {
    while($aRow = mysql_fetch_assoc($rResult)){
    echo $aRow['kolom'];
    }
    }
    ?>

    Hierdoor zal je bij een mogelijke fout in je query een nette foutmelding krijgen.

    Tags » Databases PHP
    • 16 February 2006
    • Views
    • Permalink
    • 2 responses
    • Like
    • Comment
    over 6 years ago Mathieu responded:

    Het is een goede gewoonte om niet altijd maar de SQL query er ook bij te gooien. Ik begrijp dat het handig is voor de ontwikkelaar, maar het biedt onwelwillenden een interessante blik in je database structuur. Waarom zou je ze extra informatie geven?

    Maak bijvoorbeeld een debug mode die de SQL query alleen laat zien als het script doorheeft dat het draait op een development machine:

    <?php

    if ($_SERVER['SERVER_ADDR'] == '192.168.1.25')

    {

    define('DEBUG_MODE', 1);

    }

    if (!$sqlResult)

    {

    echo "Er is iets foutgegaan met de database.";

    if (defined('DEBUG_MODE')) {

    echo mysql_error() . '<br />';

    echo $sqlQuery;

    }

    exit;

    }

    ?>

    over 6 years ago KlaaZ responded:

    Persoonlijk ben ik meer voor een generieke afhandeling, wel met de door Mathieu genoemde beperking.

    De gevorderde programmeurs zullen waarschijnlijk hun afhandeling via een class doen.

    De doelgroep voor een foutafhandeling als hier, kan mijns inziens beter onderstaande code gebruiken, ik denk namelijk dat het vele typwerk bij die groep al snel tot een meer gemakzuchtige methode zal leiden.

    <?php

    define( 'DEBUG', 1 );

    define( 'SQL_USER_ERROR', 'Er is een probleem met de database.' );

    function sqlError( $sQuery, $rDbConn = null )

    {

    $sReturn = SQL_USER_ERROR;



    if ( DEBUG )

    $sReturn = $sQuery.'<br />'.mysql_error( $rDbConn );



    return $sReturn;

    }

    ?>

    Al mis je zo wel de mogelijkheid een meer zinvolle melding te geven aan de gebruiker, wat ik toch beter vind.

  • Edwin Vlieg's Space

    Co-founder at MoneyBird, Entrepreneur, Software Engineer.

  • About Edwin Vlieg

    Co-founder at MoneyBird, Entrepreneur, Software Engineer.

  • Subscribe via RSS

    Archive

    2006 (23)
    September (1)
    August (6)
    July (1)
    June (1)
    May (1)
    April (6)
    March (5)
    February (2)
    2005 (2)
    December (1)
    June (1)
    2004 (1)
    September (1)
  • Follow Me

Theme created for Posterous by Obox