• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

alte mySQL auf mySQLi umstellen - Prblem mit einer Function

dertypdernixkan

New member
Morgen

ich bin dabei alte Projekte von mySQL auf mySQLi umzustellen. Dabei gibt es aber ein Problem das ich nicht so recht verstehe.

der alte Code
PHP:
function connect() {
  $con = mysql_connect('localhost', 'root', 'passwort') OR exit(mysql_error());
  mysql_select_db('datenbank', $con) OR exit(mysql_error());
}

dann folgen noch ein paar Befehle die für dieses Problem unwichtig sind, geht sowohl als auch nicht mit den Befehlen...

Am Ende der Datei erfolgt der Aufruf mit connect();. Das funktioniert in mySQL wunderbar. Schreibe ich das nun auf mySQLi um

PHP:
$host = 'localhost';
$user = 'root';
$pass = 'passwort';
$db   = 'datenbank';

function connect() {

  $con = new mysqli($host, $user, $pass);
  mysqli_select_db($db, $con);
}

funktioniert es nicht. nur wenn ich "function connect()" weglasse und stattdessen

PHP:
$host = 'localhost';
$user = 'root';
$pass = 'passwort';
$db   = 'datenbank';
$con = new mysqli($host, $user, $pass, $db);

schreibe geht es. Kann mir jemand sagen wie es aussehen muss damit ich die Funktion so weiter nutzen kann, nur eben als mySQLi?
 
Deswegen sollte man beim Entwickeln in PHP auf jeden Fall alle Fehlermeldungen/Warnungen/Nachrichten einschalten. Dann hättest du nämlich sofort gesehen, dass es nicht an mysql -> mysqli liegt, sondern daran, dass in PHP der Scope anders aufgebaut ist als bei JS. Globale Variablen sind nicht automatisch im Scope einer Funktion enthalten, sondern müssen dort extra mit der "globale" Direktive eingebunden werden, was ich aber nicht machen würde, sondern die Werte als Parameter an die Funktion übergeben würde.
 
Wieso setzt du eigentlich nicht gleich auf PDO? Ist zukunftsweisend, bietet Unterstützung für sehr viele Datenbanken, und du brauchst Eingabewerte von Usern bei Prepared Statements nicht einmal mehr escapen...
 
dafür hat PDO automatisches Error handling.
...außerdem hat es wie gesagt Treiber für etliche Datenbanken. Und warum sollte man, wenn man seine Projekte umbaut, nicht gleich auf das neueste setzen? Wer weiß, wann mysqli schon als deprecated gilt...
 
mysqli wird’s schon noch recht lange geben. schließlich kann man damit irgendwelche sehr MySQL-spezifischen Sachen machen, für die PDO gar nicht gedacht ist.
 
Ich verwende auch PDO, da es flexibler ist... wollte nur darauf hinweisen, dass mysqli prepared statements auch hat...
 
Hallo zusammen,

Code:
// Möglichkeit 1 ...

// config.inc.php etc. (jedenfalls extern bzw. zentralisiert)
// globale Konstanten anlegen ...
define('CONST__DBhost', 'localhost');
define('CONST__DBuser', 'root');
define('CONST__DBpw', 	'passwort');
define('CONST__DBdb', 	'datenbank');

// in der Seite mit der Abfrage ...
include("config.inc.php");

function connect(){
	$con = new mysqli(CONST__DBhost, CONST__DBuser, CONST__DBuser);
	if($con !== false){
		mysqli_select_db(CONST__DBdb, $con);
	} else {
		exit("Tilt");
	}
}

connect();

// ENDE Möglichkeit 1 ...

Code:
// Möglichkeit 2 ...

$host = 'localhost';
$user = 'root';
$pass = 'passwort';
$db   = 'datenbank';

function connect($host, $user, $pass, $db){
	$con = new mysqli($host, $user, $pass);
	if($con !== false){
		mysqli_select_db($db, $con);
	} else {
		exit("Tilt");
	}
}

connect($host, $user, $pass, $db); // Übergabe Deiner Config an die Funktion

// ENDE Möglichkeit 2 ...

Code:
// Möglichkeit 3 ...

$host = 'localhost';
$user = 'root';
$pass = 'passwort';
$db   = 'datenbank';

function connect(){
	global $host, $user, $pass, $db;
	
	$con = new mysqli($host, $user, $pass);
	if($con !== false){
		mysqli_select_db($db, $con);
	} else {
		exit("Tilt");
	}
}

connect();

// ENDE Möglichkeit 3 ...

Wenn Du den eingeschlagenen Weg weiterhin beschreitest, empfehle ich Möglichkeit 1 - also mind. zentralisierte Konfiguration, damit Du bei späteren Änderungen nicht jede Seite manuell editieren musst (aber u. U. ist das in Deinem Projekt bereits gegeben; das sieht man nicht und soll daher zumindest erwähnt sein).

Der Weg über OOP (mit Klassenkonstanten; nicht mehr im globalen Scope angelegt) und Steuerung der Kommunikation mit Deiner Datenbank "objektorientiert" wäre aber sinniger ... das wäre Möglichkeit 4, sprengt aber u. U. den Rahmen bzw. den Kenntnisstand des TO zu PHP.

Die Verwendung von Möglichkeit 3 halte ich für "schlecht" - zwar ist es bequem, den globalen Namensraum zu verwenden, allerdings sind die Namen Deiner Variablen "schwach" und an anderer Stelle womöglich zügig wie "aus Versehen" überschrieben (bspw. bei Passwortänderungen seitens User o. ä.).

Rechtlich: Wer Rechtschreibfehler findet oder bemängelt, kann diese behalten oder gewinnbringend wie meistbietend auf bekannten, deutschsprachigen Auktionshäusern verkaufen! ;)

Viele Grüße
 
Ich würde Möglichkeit 2 empfehlen. Ist viel flexibler und bemüht nicht den globalen Namespace (Konstanten sind auch einfach nur globale Variablen, die man nicht ändern und denen man nur bestimmte Werte zuordnen kann).

Es kann ja durchaus mal passieren, dass man Verbindungen zu zwei verschiedenen Servern und/oder Datenbanken aufbauen will.

PS: mysqli_... Funktionen halte ich ja für komplett überflüssig. Wenn man schon mysqli verwendet, sollte man auch über den OO-Weg gehen und die Instanzmethoden verwenden (hier also $con->select_db()).
 
noch zwei Anmerkungen zu obigem Code:
- new mysqli() gibt immer eine mysqli-Instanz zurück, auch wenn die Verbindung fehlschlägt, daher immer mit mysqli::connect_error prüfen.
- warum mysqli::select_db() verwenden, wenn man den Datenbanknamen doch gleich mysqli() übergeben kann?
 
@kkapsner: Es kann auch passieren, dass dem TO die Datenbank wegstirbt und man ein Backup haben sollte etc. Mit den Konstanten hast Du völlig recht, aber gem. "Vorgabe" gehe ich eher von mehreren Seiten aus und da langt die globale Konstante (Möglichkeit 4: CONST und OOP - erwähnte ich und sollte er ja, wenn ich denn wüsste, wie weit er mit dem Lernen ist [auch nur ein Eindruck]).

:D

Ein schönes WE wünsche ich euch ... möge die Sonne endlich mal beweisen, dass ein Sommer kommt!
 
Zurück
Oben