Letzte ID ermitteln Fatal Error

cola1

Mitglied
Hi,

kann mir jemand sagen warum folgende Fehlermeldung erscheint, wenn ich versuche die letzte ID einer Spalte zu ermitteln?

Code:
Fatal error: Call to a member function fetch_object() on a non-object in /web/.../.../character_creation.inc.php on line 85

PHP:
function getLastCharacterID() {
	global $db;
    
    $sql    =   "
                SELECT 
                    characterID
                FROM
                    characters
                ORDER BY DESC LIMIT 1
                ";
	$result = $db->query($sql);
    $row    = $result->fetch_object();
    
    return $row->characterID;
}

$characterID = getLastCharacterID();

Der Fehler kommt auch nur bei folgendem Aufruf:
PHP:
echo getLastCharacterID();

Mich wundert das, da diese Abfrage etwas anders an einer anderen Stelle funktioniert.
 
Und du bist dir sicher das diese Abfrage funktioniert?

Wenn du die Fehlerausgabe aktivieren würdest, dann würde schon ein MySQL-Fehler angezeigt werden.

PHP:
$db->query($sql) or die(mysql_error());

Dir fehlt ein Spalten-Namen nach dem ORDER BY
 
Wenn du Autoincrement verwendest bei dieser Tabelle, also fortlaufende IDs hast, dann funktioniert folgendes auch:

SQL:
SELECT max(characterID) AS last_id FROM characters

du kannst dann die maximale ID mit "last_id" ansprechen.

Gruß
 
Das MAX() ist due schönste Methode.

Und wenn du mit ORDER BY arbeiten musst, dann solltest du auch angeben nach was du sortieren willst
SQL:
-- geht natürlich nicht:
ORDER BY DESC

-- so geht es:
ORDER BY characterID  DESC
 
Zuletzt bearbeitet von einem Moderator:
Wenn du die Fehlerausgabe aktivieren würdest, dann würde schon ein MySQL-Fehler angezeigt werden.

Daran denke ich meistens nicht bzw. denke ich, dass kritische Fehler angezeigt werden wenn sie auftauchen? Ist das falsch?

Es wäre hilfreich, dann man die Fehlerausgabe vielleicht in der config.php "allgemein einfügen" könnte. Geht das? Oder muss es wie bei dir hinter jeder Query?

PHP:
<?php
/***********************************
 * Easily conntect to the database *
 ***********************************/

$db_server = 'abc';
$db_user   = 'abc';
$db_pass   = 'abc';
$db_name   = 'abc';

$db = new mysqli($db_server, $db_user, $db_pass, $db_name);

if(mysqli_connect_errno()) {
    die ('Konnte keine Verbindung zur Datenbank aufbauen: '.mysqli_connect_error().'('.mysqli_connect_errno().')');
}

$salt = 'abc';
?>
 
Da du MySQLi verwendest, müsste das hinter jeden Query. Du kannst dir auch eine eigene Klasse schreiben welches die Query-Methode von MySQLi implementiert und deine eigene Query-Methode bauen. Dort könntest du dann die Fehlerausgabe direkt in die Methode packen wenn der Query fehlschlägt.

Da es kein PHP-Fehler ist, wird der Fehler auch nicht automatisch angezeigt.
 
Da es mich selbst interessiert hat, hab ich dir mal ne Klasse geschrieben welche dies so beinhaltet:

mydb.php:
PHP:
<?php

class MySQLi_Exception extends Exception {}

class MySQLi_ConnectionException extends MySQLi_Exception {}

class MySQLi_QueryException extends MySQLi_Exception {}

class My_MySQLi extends MySQLi
{
	public function __construct($db_server, $db_user, $db_pass, $db_name, $port = 3306, $socket = '')
	{
		parent::__construct($db_server, $db_user, $db_pass, $db_name, $port, $socket);
		
		
		if($this->connect_error)
		{
			echo "<pre>";
			throw new MySQLi_ConnectionException(mysqli_connect_error(),mysqli_connect_errno());
			echo "</pre>";
		}
	}
	
	public function query($query, $resultmode = null)
	{
		$result = parent::query($query,$resultmode);
		
		if($this->error)
		{
			echo "<pre>";
			throw new MySQLi_QueryException($this->error, $this->errno);
			echo "</pre>";
		}
		
		return $result;
	}
}

config.php:
PHP:
<?php
/***********************************
 * Easily conntect to the database *
 ***********************************/
require_once 'mydb.php';

$db_server = 'abc';
$db_user   = 'abc';
$db_pass   = 'abc';
$db_name   = 'abc';

$db = new My_MySQLi($db_server, $db_user, $db_pass, $db_name);


$salt = 'abc';
?>

und dann kannste es dir mit deiner fehlerhaften Funktion noch testen:

PHP:
function getLastCharacterID() {
    global $db;
    
    $sql    =   "
                SELECT 
                    characterID
                FROM
                    characters
                ORDER BY DESC LIMIT 1
                ";
    $result = $db->query($sql);
    $row    = $result->fetch_object();
    
    return $row->characterID;
}

$characterID = getLastCharacterID();
 
Zurück