Spatie in tabelnaam en onbestaande tabel/record

Status
Niet open voor verdere reacties.

Mitij

Gebruiker
Lid geworden
15 aug 2009
Berichten
9
Hallo allemaal,

Ik ben redelijk nieuw binnen MySQL, en dat lukt me iets minder goed dan bijvoorbeeld PHP leren, daarom heb ik volgende 2 vragen:

Ik gebruik query's om de tabel te bepalen waaruit gegevens moeten worden opgehaald, en ik gebruik diezelfde query's ook om de titel van de pagina te bepalen.
hier zie je wat ik bedoel:
http://dekruimel-vorst.be/layout/index.php?where=menu
Maar bij bijvoorbeeld 'warme dranken' zit er dus een spatie in de naam van de tabel, en die geeft een foutmelding daarbij, hoe kan ik dat oplossen? Ik zou wel kunnen met switch() werken, maar ik zou graag een iets minder gesofisticeerde oplossing vinden :)

Mijn tweede vraag:
Als je in de laatste query (table) iets invult wat niet bestaat, dan geeft ie een foutmelding die ik zou willen vermijden, aangezien hij dan op zoek gaat naar een tabel die helemaal niet bestaat.
Mijn code hiervan:
PHP:
$table = $_GET['table'];
if ($table == '') {
 $table = 'bieren';
}
(...)
echo '<p class="title">'.strtoupper($table).'</p>';
mysql_connect(localhost,$user,$password);
@mysql_select_db($database) or die("Kan database niet selectere");
$query = "SELECT * FROM $table";

Hetzelfde probleem heb ik bij de login van de admin, maar dan op recordniveau. D.w.z.: als er een username ingegeven wordt die niet bestaat dan geeft hij een foutmelding.
Mijn code daarvan:
PHP:
$username = $_POST["user"]; 
$pass = $_POST["pass"]; 
(...)
if ($pass == '' or $username == '') {
	echo 'Je moet beide velden invullen om in te loggen!';
} else {
mysql_connect(localhost,$user,$wachtwoord);
@mysql_select_db(admin_kruimel) or die("Kan database niet selecteren");
$query = "SELECT * FROM users WHERE user='".$username."'";
$result = mysql_query($query);
$num = mysql_numrows($result);
if ($num=0) {
	echo 'gebruikersnaam bestaat niet';
}
$password = mysql_result($result,"pass");
if ($pass == $password) { 
echo "je bent ingelogd en kan nu de pagina zien"; 
}
Blijkbaar werkt dit dus niet, en ik heb geen flauw idee hoe het wel moet want, zoals ik al zei, ik ben nog redelijk nieuw in MySQL :)

Dank bij voorbaat!
 
Het probleem van de spatie heb ik opgelost gekregen, maar hoe doe ik dus dat andere deel, van niet-bestaande tabellen en records?
 
Is mijn vraag onduidelijk? Of is het gewoon onoplosbaar? Gelieve dat dan ook wel even te melden :)
 
Dat je problemen had met spaties in je tabelnaam is helemaal niet zo verwonderlijk, aangezien dit volgens SQL-defenitie eigenlijk niet toegestaan is:
PHP&MySQL voor Dummies zei:
De tabelnaam bestaat uit tekens zonder spaties.
Toegelaten tekens zijn: letters, getallen, liggende streepjes (_) en dollartekens ($).
Hoofdletters en kleine letters zijn belangrijk bij Unix/Linux, maar niet bij Windows.
Moest je ooit spaties in een url willen zetten, kan je best gebruik maken van hun url-entiteitscode %20. In plaats van warme dranken verwijs je dan naar warme%20dranken.

Om je foutmeldingen voor onbestaande tabellen weg te werken, zou je 2 methodes kunnen gebruiken.
  1. Beschikbaarheid nagaan: MySQL houdt intern gegevens bij in een tabel over alle tabellen van die database. Je zou via een extra query kunnen kijken of de tabelnaam in kwestie bestaat, door deze in die systeemtabel op te zoeken, en pas daarna, als die bestaat, ze aanspreken. Mogelijk nadeel is dat je altijd een extra query moet uitvoeren, en dat vraagt mss extra tijd van je server (maar op die enkele millisecondes komt het meestal niet aan..)
  2. Foutenafhandeling in PHP: Dit is de methode die ik gebruik, en ze werkt op het principe van exceptions in PHP. Wanneer een functie een fout maakt, dan 'werpt' ze deze op. Die 'weggegooide' foutmelding kan je dan af-'vangen'. Dit gebeurt in een try-catch-blok (probeer iets uit, vang bepaalde fouten op).
    Een voorbeeld gemaakt op jouw code:
    PHP:
    //stel de standaardwaarde in
    $table = 'bieren';
    //ken de waarde pas toe, nadat er gecontroleerd is of deze bestaat en
    // als ze niet leeg is
    if (isset($_GET['table']) && !empty($_GET['table'])) {
            $table = $_GET['table'];
    }
    (...)
    echo '<p class="title">'.strtoupper($table).'</p>';
    mysql_connect(localhost,$user,$password);
    @mysql_select_db($database) or die("Kan database niet selecteren");
    //eigenlijk is die() 'slecht' gebruik dat je enkel tijdens de ontwikkelingsfase toepast, het
    // niet vinden van de database zou beter ook met een if-structuur behandeld worden.
    $query = "SELECT * FROM $table";
    //SELECT * haalt vaak overbodige info op als de tabel
    //later aangepast wordt, het is beter om altijd je kolomnamen te schrijven
    $result;
    //probeer de query uit te voeren
    try {
            $result = mysql_query($query);
    } catch (Exception $e) {
            echo "De opgevraagde tabel bestaat niet.";
    }
    if (!empty($result)) {
           //hier kan je dan verdergaan met het ophalen van gegevens uit de tabel
    }

En nu nog betreffende de foutmelding van je username/passwoord. Het probleem is dat je het wachtwoord probeert op te vragen, ongeacht of de username bestaat of niet. Als die niet bestaat, gaat je query-resultaat leeg zijn, en krijg je een error wanneer je het wachtwoord probeert op te vragen.
De oplossing is hier vrij eenvoudig, namelijk het opvragen van het wachtwoord ook binnen de if-structuur plaatsen, zoals dit:
PHP:
$query = "SELECT pass FROM users WHERE user='".$username."'";
$result = mysql_query($query);
$num = mysql_numrows($result);
if ($num=0) {
        echo 'gebruikersnaam bestaat niet';
} else {
        $password = mysql_result($result,"pass");
        if ($pass == $password) { 
                echo "je bent ingelogd en kan nu de pagina zien";
        }
}
Wel wil ik nog even vermelden dat je je variabele username nog moet beveiliging tegen sql-injectie alvorens die in de query te steken, zoniet kan iedereen met enige sqlkennis je volledige database beheren, en mensen die dat doen hebben meestal geen goede bedoelingen...

Als je iets nog niet snapt, dan hoor ik het wel (nu ik je topic gevonden heb ;) )
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan