David Thalmann: Problem mit mysql Klasse

Hallo, Guten Tag... und schönen Abend!

Ich hab mich nach langem Kampf mit mir selber ( :D ) endlich dazu entschieden, mit Klassen zu arbeiten, da ich auf einer Homepage (war glaub phpforum.de) eine super Erklärung gefunden habe.

Doch schon mein erster Versuch scheiterte... hier einmal die Klasse:

(classes/db.class.php)
<?php
class db
 {
 var $host="localhost"; #host, meisstens localhost
 var $user=""; #username für datenbank
 var $password=""; #passwort für datenbank
 var $dbname="newcouch"; #datenbankname

var $connid; #connection id
 var $result; #array/string zum testen ob abfrage vorhanden ist und zum ausgeben

/*
 db_connect
 stellt verbindung zur datenbank her
 */
 function db_connect()
  {
  $this->connid = mysql_connect($this->host, $this->user, $this->password);
  mysql_select_db($this->dbname, $this->connid) or die(mysql_error());
  }

####Funtkioniert bis hier....

/*
 sql_select
 verschiedene möglichkeiten zur abfrage
 */
 function sql_select($table, $field="*", $order="", $dir="", $from="", $to="")
  {
  if(empty($field)) $field = "*"; # wenn nichts angegeben alle wäheln

if(!empty($order)) $order = " ORDER BY ".$order.""; # order by...

if(!empty($dir)) $dir = " ".$dir; # gewünschte "richtung" (DESC / ASc)

if(empty($from) && empty($to)) $limit = ""; # wenn keine begrenzung
  elseif(empty($from) && !empty($to)) $limit = " LIMIT 0, ".$to; # wenn nur nach oben begrenzt
  else $limit = " LIMIT ".$from.", ".$to; # wenn oben und unten begrenzung

$abfrage = ""SELECT ".$field." FROM ".$table."".$order."".$dir."".$limit."""; # abfrage string

echo "$table <br>$field <br>$from <br>$to <br>$order <br>$dir <br />$this->connid <br /><br />$abfrage<br />";

da eben nix funktioniert diese ausgabe, sollte aber eigentlich alles gehen

if(!$this->result = mysql_query($abfrage, $this->connid)) return "Fehler beim Senden der Abfrage..."; # error
  else return $this->result; # gibt das resultat zurück
  }
 }
?>

Dann die index.php:

<?PHP
include("classes/db.class.php");

$db = new db;
$db->db_connect();
$db->db_select();
$cont = $db->sql_select("testentry","text");

ist doch richtig so oder?

echo $cont;

gibt vordefinierte fehlermeldung aus ("Fehler beim Senden der Abfrage")

$cont = mysql_fetch_array($cont);

gibt fehler aus, dass es kein brauchbares resultat ist

echo $cont[0];
?>

Dass gibt das ganze aus:

testentry
text

DESC
Resource id #5

"SELECT text FROM testentry DESC"
Fehler beim Senden der Abfrage...
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in C:\*******************\index.php on line 19

Ich hoffe das mir jemand helfen kann!

Herzliche Grüsse aus der Schweiz
David

  1. Nachtrag:

    Dann die index.php:

    <?PHP
    include("classes/db.class.php");

    $db = new db;
    $db->db_connect();

    Dies hier natürlich nicht! (gelöscht)

    $db->db_select();

    $cont = $db->sql_select("testentry","text");

    ist doch richtig so oder?

    echo $cont;

    gibt vordefinierte fehlermeldung aus ("Fehler beim Senden der Abfrage")

    $cont = mysql_fetch_array($cont);

    gibt fehler aus, dass es kein brauchbares resultat ist

    echo $cont[0];
    ?>

  2. Huhu David

    "SELECT text FROM testentry DESC"
    Fehler beim Senden der Abfrage...

    Da steht es doch ;-)

    Viele Grüße

    lulu

    --
    bythewaythewebsuxgoofflineandenjoytheday
  3. echo $begrüßung;

    var $host="localhost"; #host, meisstens localhost
    var $user=""; #username für datenbank
    var $password=""; #passwort für datenbank
    var $dbname="newcouch"; #datenbankname

    Solche veränderlichen Werte zu setzen ist eigentlich Aufgabe des Konstruktors, den man mit entsprechenden Parametern versorgt. Sonst ist deine Klasse zu wenig universell.

    if(!empty($order)) $order = " ORDER BY ".$order.""; # order by...
      if(!empty($dir)) $dir = " ".$dir; # gewünschte "richtung" (DESC / ASc)

    Wenn $order nicht angegeben wird, darf auch kein $dir berücksichtigt werden.

    $abfrage = ""SELECT ".$field." FROM ".$table."".$order."".$dir."".$limit."""; # abfrage string

    Das sieht recht umständlich aus. Wenn schon einen ""-String nimmst, dann musst du nicht wegen der Variablen aus dem String rausgehen. Wenn du unbedingt rausgehen willst (aus welchen praktisch irrelevanten Gründen auch immer), dann kannst du '' nehmen und sparst dir beim " das . Leere Zeichenfolgen zu verketten ist sinnlos. Statt $order."".$dir kannst du $order.$dir schreiben.

    if(!$this->result = mysql_query($abfrage, $this->connid)) return "Fehler beim Senden der Abfrage..."; # error
      else return $this->result; # gibt das resultat zurück

    Testest du auch das Rückgabeergebnis, ob ein (nichtssagender) String ist, weil ein MySQL-Fehler aufgetreten ist (nur welcher?) oder eine Ressource ist?

    echo "$verabschiedung $name";

  4. eine 'DB' klasse, welche nur weiterreicht, ohne eine veredelungsfunktion zu erfüllen, ist überflüssig.
    besser ist eine db-klasse, welche vom konkreteten db-system unabhängig macht, so dass eine anwendung leicht auf eine andewre db umgestellt werden könnte, ohne an tausend stellen anpassungen machen zu müssen.
    auf
    <a href="http://fanelf.de/Dokumentation/Persistenz.htm"> http://fanelf.de/Dokumentation/Persistenz.htm </a>
    gibts ein muster, welches als orientierung dienen kann.