• Hallo liebe Userinnen und User,

    nach bereits längeren Planungen und Vorbereitungen sind wir nun von vBulletin auf Xenforo umgestiegen. Die Umstellung musste leider aufgrund der Serverprobleme der letzten Tage notgedrungen vorverlegt werden. Das neue Forum ist soweit voll funktionsfähig, allerdings sind noch nicht alle der gewohnten Funktionen vorhanden. Nach Möglichkeit werden wir sie in den nächsten Wochen nachrüsten. Dafür sollte es nun einige der Probleme lösen, die wir in den letzten Tagen, Wochen und Monaten hatten. Auch der Server ist nun potenter als bei unserem alten Hoster, wodurch wir nun langfristig den Tank mit Bytes vollgetankt haben.

    Anfangs mag die neue Boardsoftware etwas ungewohnt sein, aber man findet sich recht schnell ein. Wir wissen, dass ihr alle Gewohnheitstiere seid, aber gebt dem neuen Board eine Chance.
    Sollte etwas der neuen oder auch gewohnten Funktionen unklar sein, könnt ihr den "Wo issn da der Button zu"-Thread im Feedback nutzen. Bugs meldet ihr bitte im Bugtracker, es wird sicher welche geben die uns noch nicht aufgefallen sind. Ich werde das dann versuchen, halbwegs im Startbeitrag übersichtlich zu halten, was an Arbeit noch aussteht.

    Neu ist, dass die Boardsoftware deutlich besser für Mobiltelefone und diverse Endgeräte geeignet ist und nun auch im mobilen Style alle Funktionen verfügbar sind. Am Desktop findet ihr oben rechts sowohl den Umschalter zwischen hellem und dunklem Style. Am Handy ist der Hell-/Dunkelschalter am Ende der Seite. Damit sollte zukünftig jeder sein Board so konfigurieren können, wie es ihm am liebsten ist.


    Die restlichen Funktionen sollten eigentlich soweit wie gewohnt funktionieren. Einfach mal ein wenig damit spielen oder bei Unklarheiten im Thread nachfragen. Viel Spaß im ngb 2.0.

[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.
 

Rakorium-M

NGBler

Registriert
14 Juli 2013
Beiträge
413
Gib mal den Rest von deinem Code, insbesondere woher [kw]$db_connect[/kw] kommt. Die Fehlermeldung legt nahe, dass da mehrere APIs gemischt werden.
 

Cyperfriend

Der ohne Avatar

Registriert
14 Juli 2013
Beiträge
1.123
  • 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]
 

Rakorium-M

NGBler

Registriert
14 Juli 2013
Beiträge
413
PDO ist erstmal ne gute Idee (besser als mysqli), allerdings müsst ihr dann auch PDO zum escapen verwenden - PDO::quote() 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:

Cyperfriend

Der ohne Avatar

Registriert
14 Juli 2013
Beiträge
1.123
  • 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.
 

Rakorium-M

NGBler

Registriert
14 Juli 2013
Beiträge
413
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.
 

Cyperfriend

Der ohne Avatar

Registriert
14 Juli 2013
Beiträge
1.123
  • 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:

braegler

Aktiver NGBler

Registriert
14 Juli 2013
Beiträge
896
Für die Trennung zwischen php und Anzeige kann ich Dir nur die Templateengine Smarty empfehlen (https://github.com/smarty-php/smarty)
Ist echt einfach zu bedienen und bietet unfassbar viele Möglichkeiten. Die aktuelle Version auf Github sollte php8 tauglich sein.
 

musv

Bekannter NGBler

Registriert
15 Juli 2013
Beiträge
3.453
Ort
/dev/null
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 Prepared Statements 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.
Hier 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.
 

braegler

Aktiver NGBler

Registriert
14 Juli 2013
Beiträge
896
Für die MySQL Anbindung verwende ich eigentlich nur noch MeekroDB (https://meekro.com/)
Ist ein netter Wrapper für mysqli, kann ich nur wärmstens empfehlen.
 
Oben