Falsche Formatierung bei Prepared Statements

Cappaja

Erfahrenes Mitglied
Hallo,

ich habe eine Funktion updateCol($user, $value, $col). Ich rufe diese Funktion wie folgt auf:

PHP:
updateCol($account['user'], '`Logins`+1', Logins);

Ohne Prepared Statements funktioniert alles soweit. Aus sicherheitstechnischen Gründen stelle ich jetzt jedoch sämtliche Datenbankzugriffe auf Prepared Statements um, Escapen kommt dabei nicht in Frage. Und so lautet meine umgebaute Funktion wie folgt:

PHP:
function updateCol($user, $value, $col)
{
	$db = new mysqli('localhost', 'root', '', 'mydb')
		or die("Es konnte keine Verbindung zum Datenbankserver hergestellt werden!");
	$sql = "UPDATE `login` SET `$col` = ? WHERE `User` = ?";
	$command = $db->prepare($sql);
	$command->bind_param('ss', $value, $user);
	$command->execute();
	$command->close();
	$db->close();
}

Jetzt habe ich allerdings das Problem das mein übergebener Wert in $value also '`Logins`+1' als String-Platzhalter vorbelegt wurde (Logins ist hierbei der Name der Spalte welche nichts weiter macht als nach jedem erfolgreichen Login den Zähler um 1 zu erhöhen) Ich vermute das durch den Platzhalter der gesamte Ausdruck als String an die SQL-Abfrage übergeben wird und somit mein Zähler nie inkrementiert wird. Wenn ich meiner Funktion den Parameter ohne Hochkommatas übergebe also `Logins`+1, so erhöht sich der Zähler auf 1 und bleibt dort aber auch stehen, weil vermutlich jedesmal die 1 dem Ausdruck entnommen wird. Ich hoffe ich konnte das Problem einigermaßen schildern. Meine Frage ist jetzt wie ich den Ausdruck via Prepared Statements so in meine SQL-Abfrage inkludieren kann, damit dort wirklich steht:
PHP:
$sql = "UPDATE `login` SET `Logins` = `Logins`+1 WHERE `User` = 'irgendEinName'";

Wie gesagt, die Problematik sehe ich beim Übergabeparameter $value.

Mit freundlichen Grüßen

Cappaja
 
Das wird so nicht mit Prepared Statements funktionieren, das Query musst du also vorher bereits einsetzen.
 
Also ich bin auch auf keine Lösung mehr in dieser Art gestoßen. Ich hole mir jetzt die tatsächliche Anzahl der Logins und reserviere nun ein Integer dafür als Platzhalter. Ich bin mir jetzt nicht sicher wie ich den Wert aus dem SELECT unter Verwendung von Prepared Statements auslesen soll. Kann mir jemand sagen wie ich mein IF-Konstrukt dementsprechend abändern muss? Ich vermute das nach dem execute() noch ein bind_result() kommen sollte, doch was gebe ich da an?

PHP:
function updateLogins($user)
{
	$value = 0;
	$db = new mysqli('localhost', 'root', '', 'mydb');
	$sql = "SELECT * FROM `login` WHERE `User` = '$user'";
	if($stmt = $db->prepare($sql))
	{
		$stmt->execute();
		while($row = $stmt->fetch())
		{
			$value = $row['Logins']+1;
		}
	}
	$sql = "UPDATE `login` SET `Logins` = ? WHERE `User` = ?";
	$command = $db->prepare($sql);
	$command->bind_param('is', $value, $user);	
	$command->execute();
	$command->close();
	$db->close();
}
 
Habs jetzt doch noch gelöst bekommen. Dank des glorreichen Copy & Paste war bereits meine SQL Abfrage falsch. Ich habe ganz vergessen die betreffende Spalte `Logins` auszuwählen. Das bind_result() modelt mein Ergebnis dann in die entsprechende Variable $col. Für diejenigen die ein ähnliches Problem haben, hier nochmal die funktionierende Methode:

PHP:
function updateLogins($user)
{
	$value = 0;
	$db = new mysqli('localhost', 'root', '', 'mydb')
		or die("Es konnte keine Verbindung zum Datenbankserver hergestellt werden!");
	$sql = "SELECT `Logins` FROM `login` WHERE `User` = '$user'";
	if($stmt = $db->prepare($sql))
	{
		$stmt->execute();
		$stmt->bind_result($col);
		while($stmt->fetch())
		{
			$value = $col+1;
		}
		$stmt->close();
	}
	$sql = "UPDATE `login` SET `Logins` = ? WHERE `User` = ?";
	$command = $db->prepare($sql);
	$command->bind_param('is', $value, $user);	
	$command->execute();
	$command->close();
	$db->close();
}
 
Zurück