PHPFreak!: Unmögliches PHP Query result

Hi,

ich hab da gerade ein eigentlich unmögliches PHP Result einer Query bekomme und stehe auf dem Schlauch. Es handelt sich um folgendes:

private function AlreadyExistent($ID) {  
      	$Result = $this->Connect->query("SELECT id FROM items WHERE id = '$ID'");  
		if($Result->num_rows == 1) {  
			$this->ErrorOut("Error: The ID $ID from Pubmed was already imported into the database!");  
			return true;  
		}  
		elseif($Result->num_rows == 0) {  
			return false;  
		}  
		else {  
                        // THIS SHOULD NEVER APPEAR !!!  
			array_push($this->SQLErrors,$this->Connect->error);  
			$this->ErrorOut("Error: There must be an Error in the Script / Database due to the ID $ID doesnt give back valid results!");  
			return true;  
		}  
	}

items werden in meiner datenbank bestimmte IDs zugeordnet. Und ich möchte einfach prüfen, ob ID XY schon vorhanden ist in der DB. So weit ja ganz einfach. Bei 99% aller Versuche funktioniert es, wenn ich jetzt aber nach ID  10341281 suche, kommt tatsächlich die Fehlermeldung Error: There must be an Error in the Script / Database due to the ID $ID doesnt give back valid results!, die eigentlich nie hätte auftreten dürfen. Bei nachprüfen in der Datenbank wird mir angezeigt, dass dieser ID 10341281 das Item 1332 zugeordnet ist. Es existiert also! Bei 99% aller Versuche funktioniert die Funktion auch! Was mache ich bitte falsch?

  1. Hello,

    Was mache ich bitte falsch?

    Wieviele und welche Möglichkeiten gibt es denn, dass eine ID in der Tabelle vorhanden ist?

    • noch nicht vorhanden
    • einmal vorhanden
    • mehrmals vorhanden

    Und was fragst Du in deinem If-ElseIf-Else-Konstrukt ab?

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
  2. Hallo,

    ich hab da gerade ein eigentlich unmögliches PHP Result einer Query bekomme und stehe auf dem Schlauch.

    "Nichts ist unmöööglich!" :-)

    private function AlreadyExistent($ID) {

    $Result = $this->Connect->query("SELECT id FROM items WHERE id = '$ID'");
    if($Result->num_rows == 1) {
    $this->ErrorOut("Error: The ID $ID from Pubmed was already imported into the database!");
    return true;
    }
    elseif($Result->num_rows == 0) {
    return false;
    }
    else {
                            // THIS SHOULD NEVER APPEAR !!!
    array_push($this->SQLErrors,$this->Connect->error);
    $this->ErrorOut("Error: There must be an Error in the Script / Database due to the ID $ID doesnt give back valid results!");
    return true;
    }
    }

      
    Streng logisch vorgehen: Du erwartest, dass die Zahl der gefundenen Datensätze entweder 0 oder 1 ist. Diese beiden Fälle behandelst du gezielt, alles andere ist "else".  
    Konsequente Schlussfolgerung: Du bekommst 2 oder mehr Treffer. Lass dir mal $Result->num\_rows anzeigen.  
      
    So long,  
     Martin  
    
    -- 
    Lieber Hahn im Korb, als Tiger im Tank.  
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    
    1. Oh mein Gott, da habt ihr beiden Recht. Ich war so verbissen dadrauf, dass eine ID nur einmal vorkommen darf, das mir überhaupt nicht aufgefallen ist, dass sie theoretisch ja zweimal vorkommen kann, obwohl ich das gar nicht wollte. Jetzt muss ich nur noch den Fehler finden wieso ausgerechnet diese ID zweimal eingetragen wird.

      1. Hi,

        Ich war so verbissen dadrauf, dass eine ID nur einmal vorkommen darf, das mir überhaupt nicht aufgefallen ist, dass sie theoretisch ja zweimal vorkommen kann, obwohl ich das gar nicht wollte. Jetzt muss ich nur noch den Fehler finden wieso ausgerechnet diese ID zweimal eingetragen wird.

        … und einen UNIQUE Index auf die Spalte setzen, wenn das mehrfache Vorkommen einer ID in dieser Tabelle schon vom Datenmodell her ausgeschlossen sein soll.

        MfG ChrisB

        --
        RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
      2. Hello,

        Oh mein Gott, da habt ihr beiden Recht. Ich war so verbissen dadrauf, dass eine ID nur einmal vorkommen darf, das mir überhaupt nicht aufgefallen ist, dass sie theoretisch ja zweimal vorkommen kann, obwohl ich das gar nicht wollte. Jetzt muss ich nur noch den Fehler finden wieso ausgerechnet diese ID zweimal eingetragen wird.

        Es ist auch nutzlos, die "Sicherheit" mittels zwei ungebundener Abfragen herstellen zu wollen. Da baust Du Dir ein TOCTTOU-Problem http://en.wikipedia.org/wiki/Time_of_check_to_time_of_use.

        Entweder Du stellst die Sicherheit bereits durch das Datenmodell her (siehe ChrisBs Vorschlag https://forum.selfhtml.org/?t=210964&m=1439193 oder aber du führst beim Insert ein Subselect aus. Alternativ kannst Du die Tabelle sperren, und tatsächlich zwei Einzel-Queries durchführen. Das führt dann aber meistens zu massiven Folgeproblemen.

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
  3. Hi,

    private function AlreadyExistent($ID) {

    $Result = $this->Connect->query("SELECT id FROM items WHERE id = '$ID'");
    if($Result->num_rows == 1) {

      
    Du fragst hier alle Datensätze ab, ohne an diesen anschließend detailiertes Interesse zu haben – unperformant.  
      
    Da dich nur die Anzahl der Datensätze interessiert, mache ein `SELECT COUNT(id) anzahl FROM …`{:.language-sql}, und werte anschließend den Inhalt der (Pseudo-)Spalte anzahl aus.  
      
    MfG ChrisB  
      
    
    -- 
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?