Probleme mit mysql(i) Erweiterung

Don Stefano

Erfahrenes Mitglied
Hallo zusammen,

die Probleme beim Versuch mein PHP-Projekt auf den Servern vonhttp://all-inkl.com/ zum Laufen zu bringen, sind offensichtlich (bis auf eines) dadurch gelöst, dass ich nun auf einen Server mit PHP 5 und MySql 4.1 umgezogen bin.

Vielen Dank für eure Hilfe!

Trotzdem bleibt folgendes Problem (was ich auch erwartet habe). Ich verwende nämlich die in PHP 5 neu hinzugekommene mysqli Erweiterung um mit der Datenbank zu kommunzieren.

Also erhielt ich folgende Fehlermeldung:

Code:
Fatal error:  Class 'mysqli' not found in /www/htdocs/w0055c8a/xmysqli.php on line 3

Hier der kurze Code der zugehörigen Datei:

PHP:
          <?php
          
          class xmysqli extends mysqli {
          
          	const host	= "localhost";
          	const user	= "MeinUsername";
          	const passwd  = "MeinPasswort";
          	const mydb	= "NameDerDatenbank";
          
          	  function __construct()
          	  {
 		 parent::__construct(self::host, self::user, self::passwd, self::mydb); 
          	  }
          	
          	function echoquery($query)
          	{
          		echo "<p>$query</p>";
          		$result = $this->query($query);
          		if ($this->errno) 
          		{
          			echo($this->error);
          			return NULL;
          		}
          		
          		echo '<table border cellpadding="5"><tr>';
          		echo '<th>[Nr]</th>';
          		while ($field = $result->fetch_field())
          			echo "<th>$field->name</th>";
          		echo "</tr>";
          		$rec = 0;
          		while ($row = $result->fetch_row())
          		{
    			echo "<tr><td>$rec</td>"; $rec++;
    			for ($i = 0; $i < $result->field_count; $i++)
 		 	echo "<td>".htmlentities($row[$i])."&nbsp;</td>";
          			echo "</tr>\n";
          		}
          		echo "</table>";
          		$result->close();
          		return TRUE;
          	}
          }
          ?>

Ich dachte mir, es wird wohl daran liegen, dass diese Erweiterung in der php.ini bei meinem Hoster nicht aktiviert ist (oder wo immer das zu tun ist). Also habe ich meine Skripte "heruntergegradet" und die alte mysql-Erweiterung verwendet.

Dies habe ich einfach so gemacht, dass ich bei allen Befehlen (z.B: "mysqli_num_rows" oder "mysqli_errno") das "i" weggelassen habe. (Also z.B. "mysql_num_rows").

Im obigen Code habe ich also nur "extends mysql" eingetragen. Die Klasse heißt weiterhin "xmysqli" (was ja egal sein müsste).

Meines Wissens nach ist dies der einzige Unterschied beim verwenden der beiden Erweiterungen. Stimmt dies so?

Jedenfalls war ich dann doch sehr überrascht, als nachdem Ändern folgende Fehlermeldung erschien:

Code:
Fatal error:  Class 'mysql' not found in /www/htdocs/w0055c8a/xmysqli.php on line 3

Daraus ergeben sich für mich 2 Fragen:

1. Liegt der Fehler daran, dass in dem obigen Skript (den Code könnt ihr ja sehen) nun ein Fehler ist, so dass es mit mysql nicht läuft, vorher aber mit mysqli lief (auf meinen XAMP System)?
2. oder sind schlichtweg seitens meines Hosters beide Erweiterungen nicht aktiviert?

Was ist also zu tun, damit diese Fehlermedlungen ausbleiben und ich wieder meine Datenbank erreiche? Oder gibt es gar noch eine zusätzliche Erweiterung, die ich verwenden muss?

Herzlichen Dank für jede HIlfe
 
Hi,

soweit ich das beurteilen kann, gibt es in php keine Klssen die MySql oder MySqli heißen. Es gibt lediglich Erweiterungen, die Funktionen mit diesem Prefix anbieten.
Wenn also Dein Hoster eine MySql-Erweiterung zur Verfügung stellt, so hast Du Zugriff auf die Funktionen die von dieser Erweiterung zur Verfügung gestellt werden.

Du müsstest also deinen Code so schreiben:

PHP:
class xmysqli{
    .... 
    .... 
    function query($sql){
       return mysql_query($sql);
    }
    .... 
    .... 
}


Falls es dennoch solche Klassen, wie von Dir beschrieben wurde gibt, lass ich mich gerne eines besseren belehren.

Marcus.
 
Danke für den Tip, aber ich verstehe leider nur Bahnhof.

Vielleicht muss ich auch noch mal besser erklären was diese Datei "xmysqli.php", deren Code ihr oben sehen könnt tut. Leider ist das die einzige Datei in meinen Skripten, die ich eigentlich auch selbst nicht richtig verstehe (da dies für Einsteiger in dem Buch leider unzulänglich erklärt wurde).

Jedenfalls wird diese Datei auf allen Seiten meiner Skripte includet, wo ich mit der Datenbank kommuniziere. und zwar so:

PHP:
require_once("xmysqli.php");
       $db = new xmysqli();

Danach stelle ich dann die Datanbankverbindung z.B. wie folgt her:

PHP:
$result = $db->query("select * from tabelle where userid='$userid'");

Wie schon erwähnt lief das auf meinen XAMP System immer ohne Probleme. Doch nun steht mir die Erweiterung mysqli nicht mehr zur Verfügung.

