Ralf: Vergleich liefert immer true

Hallo,

ich schreibe gerade eine Funktion die überprüfen soll, ob es einen bestimmten Eintrag in einer Datenbac
Datenbank schon gibt oder nicht.

{
...
$res = mysqli_query($this->db, "SELECT COUNT(*) FROM meineTabelle WHERE foo='$bar'");
$count = @mysqli_fetch_row($res);
if($count > 0 ){
 return true;
}else {
 return false;
}

Auch wenn es keine Einträge foo="$bar" gibt wird true zurück gegeben.

  1. Hello,

    $res = mysqli_query($this->db, "SELECT COUNT(*) FROM meineTabelle WHERE foo='$bar'");
    $count = @mysqli_fetch_row($res);
    if($count > 0 ){
    return true;
    }else {
    return false;
    }

    ist das exemplarischer Code, wohl schon, oder?
    Du unterdrückst bzw. ignorierst zumindest hier potenzielle Fehler. Du kannst damit nicht ausschließen, dass $res kein Result ist und $count keinen Inhalt hat. Prüfe zunächst auf Fehler, eh du den Vergleich durchführst.

    MfG
    Rouven

    --
    -------------------
    sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
    Eine Bilanz ist wie der Bikini einer Frau. Sie zeigt fast alles, aber verdeckt das Wesentliche  --  Günter Stotz, Regierungsdirektor des baden-württembergischen Wirtschaftsministeriums
  2. Wie wäre es mit ein paar Kontrollausgaben und dem Abfangen eventueller mysql-Fehlermeldungen um das Problem einzugrenzen?

  3. Hello,

    ich schreibe gerade eine Funktion die überprüfen soll, ob es einen bestimmten Eintrag in einer Datenbac
    Datenbank schon gibt oder nicht.

    {
    ...
    $res = mysqli_query($this->db, "SELECT COUNT(*) FROM meineTabelle WHERE foo='$bar'");
    $count = @mysqli_fetch_row($res);

    ^
    Warum machst Du sowas? Das ist kontraproduktiv. Fehlermeldungen, bzw. Statusmeldungen sind keine Feinde, sondern sollten immer ausgewertet werden:

    if($count > 0 ){
    return true;
    }else {
    return false;
    }

    Auch wenn es keine Einträge foo="$bar" gibt wird true zurück gegeben.

    $res = mysqli_query($this->db, "SELECT COUNT(*) FROM meineTabelle WHERE foo='$bar'");

    if (!$res)
    {
        ### hier ist 'was schief gegangen
        echo "<p>".htmlspecialchars($mysqli_error($con));
    }
    else
    {
        $count = @mysqli_fetch_row($res);

    mysqli_free_result($res);

    if($count > 0 )
        {
            return true;         ## ein einfaches return ist hier eventuell falsch.
        }                        ## Wenn es sich um eine Funktion handelt,
        else                     ## in der die Connection aufgebaut wird,
        {                        ## muss diese auch wieder geschlossen werden
            return false;        ## Auf jeden Fall muss das Resultset freigegeben werden
        }
    }

    Liebe Grüße aus dem Cyberspace

    Tom vom Berg

    --
    Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
  4. Hallo,

    {
    ...
    $res = mysqli_query($this->db, "SELECT COUNT(*) FROM meineTabelle WHERE foo='$bar'");
    $count = @mysqli_fetch_row($res);
    if($count > 0 ){
    return true;
    }else {
    return false;
    }

    Wenn Du nicht gerade einen Syntaxfehler einbaust - Du solltest deswegen $bar kontextgerecht behandeln (hier mit mysqli_real_escape_string()), dann wird Deine Abfrage *immer* genau einen Datensatz zurückliefern, die Anzahl der zurückgelieferten Datensätze.

    Prüfe daher zuerst, ob Deine Abfrage überhaupt ausgeführt werden kann (Datenbankserver stehen manchmal nicht zur Verfügung), prüfe anschließend den Inhalt der gewünschten Spalte der zurückgelieferten Zeile statt die Ressource

    // Da Du Deiner Spalte keinen vernünftigen Namen gegeben hast,  
    // greifst Du hier besser über den Index zu. Deine Abfrage liefert eine Zeile  
    // mit einer Spalte zurück, deswegen findest Du die Zahl der passenden  
    // Datensätze in der ersten Spalte, die den Index 0 hat:  
    if ($count[0] > 0) {  
        return true;  
    }  
    // auf else können wir hier verzichten, durch return im if-Zweig  
    // kommen wir hier nur hin, wenn die Bedingung nicht zutrifft.  
    return false;  
    
    

    Freundliche Grüße

    Vinzenz