Wodurch kommt der Fehler mysqli_real_escape_string() expects parameter 2 to be string, object given in <b>F:\xampp\htdocs\Session\Funktion_Validate.php</b> on?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

1) Also das hier (da ich schon gerade in der Funktion_Validate.php-Datei bin):

die();
header("Location: Login.php");
exit();

macht erst einmal keinen Sinn, bzw. die letzten beiden Anweisungen werden nie ausgeführt werden, sollte es einmal zu diesem Programmzweig kommen. Das Alias die macht nichts anderes als exit. Es beendet das Skript vorzeitig.

2) An dieser Stelle:

$arg = mysqli_real_escape_string($arg, $_SESSION['con']);

ist die Reihenfolge der Argumente einfach nur falsch (ich vermute, dass con auf das mysqli-Verbindungsobjekt zeigt, kann es aber derzeit nicht genau nachprüfen, da pastebin nicht ganz erreichbar ist). Drehe sie um.

Soweit ich das gesehen habe, gibt es mehrere Fundstellen für diesen (und auch den von mir erstbenannten Logik-)Fehler.

3) So wie ich das sehe, machst du einige Prüfungen unnötig doppelt. Du verwendest Prepared Statements, d.h. die Maskierung deiner Werte erfolgt schon implizit. Du brauchst dich nur noch um den wirklichen Inhalt kümmern (Ist die angegebene E-Mail-Adresse eine E-Mail-Adresse? Darf die PLZ auch Buchstaben beinhalten? u.ä.). Die Aufrufe von mysqli_real_escape bspw. können raus.

platofan23 
Fragesteller
 26.11.2019, 22:32

zu 1) kann ich dann nicht iwie das schreiben abbrechen und zum header gehen lassen also das im prinzip der loginvorgang beendet wird oder schicket da da header('Login.php') und exit()

2) danke dann werde ich es sobald wie möglich ändern

3) super dann kann ich meinen code endlich nochmal um ein paar zeilen kürzen

NOCH MAL VIELEN VIELEN DANK =)

0
regex9  27.11.2019, 00:51
@platofan23

Nimm einfach nur den Aufruf von die jeweils heraus. Direkt nach der Weiterleitung wird der Code via exit beendet und somit ist deine Anforderung dann auch erfüllt.

1
platofan23 
Fragesteller
 27.11.2019, 21:45
@regex9

danke werde ich tun =). noch eine frage, kann man eigentlich ein msqli-objekt in einer session speichern? jemand meinte das sei nicht so vorgesehen?

0
regex9  28.11.2019, 01:24
@platofan23

Nein. In der Dokumentation findest du dazu diese Anmerkung:

Because session data is serialized,  resource variables cannot be stored in the session

Quelle

und das bezieht sich auch auf mysqli-Objekte (Verbindungsobjekte, ResultSets). Auch wenn es möglich wäre, würde ich es nicht für sinnvoll erachten.

Zum einen wird die Datenbankverbindung nach jeder Skriptbeendigung eh abgebrochen (egal, ob du sie explizit beendest oder nicht, es ist nur eine Frage der Zeit), sodass ein Verbindungsobjekt nach Deserialisierung einen invaliden Zustand hätte.

Zum anderen verschleuderst du in dem Moment unnötig Speicher, denn die mysqli-Objekte bringen doch einen gewissen Overhead mit sich, der nicht gebraucht wird (du kannst dir zu einem solchen Objekt ja einmal alle Attribute ausgeben lassen, mit get_object_vars oder var_dump, var_export, print_r). Da wäre es bspw. bei einem ResultSet sinnvoller (und effektiver), sich das Ergebnis erst aus dem Objekt zu ziehen und dieses (z.B. in einem Array oder einem eigenen Objekt) in der Session zu speichern.

0
platofan23 
Fragesteller
 30.11.2019, 00:11
@regex9

und wie übergebe ich am besten die Connection an andere Dateien? über include?

0
regex9  30.11.2019, 05:12
@platofan23

Für die Übergabe an andere Dateien benötigst du so und so einen Include. Die Connection könnte dann über eine Variable weitergetragen werden, die global ist.

<?php
  include "connection.php";

  $connector->query("...");
?>

(In connection.php wird der $connector definiert).

Über einen Request hinweg würdest du das Verbindungsobjekt aber nicht im Speicher halten, sondern stattdessen bei jedem Request eine neue Verbindung zur Datenbank aufbauen.

1

Steht doch da: es werden Parameter im falschen Format übergeben. Parameter 1 soll mysqli sein, ist aber string; Parameter 2 soll string sein, ist aber object.

platofan23 
Fragesteller
 25.11.2019, 21:45

ja das weiß ich ja selbst, aber nicht wodurch der String in etwas anders gewandelt sein sollte...

0
platofan23 
Fragesteller
 25.11.2019, 22:17
@CrEdo85wiederDa

Also im Login register. Im Prinzip validiere ich damit die Eingabe und dann geht das weiter bei validateform Datenbank

0