Forum
Tipps
News
Menu-Icon

[PHP] Mysql-Klasse

Hi
Ich hab mir ne Klasse geschrieben, aber sie Funktioniert nicht, irgendwo ist ein Fehler,deshalb muss ich alles Posten. Das Auslesen funktioniert nur das Schreiben nicht, ich hoffe ich finde hier Hilfe. Danke



Die eigentliche Klasse

Zitat
class db_mysql
{
   PROTECTED $db_user;
   PROTECTED $db_pass;
   PROTECTED $db_server;
   PROTECTED $insert_id;
   PROTECTED $affected_rows;
   PROTECTED $num_rows;
   PROTECTED STATIC $con;
   PROTECTED STATIC $queries;
   PROTECTED STATIC $verbindungen;

   // Datenbank verbindung herstellen
   PUBLIC function __construct($datenbank)
   {
      //Falls Verbindung noch nicht besteht
      if(!is_resource(self::$con))
         {
         self::$con = mysql_connect($this->db_server,$this->db_user,$this->db_pass) OR die(
      ++self::$verbindungen;
      }
      mysql_select_db($datenbank, self::$con) OR die('Fehler beim Verbinden');
   }
   // Eintrag formatieren
   PUBLIC function prepare($var)
   {
      return mysql_escape_string($var);
   }
   
   // SQL-String ausführen
   PUBLIC function execute($sql)
   {
      ++self::$queries;
      $erg               = mysql_query($sql, self::$con);
      $this->affected_rows    = mysql_affected_rows(self::$con);
      ***********FEHLER*****
$this->num_rows       = mysql_num_rows($erg);
      if($this->num_rows)
      {
         $i=1;
         while($array[$i] = mysql_fetch_assoc($erg)) {++$i;}
         mysql_free_result($erg);
         unset($array[$i]);
         return $array;
      }
   $this->insert_id = mysql_insert_id(self::$con);
   return true;
   }
   
   // kleine Funktionen
   PUBLIC function insert_id()
   {
      return $this->insert_id;
   }
   PUBLIC function affected_rows()
   {
      return $this->affected_rows;
   }
   PUBLIC function num_rows()
   {
      return $this->num_rows;
   }
   PUBLIC function queries()
   {
      return self::$queries;
   }
   PUBLIC function verbindungen()
   {
      return self::$verbindungen;
   }
} //ENDE der Klasse
Die Klasse mit den Daten

Zitat
class db extends db_mysql
{
   PROTECTED $db_user       = 'user';
   PROTECTED $db_pass       = 'pw';
   PROTECTED $db_server    = 'localhost';
   
   PUBLIC function __construct($datenbank = 'poker')
   {
      parent::__construct($datenbank);
   }
}
 

Hier der Code, mit dem ich gerne ne Tabelle füllen wollte also SQL-String + die execute() Funktion

 
Zitat

$db = new db;

$db->execute("INSERT INTO login (name, pw) VALUES('test','pw') ");

echo $db->insert_id();

unset($db);
Zitat
« Letzte Änderung: 14.05.06, 21:03:07 von ludden »

Antworten zu [PHP] Mysql-Klasse:

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Ohh...wo is meine Antwort hin? Hmm...bestimmt der Server oder die Verbindung ma kurz gestreikt  ??? ...also nochma:

Überprüfe mal die Verwendung der Klassenvariablen $insert_id. Da fehlt ab und zu ein "t".

Auch wäre sowas wie eine Fehlermeldung hilfreich.

greez 8)
JoSsiF

stimmt, ne Fehlermeldung , sollte man auch Posten. Also hab jetzt mal noch 1-2 Sachen gefunden, der Code oben wurde aktualisiert
Fehlermeldung angehängt

//EDIT

Es laggt übelst ... stressig :\

« Letzte Änderung: 14.05.06, 18:15:25 von ludden »

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Ich seh leider trotzdem keine Fehlermeldung

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in C:\www\devlop\class\cl_db_mysql.php on line 37


obwohl ichs extra gepostet hab , ist nix angekommen

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

OK, also scheint's an der Query zu liegen.

