Fehlermeldung mit MySQLi

Davicito

Erfahrenes Mitglied
Hallo liebe Community,

ich bin gerade damit beschäftigt, meine alten MySQL-Anfragen - prozedural - mit MySQLi OO. umzustellen.
Und es tauchen komische Fehlermeldungen auf und nach langem Googlen gebe ich auf und frage Euch an dieser Stelle was es sein könnte.

alter Code
PHP:
<?php
$connection = mysql_connect('localhost',$user , $pw);
						
mysql_select_db($_SESSION['db'],$connection) 
	OR die('Die Verbindung zur Datenbank schlug fehl: '. mysql_error());
							
/*--------- check only disponent rights -----------*/
$rights = array('select','insert','UPDATE','delete', 'create','drop','reload', 'ALL PRIVILEGES','usage');
		
$info = mysql_query("SHOW GRANTS FOR CURRENT_USER");
$data = mysql_result($info, 0, 0);
		
// Teile $data-Stream in Tokens ein.		
$token = explode(" ", $data);
		
//Zum Speichern aller verfügbaren Benutzerrechte, in eine Session "userRights", wird ein Session-Array angelegt/definiert.		
$_SESSION['userRights'] = array(); 
			
//Prüfe Tokens, ob es sich um ein Userrecht handelt		
foreach($token as $val){
	//Wenn Token mit Komma abschließt, wird mit strtok, das Komma entfernt. 
	$val = strtok($val,',');
			
	/*Durch explode() wird auch die Stringfolge "ALL Privileges" für Adminrechte (Superuser) in zwei
	seperate Tokens gesplittet. Für die Funktionlität im Programm braucht man diese zwei Tokens,
        aber wieder als ein Token*/	
	if(strcasecmp($val, 'all') == 0) 
		$val .= ' privileges';
}
...
?>

Neuer Ansatz der nicht funktioniert.
PHP:
<?php
...
public static function login($host, $bn, $pw, $db)
{				
	self::$resDB = new \mysqli($host, $bn, $pw, 'k&k-psm-'.$db);

	if(self::$resDB && !isset($_SESSION['bn_is_logged'])){ 
		$_SESSION['bn_is_logged'] = true;
		$_SESSION['bn'] = $bn;

       // Aufruf der Methode zum Auslesen des passenden Benutzerrechtes
		self::loadRights();

		return self::$resDB;				
	}else if(self::$resDB->connect_errno){
		throw new \Exception('Verbindung zum DB-Server fehlgeschlagen! ');
	}			
}		
		
private static function loadRights(){		
	$rights = array('select','insert','UPDATE','delete', 'create','drop','reload', 'ALL PRIVILEGES','usage');
		
        $reqRights = "SHOW GRANTS FOR CURRENT_USER";
			
// Statement vorbereiten
	$result = self::$resDB->prepare($reqRights);
	
        // an die DB schicken
	$result->execute();

	$result ->get_result();
	return $result->fetch_row();     
...
?>

Fehlermeldung ist:
PHP:
Fehlerausgabe: "Fatal error: Call to undefined method mysqli_stmt::fetch_row() in C:\..."

Bei mir ist die PHP-Erweiterung und PHP 5.5 enthalten nur weis ich jetzt nicht, warum diese Fehlermeldung auftaucht.
Ich hoffe sehr, Ihr könnt mir da vielleicht weiterhelfen.

LG, Davicito.
 
Zuletzt bearbeitet:
Muss ich villeicht meine Datenbankklasse von der Mysqli-klasse ableiten?

Ich versteh gerade nett, wieso einige Methoden funktionieren und andere werden nicht erkannt

Ich hab mal in meiner php.ini, von der XAMPP-Suite nachgeschaut und festgestellt, dass auch mysql aktiviert ist

php.ini
Code:
...
extension=php_mysqli.dll
...

LG
 
Zuletzt bearbeitet:
$result ist bei dir kein mysqli_result Object, sondern ein mysqli_stmt.

PHP:
$stmt = self::$resDB->prepare($reqRights);
if($stmt>execute()){
    $result = $stmt->get_result();
    //Jetzt ist $result auch ein mysqli_result Object
}

Ps: Jepp, Ableiten ist zwar nicht notwendig, aber in deinem Fall wahrscheinlich schöner

Nachtrag:
Dein Script praucht dort kein Prepared Statement. Drum kannst du das Stmt auch auslassen
PHP:
$result = self::$resDB->query($reqRights);

Nachtrag:
Für die Fehlersuche solcher Probleme.
1) Lass dir das Objekt (in deinem Fall $result) mal mit var_dump() ausgeben. Dann sieht man bereits mal, von welcher Klasse das Objekt ist.

2) Ach php.net in der Doku steht zu jedem Befehl was sein Return-Value für ein Datentyp ist
 
Danke schön Yaslaw,

ich habe gestern abend noch zu einer Lösung gefunden, welches auch gut funktioniert hat ;-).
Mit var_dump() arbeite ich immer sehr gerne und hat mir auch diesmal wieder sehr geholfen, den Fehler zu finden.

Ich hab das mit dem Ableiten weggelassen, da der Interpreter auch ohne klar kommt. Ich wüsste sonst nicht, warum ich es machen sollte!

Mit get_result hatte ich erst auch gearbeitet, aber wahrscheinlich habe ich das an einer falschen Stelle benutzt.

Ja, den Prepare-Statemant brauche ich an dieser Stelle nicht. Ich hatte den aus einem Tutorial mal versucht zu benutzten um zu sehen, ob es auch damit funktionieren könnte. Da ich aber keine Platzhalter in meinen Queryies benutze und diese auch nicht binden muss, kann ich das wahrhaftig auch weglassen.
Ich hab mich aber dennoch so daran gewöhnt und finde es viel schöner, als nur mit nem normalen Query-Statemant zu arbeiten. Ich fühle mich damit viel sicherer! ^^

Mein Code von gestern sieht nun so aus:
PHP:
private static function loadRights(){		
	$rights = array('select','insert','UPDATE','delete', 'create','drop','reload', 'ALL PRIVILEGES','usage');
			
	$reqRights = "SHOW GRANTS FOR CURRENT_USER";
	//self::$resDB->query("SHOW GRANTS FOR CURRENT_USER");
			
	// Statement vorbereiten
	$result = self::$resDB->prepare($reqRights);
	//$result = self::$resDB->query($reqRights);

	// an die DB schicken
	$result->execute();

	// Ergebnis an Variablen binden
	$result->bind_result($testResult);			
	$result->fetch();

	return $testResult;
        ....	
}
 
Zuletzt bearbeitet:
Zurück