Form Page: Validierung von Eingaben - Datenbankabfrage in wechselnder Spalte

  • Guten Tag,

    Ich möchte mit einer Funktion prüfen, ob ein gegebener Wert in einer bestimmten (je nach Abfrage unterschiedlichen) Spalte schon enthalten ist.

    Ich habe mich an der UserUtil.class.php des WCF orientiert:

    PHP: UserUtil.class.php
    public static function isAvailableUsername($name) {
    		$sql = "SELECT	COUNT(username) AS count
    			FROM	wcf".WCF_N."_user
    			WHERE	username = ?";
    		$statement = WCF::getDB()->prepareStatement($sql);
    		$statement->execute(array($name));
    		$row = $statement->fetchArray();
    		return $row['count'] == 0;
    	}


    Mein Code sieht nun wie folgt aus:

    PHP
    public static function isAvailableUser($role, $user) {
    		$sql= "SELECT	COUNT(teamID) AS count
    				FROM	appsystem1_groups
    				WHERE	'role' = 'user'";
    		$row = 0;
    		$statement = WCF::getDB()->prepareStatement($sql);
    		$statement->execute(array($role, $user));
    		$row = $statement->fetchArray()
    		return $row['count'] == 0;
    }

    Er gibt keine Syntaxfehler etc aus, lediglich ist es egal ob der Wert schon in der Tabelle bzw der gegebenen Spalte vorhanden ist und somit funktioniert die Funktion nicht. Ich hab mich bereits versichert, dass die Funktion aufgerufen wird.

    Mag mich jemand erleuchten, was ich übersehen habe?^^

    Vielen Dank im Voraus!

  • ja, das ist mir bewusst

    role ist die Variable $role die an die Funktion übergeben wird, deswegen in Hochkomma. Die Datenbankspalte soll ja abhängig vom jeweiligen Aufruf sein.
    Ich könnte ja theoretisch einen switch für jede Möglichkeit der spalte machen, fände ich aber etwas "unschön". Oder wäre das der einzige Weg?

  • auch dann ist das falsch, aktuell steht in deiner WHERE klausel eine bedingung drinnen die immer falsch ist, da du hier feste werte gegeneinander abgleichst statt ein wert dem dem wert einer spalte zu vergleichen...

  • Du musst dich vermutlich nochmal damit vertraut machen, wie Prepared Statements funktionieren.
    Mit nachfolgendem Code sollte es funktionieren:

    PHP
    public static function isAvailableUser($role, $user) {
    	$sql = "SELECT	COUNT(teamID) AS count
    		FROM	appsystem1_groups
    		WHERE	" . $role . " = ?";
    	$statement = WCF::getDB()->prepareStatement($sql);
    	$statement->execute(array($user));
    	$row = $statement->fetchArray()
    	return $row['count'] == 0;
    }

    Beachte: $user wird durch das Prepared Statement escaped. $role wird direkt in die Query eingetragen, weswegen $role keine Eingabe vom Benutzer sein darf oder du musst die Eingabe entsprechend überprüfen (Stichwort SQL-Injection). Wir müssen $role aber direkt in die Query eintragen, da alle Elemente der Datenbank (Tabellen, Spalten, etc.) nicht als Parameter an das Prepared Statement gegeben werden können.

  • Ja, da ist sicherlich ein Einstieg in das Thema. Im Prinzip ist es auch nicht sonderlich kompliziert: Du bereitest die Query zuerst mit Platzhaltern (den Fragezeichen) vor und danach sagst du, mit welchen Werten die Fragezeichen beim Ausführen der Query ersetzt werden. Falls dir etwas dazu unklar ist, kannst du einfach hier nachfragen.

    Vielen Dank für deine Antwort!

    Gerne :)

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!