Mach mal folgendes:
Schreibe mal den Query-String in eine Variable und gib diese zusätzlich aus. Wenn für dich daraus kein Fehler ersichtlich werden sollte, dann poste den String mal.

greez 8)
JoSsiF

$db = new db;
// SQL-String
$sql_qry = "INSERT INTO login(name,pw) VALUES('test','pw');";
// Eintrag vornehmen
$db->execute($sql_qry);
echo $db->insert_id();
unset($db);

// String ausgabe
echo $sql_qry;


bringt aucht nichts :\
-> echo des Strings
INSERT INTO login(name,pw) VALUES('test','pw');

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Hm ok....leuchtet ein. Ist ja nichts besonderes an dem String. Mein Hintergedanke war, dass manchmal solche Queries aus komplexeren Sachverhalten mit x Variablen zusammengebaut werden, und da kann man im Code schonmal einen Fehler übersehen.

Wie sieht's mit der Datenbank aus? Ist die astrein? Ich meine, sind beide Spalten, die du ansprichst, auch Texttypen?

greez 8)
JoSsiF

sind VCHAR(50) und tjo, also auslesen kann ich sie mal ... nur beschreiben nicht, ich guck morgen nochmal drüber weil ich jetzt pennen geh, steht noch ne arbeit an ... n8

//EDIT

Ich hab noch was gefunden ich kann jetzt Einträge schreiben , allerdings bleibt die Fehlermeldung

 Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in C:\www\devlop\class\cl_db_mysql.php on line 37

bestehen, woran könnte das liegen?

« Letzte Änderung: 14.05.06, 22:43:00 von ludden »

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Ein Blick ins PHP-Manual verrät, dass mysql_num_rows() nur für SELECTs gültig ist, nicht jedoch für INSERTs und dergleichen Scherze. mysql_affected_rows() solltest du in solchen Fällen nehmen (hatte ich doch aber vorhin in deinem Quellcode gesehen?!) ... Naja schau's dir mal an, ich durchforste den Code heute nich mehr ;)

greez + n8i 8)
JoSsiF

stimmt, ist klar , dass da ein Fehler kommt :\ naja dann mal wieder ein @ vor mysql_num_rows  und die Sache hat sich erledigt.

danke sofar Ludden

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Keine schöne Lösung, einfach ein @ davorzusetzen. Nur weil eine Fehlermeldung unterdrückt wird, wird der Fehler trotzdem auftreten, soviel ist sicher.

Aber wenn's nicht perfekt sein muss... ;)

greez 8)
JoSsiF

also execute() ist ja für die übermittlung/ausführung der Sql-stings allg. d.h. es kommt auch mal ein select befehl vor,deshalb denk ich ist das @ schon angebracht

//EDIT

wieder maln edit, oder wüsstest du eine andere Lösung?

PS: du bist wohl der einzige, der hier antworten möchte :)

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Hi |

Weiß nicht, ob die anderen nicht antworten möchten ;D

Ich fühle mich aber im Augenblick nicht überfordert ;) Also wenn dir die Hilfe von mir allein reicht, dann können wir ja weitermachen :D

Also die Lösung des Problems mit dem Query-Typ ist eher philosophischer Natur. Für mich macht es nicht viel Sinn, eine MySQL-Klasse zu entwickeln, der ich dann nochmal den gesamten Query-String übergeben muss.
Wenn man schon Sachverhalte und Abläufe in Klassen abstrahiert, dann so, dass sich auch eine Vereinfachung ergibt.
Ich würde UPDATE, INSERT, SELECT etc. in unterschiedliche Methoden auslagern und nur noch Parameter übergeben (z.B. Werte, die aktualisiert werdn sollen), jedoch keine ganzen Queries mehr. Das macht die Sache universeller und leichter wartbar, zumindest bei Standard-Queries.

Falls dich das näher interessiert, kannst du dir z.B. mal ein paar DB-relevante PEAR-Klassen reinziehen und schauen, wie das dort gelöst worden ist.

greez 8)
JoSsiF

nene deine Tipps reichen mir schon ;) ist mir nur gerade aufgefallen, dass wirn Monolog führen

Hm, aber ich stell mir das Recht kompliziert vor , wenn ich sagen wir ne Methode

