[PHP 8] Probleme mit mysqli_real_escape_string()

Cyperfriend

Der ohne Avatar
Registriert
14 Juli 2013
Beiträge
1.123
Wir haben unser Webhostingpaket bei Ionos (1und1) und dort kann man bereits PHP 8 als Beta auswählen.
Da ich gerade an einem Projekt arbeite und es direkt PHP 8-Kompatibel haben will, habe ich das entsprechend eingestellt.

Folgender Code, der unter PHP 7.4 funktioniert, macht unter PHP 8 Beta Probleme:
[src=php]
[...]
# Prüfen, ob der Benutzername bereits angelegt wurde
$db_read = "select * from db_benutzer where benutzername='".mysqli_real_escape_string($db_connect, $_POST['Benutzername'])."'";
$db_result = $db_connect->query($db_read);
# Falls ein Eintrag gefunden wurde, Vorgang abbrechen
if(mysqli_num_rows($db_result) >= 1){
# Code 21 = "Diesen Benutzer gibt es bereits"
$_SESSION['code'] = 21;
header("Location: http://".$_SERVER['HTTP_HOST']."/settings/users/show.php"); exit;
[...][/src]

Fehlermeldung:
Fatal error: Uncaught TypeError: mysqli_real_escape_string(): Argument #1 ($mysql) must be of type mysqli, PDO given in /homepages/...

Kann mir jemand sagen, was ich ändern muss, bzw. wie der Code korrekt auszusehen hat?
Ich bevorzuge den prozeduralen Stil.
 
Gib mal den Rest von deinem Code, insbesondere woher [kw]$db_connect[/kw] kommt. Die Fehlermeldung legt nahe, dass da mehrere APIs gemischt werden.
 
  • Thread Starter Thread Starter
  • #3
Der Datenbankaufbau erfolgt über PDO. Keine gute Idee?
[src=php]
<?php
# Datenbankinformationen
function db_connect() {
return new PDO(
'mysql:dbname=*****;host=*****',
'*****',
'*****',
[PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"]
);
}
?>
[/src]
 
PDO ist erstmal ne gute Idee (besser als mysqli), allerdings müsst ihr dann auch PDO zum escapen verwenden - wäre die richtige Funktion:
[src=php]$db_read = "select * from db_benutzer where benutzername = " . $db_connect->quote($db_connect, $_POST['Benutzername']);[/src]
[kw]mysqli_num_rows[/kw] wird dann aber auch nicht funktionieren.

Wenn ihr aber eh schon PDO benutzt könnt ihr auch gleich damit eure Queries zusammenbauen - mit Prepared Statements passieren auch keine versehentlichen SQL-Injections. Ist nicht nur sicherer, sondern auch deutlich moderner und portabler. Der Code wäre beispielsweise:
[src=php]
$stmt = $db_connect->prepare('select * from db_benutzer where benutzername = :username'); // Hier nur die Anfrage, :username etc wird später ersetzt
$stmt->execute([':username' => $_POST['Benutzername']]); // Der Wert von :username soll aus $_POST kommen
$daten = $stmt->fetchAll(); // Hier kommen deine Daten raus
[/src]
 
Zuletzt bearbeitet:
  • Thread Starter Thread Starter
  • #5
Eigentlich wollte ich schon beim prozeduralen Stil bleiben. Komme ich besser mit zurecht. Objektorientiert war und ist nicht so mein Ding.
 
Dann musst du die Verbindung auch mit mysqli aufmachen - mysqli-Verbindungen und PDO sind nicht kompatibel. Wundert mich ehrlich gesagt, dass das in PHP 7 funktioniert haben soll.

Auch wenn ich dir wirklich empfehlen würde bei PDO zu bleiben - damit bleibt deine Anwendung deutlich portabler. Sicherer und moderner ist's auch noch, weil dir keine kaputten Encoding-Einstellungen am Server was reinreißen können. Viel mehr objektorientiert als meine 3 Beispielzeilen wird's nicht. Prepare, execute, fetchAll und gut ist. Funktioniert am Ende aber mit mysqli wohl auch.
 
  • Thread Starter Thread Starter
  • #7
Naja, aber sowas wie "mysqli_num_rows" funktioniert dann schon wieder nicht. Damit gehts ja schon los.
Wie ich die Daten später dann ausgeben kann weis ich auch nicht, zumal ich es leider nicht hinbekomme HTML und PHP sauber zu trennen. Bislang haue ich die Ausgaben immer mittels <?php echo $row['bla']; ?> inmitten des HTML-Codes.
 
Zuletzt bearbeitet:
Für die Trennung zwischen php und Anzeige kann ich Dir nur die Templateengine Smarty empfehlen ( )
Ist echt einfach zu bedienen und bietet unfassbar viele Möglichkeiten. Die aktuelle Version auf Github sollte php8 tauglich sein.
 
Ich bin da zwar schon 15 Jahre raus. Damals hab ich relativ viel PHP mit MySQL programmiert. Die mysql-escape-Methoden empfand ich damals schon als Irrweg und bin davon relativ schnell weggekommen. Genau wie Rakorium-M hab ich damals auf gesetzt. Das ist wesentlich sicherer, eleganter und lesbarer als der Mist mit den Escape-String-Methoden.

PDO kannte ich damals leider noch nicht. Damals buhlten mysql, mysqli und mysql-native um die Gunst der PHP-Coder.
mal ein schöner Vergleich. Insbesondere der Satz ist lustig:
It's somewhat ironic that more experienced PHP developers tend think PDO is the only acceptable option 100% of the time, while beginners tend to use MySQLi. This is absolutely nutty from both ends.
 
Für die MySQL Anbindung verwende ich eigentlich nur noch MeekroDB ( )
Ist ein netter Wrapper für mysqli, kann ich nur wärmstens empfehlen.
 
Zurück
Oben