Und mit der Abänderung des obigen Codes (mysqli durch mysql ersetzt) geht es eben leider auch nicht.

Ich weiß nun einfach nicht, wie ich diesen Code ändern muss, damit er die mysql Erweiterung verwendet und ich mich trotzdem weiterhin mit
PHP:
require_once("xmysqli.php");
        $db = new xmysqli();
      $result = $db->query("select * from tabelle where userid='$userid'");
in meine Datenbank einwählen kann.


Ist vielleicht jemand von euch in der Lage, den obigen Code (der Datei xmysqli.php) so umzuschreiben, dass dies möglich ist?

Der Support meines Hosters konnte mir leider auch nicht weiterhelfen. Der hat nur geschrieben "Das Schlüsselwort extends bedeutet das die Klasse die dahinter angegeben wird vorhanden sein muss und erweitert wird.

Ich habe Ihren Code einmal beispielhaft geändert, was nur zum demonstrieren gedacht ist, aber im Grunde keine sinnvolle Sequenz darstellt:"

PHP:
class mysql {
   
   function tue_nichts(){
   
   	return 0;
   	}
   }

Leider hilft mir das aber auch nicht im geringsten weiter.

Ich weiß wirklich nicht, was ich jetzt machen muss, damit es weiterhin möglich ist mich so kompfortabel wie bislang mit der Datenbank zu verbinden. Und ich weiß auch nicht, wie ich es sonst machen könnte.

Dankeschön
 
Hi,

also das Problem ist das folgende.

Deine Klasse xmysqli erweitert die Klasse mysqli.
Das heißt deine Klasse erbt von der Klasse mysqli.Damit Sie erben kann, muss PHP diese Klasse kennen. Genau das ist aber nicht der Fall. Ich weiß nicht wie XAMPP das eigentlich macht. Aber irgendwo auf Deinem Rechner muss eine Datei rumliegen, in der die Klasse mysqli definiert ist. Diese Datei wird wahrscheinlich mysqli.php heißen. Diese must Du nun zusammen mit Deinen anderen PHP-Dateien auf den Webserver Deines Hosters kopieren und in Deiner Klasse musst Du diese includen/requiren, damit PHP diese Datei kennt.
XAMPP macht das auf Deinem Rechner anscheinend irgendwie automatisch, aber das PHP auf dem Webserver Deines Hosters kennt diese Klasse einfach nicht.

PHP:
require_once('mysqli.php');

class xmysqli extends mysqli {
...
...
}

Ich hoffe ich konnte ein bischen Licht ins Dunkel bringen.

Marcus
 
Hallo Markus,

danke für den Tip. Nur unterstützt mein Webserver leider die Erweiterung mysqli nicht. Diese Erweiterung müßte aber mit php kompiliert werden (was nicht der Fall ist) damit es funktioniert.

Auf meinem XAMP System existiert tatsächlich eine Datei mysqli.php und eine Datei mysqli.dbi.lib.php. Außerdem eine php_mysqli.dll und libmysqli.dll.

Nur wird mir das eben alles nichts nützen, weil ich es auf dem Webserver nicht verwenden kann.

Ich muss also auf mysqli verzichten und mysql verwenden. Nur wenn ich die oben abgebildete Datei eben auf mysql umschreibe, geht es auch nicht.

Der Support schrieb mir heute noch einmal:

"class xmysqli extends mysql

bedeutet das xmysqli angelegt wird aber Bezug auf die vorher existente Klasse mysql nimmt, welche es in Ihrem Script ja nicht gab. Mit Objektorientierter Programmierung kennen wir uns auch nicht sehr gut aus.

Hinzufügen muss ich noch, dass das Script trotzdem nicht 100% funktioneren könnte nur wenn man mysqli zu mysql ersetzt, da eventuell diverse subroutinen die fehlenden Möglichkeiten von mysqli Resultaten vorraussetzen."

Daher eben meine Frage ob jemand weiß, wie ich die obige Datei stattdessen umschreiben muss OHNE mysqli zu verwenden oder irgendwelche Subroutinen davon.
 
Ich glaube ich habe das Problem inzwischen halbwegs verstanden. Es scheint also für die Erweiterung mysqli eine Klasse zu existieren (vermutlich aus diesem Lehrbuch), die den gleichen Namen trägt.

Nur kann ich diese eben nicht nutzen, da sie Funktionen der mysqli Erweiterungen anwendet, die mir auf dem Server nicht zur Verfügung stehen.

Ich muss das ganze also mit einer mysql basierten Klasse realisieren, die ich nicht habe und dann wohl selbst schreiben muss (wozu ich mich nicht in der Lage sehe).

Existiert also irgendwo eine solche Klasse, die ich verwenden kann (darf), oder die mir hier jemand zur Verfügung stellt?

Oder nach welchem Suchbegriff müßte ich da suchen? Datenbankklasse?
 
DIe Erweiterung MYSQLI liegt als php_mysqli.dll im /php/ext Ordner.

Natürlich nur wenn dieser fresh ist.

In der php.ini sollte man auf folgende Werte achten:


extension_dir = ?:\\php\ext\ //muss auf deine Extension zeigen

-------------------------------------------------------------------------
Auszug aus meiner php.ini

extension=php_mssql.dll
;extension=php_msql.dll
extension=php_mysql.dll // sowieso aktiv...
extension=php_mysqli.dll // musste ich eintragen, natürlich ohne Semikolon
;extension=php_netools.dll
;extension=php_ntuser.dll

:p

Greetz Markus
 
Zurück