insert() mach , dann muss ich ja die Tabelle+Spalten und die Inhalte alle mitübergeben also sagen wir so:

Zitat

PUBLIC function insert($tabelle,$spalten,$value)
{
 $sql = "INSERT into ".$tabelle."(".$spalten.") VALUES('".$value."')";
 $erg = mysql_query($sql, self::$con);
}

dann ist die Sache ja gut und schön, allerdings wie muss ich vorgehen, wenn ich mehr als eine Spalten habe, dann muss ich ja $spalten = "spalte1,spalte2,spalte3" angeben oder so insert('login','spalte1,spalte2',$INHALTE_AUS_FORMULAR)
und wenn ich jetzt aus nem Formular zb Name und PW bekomme, dann muss ich ja immmer $INHALTE_AUS_FORMULAR= $name.",".$pw; erstmal formatieren oder? Vlt renn ich auch gerade an die Wand mit meiner Logik


//EDIT

der oben gepostete Quellcode, funktioniert mal nicht :(

bis denne Ludden


« Letzte Änderung: 15.05.06, 21:51:08 von ludden »

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Genau das ist ja das Problem! :) Möglichst viele Fälle abzudecken und trotzdem einfache Verwendung ermöglichen.

In dem von dir genannten Beispiel ist das noch recht einfach. Könntest die Spalten und Werte auch als Arrays übergeben und "vor Ort" auseinandernehmen, und das wiederum vielleicht über eine Extra-Funktion?!

Schonmal bei PEAR reingeschaut? :)

greez 8)
JoSsiF

Ohje, ich mag keine Arrays schonmal so nebenbei, aber naja. Ich lass mir mal was einfallen, so langsam wirds ja richtig kompliziert. dann müsste ich ja in der insert() Funktion die Daten aus ner anderen Methode. Klingt interessant und kompliziert ,dass versuch ich mal.
Aber , es klappt ja nichtmal der einfache Code, mit INSERT ... kommt ne ganz komische Fehlermeldung, muss mir die Sache mal anschauen, wenn ich richtig Zeit hab. hab immo nur 30-40min pro Tag Zeit wegen Arbeiten etc.

Naja mit PEAR warte ich erstmal, ich hab jetzt vorn paar Tagen mit Klassen mal angefangen und mir dann mit Codeschnipseln etc ne mysql Klasse gebaut, jetzt muss ich da erstmal alles ausbeuten und richtig verstehen, bevor ich mich mit PEAR auseinander setze.


PS: eure

<?php ?> ansicht ist echt beschissen mit FF nur zur Info

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

OK. Wenn du noch relativ weit am Anfang mit deiner Programmiererfahrung steckst, dann lass' das mit dem PEAR vielleicht wirklich mal sein.
Ich dachte nur, dass dich das interessieren könnte, weil du gleich so 'ne wilde MySQL-Klasse gebaut hast ;D

Übrigens, kleiner Tipp: ohne Arrays kommst du auch mit den besten Bemühungen nicht sehr weit! :)

greez 8)
JoSsiF

Naja ich beschäftige mich schon länger mit mysql, allerdings auf die idee ne klasse zu schreiben bin ich nie gekommen,obwohl das die Sache doch enorm erleichtert :)

jep ich weiß, also ich starte mal nen neuen Versuch, mit nochmehr Methoden nochmehr Zig-Zag und Effekten rauf und runter, das übliche halt.

Dann poste ich den Code mal, vlt findest du ja noch etwas, dass man verbessern könnte :)


« Woltlab GuestbookHOMEPAGE VORLAGEN »
 

Schnelle Hilfe: Hier nach ähnlichen Fragen und passenden Tipps suchen!

Fremdwörter? Erklärungen im Lexikon!
Datenbank
Eine Datenbank (DBS), im englischen database, ist eine strukturierte Datensammlung und fungiert wie ein "digitales Archiv". Datenbanken dienen der effizienten Aufbewahrun...

Datenkompression
Siehe komprimieren. ...

Datenrate
Die Datenrate, oft auch als Datenübertragungsrate oder Datentransferrate bezeichnet, gibt an, wie viele Daten in einer bestimmten Zeiteinheit (meistens pro Sekunde) ...