Aufruf einer Datenbankverbindung - mysqli und mysql

oeko

Mitglied
Hallo,

ich stehe auf dem Schlauch und würde mich freuen, wenn mir jemand auf die Sprünge helfen könnte.

Ich nutze folgende Funktionen, um eine Datenbankverbindung herzustellen.

PHP:
function connect() 
{ 
require_once("xyz/pw.php");  
$con= mysql_connect($mysqlihost, $mysqliuser, $mysqlipasswd) or die(mysql_error()); 
mysql_select_db($mysqlidb,$con) or die(mysql_error()); 
}

function logged_in() 
{ 
    $sql="SELECT InsiID 
    FROM un_insi 
    WHERE InserentenSess='".session_id()."' AND InserentenIP='".$_SESSION["IP"]."' 
    LIMIT 1"; 
    $result= mysql_query($sql);
    return ( mysql_num_rows($result)==1); 

}

Ich kann problemlos logged_in() aufrufen. Sobald ich allerdings den Code umschreibe und die mysqli Klasse statt der mysql Klasse verwende, erhalte ich die Fehlermeldung "Call to a member function query() on a non-object". Nun habe ich auf einer Seite gelesen, dass Variablen innerhalb von Funktionen nicht zur Verfügung stehen, wenn Sie nicht explizit übergeben werden, die Nutzung von global allerdings vermieden werden soll. Allerdings klappt der Aufruf ja, solange ich die mysql Klasse verwende.

Viele Grüße
oeko
 
Moin,

gerne:

PHP:
function connect() {
require_once("xyz/pw.php"); 
$mysqli=new mysqli($mysqlihost, $mysqliuser, $mysqlipasswd, $mysqlidb);
if(mysqli_connect_errno()) {
echo "Problem beim Verbindungsaufbau\n";
echo "", mysqli_connect_error(), "\n";
exit();
}
}


function logged_in() 
{ 
    $result=$mysqli->query("SELECT InsiID FROM un_insi WHERE   InserentenSess='122' AND InserentenIP='3423423' LIMIT 1"); 
      return ( $result->num_rows==1); 
}

Füge ich die Konnektierung der Datenbank direkt in die Funktion logged_in() ein, erhalte ich keine Fehlermeldung mehr...vermutlich aber nur einer blöder Fehler meinerseits?:(
 
Hallo,

wie du weiter oben schon richtig geschrieben hast:
[...] Nun habe ich auf einer Seite gelesen, dass Variablen innerhalb von Funktionen nicht zur Verfügung stehen, wenn Sie nicht explizit übergeben werden [...]

Übergib die Datenbankverbindung als Parameter oder speichere sie global.

Gruß
BK
 
Klar, $mysqli ist in der Funktion logged_in() nicht bekannt. Mach es einfach so, das du bei connect() die Variable $mysqli zurückgibst und anschliessend logged_in() übergibst!

PHP:
function connect() {
require_once("xyz/pw.php"); 
$mysqli=new mysqli($mysqlihost, $mysqliuser, $mysqlipasswd, $mysqlidb);
if(mysqli_connect_errno()) {
echo "Problem beim Verbindungsaufbau\n";
echo "", mysqli_connect_error(), "\n";
exit();
}

return $mysqli;
}


function logged_in($connection) 
{ 
    $result=$connection->query("SELECT InsiID FROM un_insi WHERE   InserentenSess='122' AND InserentenIP='3423423' LIMIT 1"); 
      return ( $result->num_rows==1); 
}

Gruß
 
Das Problem ist schon die unbekannte Variable $mysqli.

Das Sinnvollste und der gebräuchliche Weg wäre die Verwendung einer eigenen Klasse, wo du deine Funktionen als Methoden verwendest(connect() wäre da als Konstruktor sinnvoll).

$mysqli könntest du dann als Klassenvariable nutzen, und somit aus allen Methoden der Klasse problemlos darauf zugreifen.:)
 
Okay, danke für Eure Rückmeldungen. Werde Eure Anregungen annehmen und meine Lösung hier der Vollständigkeit halber posten. Allerdings frage ich mich warum es im ersten Beispiel funktioniert und im zweiten nicht mehr. Wo ist der Unterschied zwischen der Verwendung von mysql und mysqli in dem genannten Fall?
 
MySQL Funktionen benötigen keine explizite Verbindungsangabe. Solange eine Verbindung im Hintergrund besteht, sind sie glücklich und nutzen diese. Erst wenn du den zweiten optionalen Parameter verwendest hättest, wäre der gleiche Fehler aufgetreten.
 
Schau mal im Handbuch, da gibt es bei mysqli immer 2 Beispiele, 1x für den prozeduralen Stil, und 1x für den objektorientierten Stil.

Für eine 1:1 -Übersetzung deiner mysql-Variante hättest du den prozeduralen Stil umsetzen müssen, da wird nicht mit den Methoden eines mysqli-Objektes gearbeitet, sondern eine offene Datenbankverbindung(falls vorhanden) genutzt.
 
Zurück