Tach!
Die Fehlermeldung sagt, dass an einem non-object eine Methode aufgerufen wurde. Das heißt also, dass $stmt ein non-object ist. Das sollst du mit var_dump($stmt) überprüfen. Natürlich ändert sich damit noch nichts, aber das wäre der erste Schritt zur Analyse des Problems.
wenn ich var_dump($stmt) ausgeben lassen, erhalte ich dieses:
bool(false) [...]
Und was sagt dir das nun? Hast du dich mal informiert, was var_dump() macht? Und warum ich das empfehle?
In $stmt steckt also der boolsche Wert false drin. Warum das? Warum ist das kein Objekt der Klasse mysqli_stmt? Das sind die Fragen, die du dir stellen musst. Zu deren Beantwortung musst du nun zurück zu der Stelle gehen, an der die Zuweisung stattfand und herausfinden, warum diese misslungen ist. Dazu dann im Handbuch lesen, wann false zurückgegeben wird - im Fehlerfall. Aha, prepare() wurde nicht fehlerfrei ausgeführt. Und wie kommen wir bei MySQL an den Text von Fehlermeldungen?
Das nächste Thema wäre dann noch, robuster zu programmieren, dass Fehler abgefangen werden. Solche können nämlich auch zur Laufzeit in produktiven Systemen auftreten.
dedlfix.