Rolf B: Fatal error: Uncaught Error: Call to a member function bind_param() on boolean

Beitrag lesen

Hallo Kiwi_gamer01,

dass man einen Spaltennamen nicht per Parameter binden kann, hast Du schon gelesen.

Die Frage ist: Wie macht man es?

Du kommst hier mit PREPARE nicht weiter, du bist gezwungen, das SQL selbst zusammen zu bauen.

Man ist dann verleitet, es so zu machen:

		$absenden2 = $mysqli->prepare("UPDATE playmobil SET $_POST[Wert] = '?' WHERE ID=?");
		$absenden2->bind_param("si", $into, $ID2);               <!-- Zeile 150-->
		$absenden2->execute();
		$absenden2->close();

Was dann bösen Menschen das Schreddern der DB erlaubt.

Ach übrigens: Hast Du $Wert und $into vertauscht? Man sollte doch meinen, dass der Feldname in INTO steht.

Es stellt sich die Frage, ob dein Datenmodell taugt. Oder deine Eingabemaske. Weil - es ist leichtfertig, einem Web-Anwender blindlings einen Update auf eine beliebige Spalte zu erlauben. Du wirst eine gewisse Anzahl von Spalten in der Playmobiltabelle haben. Bevor Du das rote Statement einsetzt, musst Du also prüfen, ob in $_POST['Wert'] einer der zum Überschreiben erlaubten Column-Namen steht. Das kann man mit in_array tun (vorher sicherstellen, dass alles klein oder groß geschrieben ist). Dann ist es okay und Du musst auch nicht mit $mysqli->escape_string arbeiten. ABER AUCH NUR DANN.

Die Alternative wäre, statt einzelnen Spalten eine Attribute-Tabelle zu machen, in der die Spalten ID, NAME und WERT stehen. Dann musst Du bei neuen Attributen keine Tabellenänderung machen. Das Verarbeiten ist dann nur etwas mühsamer, weil Du nicht alle Attribute in einer Zeile findet. Ist nur eine Idee.

Rolf

--
sumpsi - posui - obstruxi