HINWEIS: Traffic-Attakke !!!


Verbesserungsvorschläge, Mängel, Lob und Tadel alles hier rein.
Bei Loginproblemen wendet euch bitte mittels des Kontaktformulars auf der Homepage an uns.
Benutzeravatar
svbomber
SV-Rider
Beiträge: 16860
Registriert: 10.03.2003 14:59
Wohnort: Wolfsburg
Kontaktdaten:


#46

Beitrag von svbomber » 09.12.2004 7:48

Einfach mal hier den Link zum download posten. Dann kommt der Traffic von alleine :roll: :wink:

Auszug aus meinen Stats:

Code: Alles auswählen

4 511 0.20% http://www.motor-forum.nl/forum/topic.php/81472/1 
5 449 0.18% http://www.boxer-forum.de/dc/dcboard.php 
6 447 0.18% http://www.chromeheads.org/discus/messages/11/119535.html 
7 333 0.13% http://www.evisor.net/forum/showthread.php 
8 319 0.12% http://forums.delphiforums.com/n/mb/message.asp 
9 295 0.12% http://banditforum.soco.net/phpBB2/viewtopic.php 
10 276 0.11% http://www.tschepe.info/t5net/forum/index.php 
11 269 0.11% http://www.bite.lt/plius/bendravimas/klubai/2forum.showPosts/396321.101- 
12 252 0.10% http://p080.ezboard.com/fbmwr1150rmessageboardfrm1.showMessage 
13 252 0.10% http://www.fighters-forum.de/phpBB2/viewtopic.php 
14 246 0.10% http://www.vfr-oc.de/wbb2/thread.php 
15 231 0.09% http://www.cbr1000rr.de/fireblade_forum/thread.php 
16 212 0.08% http://www.africatwin.de/cgi-bin/forum/config.pl 
17 195 0.08% http://www.freemof.de/forum/viewtopic.php 
18 192 0.08% http://www.motorforum.be/viewtopic.php 
19 187 0.07% http://www.v4hondabbs.com/index.php 
20 179 0.07% http://www.motorcyclenews.com/nav 
21 179 0.07% http://www.vtr1000.de/forum/showthread.php 
23 170 0.07% http://webemail.telenet.be/cgi-bin/inbox.exe 
24 169 0.07% http://1909.rapidforum.com/topic 
25 169 0.07% http://www.italobikes.de/index.php 
26 168 0.07% http://f25.parsimony.net/forum62424/messages/63947.htm 
27 167 0.07% http://www.cbrclub.nl/forum/index.php 
28 132 0.05% http://www.mototuning.com/forum/index.php 
29 129 0.05% http://www.motoren-toerisme.be/aspforum/topic.asp 

Murray


#47

Beitrag von Murray » 09.12.2004 8:48

ach, wenn du was zum hosten suchst kann ich dir gern ein 46mb-Video anbieten
Dann sag mal, wo man es kriegen kann. Ich schaus mir mal an und wenn es ok ist, füg ichs hinzu.

ciao


#48

Beitrag von ciao » 09.12.2004 14:35

hab da mal einen Codegenerator gefunden..., aber noch nicht getestet!!!

http://htmlbasix.com/disablehotlinking.shtml

Vielleicht kann das ja der eine oder andere gebrauchen. Das Problem mit dem leeren Referrer und Datei speichern unter ist übrigens aus meiner Sicht nicht lösbar. Die meisten browser schicken bei dieser Aktion nämlich einen leeren Referrer und somit wird die Datei nicht freigegeben obwohl man von einer erlaubten Domain kommt...

siehe:

viewtopic.php?p=256033#256033

sorry :(

MfG Wfromp

Gast


#49

Beitrag von Gast » 09.12.2004 19:44

svbomber hat geschrieben:

Code: Alles auswählen

17 195 0.08% http://www.freemof.de/forum/viewtopic.php
Ich erinnere mich daran, wie das Video im Freemof verlinkt war.

Kannst Du bei allinkl nicht auf einen höheren Tarif wechseln?

Benutzeravatar
SunnyFrani
SV-Rider
Beiträge: 2631
Registriert: 11.07.2003 19:50


#50

Beitrag von SunnyFrani » 09.12.2004 19:44

Das war ich da gerade. :oops:

Murray


#51

Beitrag von Murray » 09.12.2004 20:21

Wo ist das Problem? Leute, die auf der Seite rumsurfen und tatsächlich downloaden dürfen, kriegen ein Cookie verpasst oder eine Session-ID und wer von woanders kommt hat halt beides nicht und kriegt auch keine Datei. Fertig. Erscheint mir so nach 3 Sekunden denken praktikabel, bin aber einer sicherheitstechnischen Diskussion sehr aufgeschlossen ^^

Novan123
Administrator
Beiträge: 2085
Registriert: 05.04.2002 18:29
Wohnort: Detmold
Kontaktdaten:

SVrider:

#52

Beitrag von Novan123 » 09.12.2004 21:43

Wie willst du denn das cookie von jemanden auslesen.
Z.B. wenn man von SVrider auf deine Seite kommt, dann möchtest du das Cookie von SVrider auslesen und nur wenn er das drauf hat,dann darf er runterladen?

Das geht nicht, denn ein Cookie kann eigentlich nur von der Seite ausgelesen werden, von wo es stammt.

Oder wie meinst du das?

Murray


#53

Beitrag von Murray » 09.12.2004 22:59

Das kommt drauf an, wie der Browser eingestellt ist, ist aber ein korrektes Argument. Ich meinte ja eigentlich auch, dass der Zugriff von der gleichen Seite kommt. SV-Rider-mäßig wäre ja denkbar, dass man den Link generiert, der eine download.php aufruft in svrider. Die übernimmt die gewünschte Datei und generiert eine ID. Die trägt sie in Datenbank auf dem hostenden Server ein und bietet als einzige Anzeige für den Browser einen Link an auf den hostenden Server, wiederum mit der Datei und der ID. Da klickt man drauf und die Datei wird dann geservt (weil die ID in der Tabelle gecheckt wird).
Damit wirklich nur SV-Rider-Forumsbenutzer downloaden, macht man die download.php oder wie auch immer sie heißt auf dem SV-Rider-Server so, dass sie das Cookie ausliest, welches man hat, wenn man eingeloggt ist.

Das scheint mir ziemlich sicher.
Also Ablauf: User loggt sich ein, hat Cookie. Klickt auf den Link, kommt zu download.php. Cookie wird gelesen, ID generiert und Anforderung an Downloadserver generiert, dann "weitergeleitet". Ein Umweg aber.. hey so klappt das :)

Benutzeravatar
svbomber
SV-Rider
Beiträge: 16860
Registriert: 10.03.2003 14:59
Wohnort: Wolfsburg
Kontaktdaten:


#54

Beitrag von svbomber » 10.12.2004 0:44

SunnyFrani hat geschrieben:Kannst Du bei allinkl nicht auf einen höheren Tarif wechseln?
Und wer bezahlt mir das 8O :?:

Ich hatte im Schnitt vielleicht 6GB Download, bei 52GB frei. Wegen diesem Vorkommen mach ich da kein Heck Meck. Ich kanns nicht mehr rückgängig machen.
Für die Zukunft werde ich andere Wege finden, dem Vorzubeugen :)

Murray


#55

Beitrag von Murray » 10.12.2004 10:30

Am besten suchste einfach was auf php.net, wenn Du Dich was damit beschäftigen willst. Da hab ich auch die Infos für mein Downloadsystem gefunden. Vorgefertigt kenne ich leider keins. Hab auch mal überlegt, da umzusteigen auf eine standardisierte Lösung (Kann man leicht ergooglen "Downloadscript"), um nicht alles selber implementieren zu müssen, aber ich hab bis jetzt noch kein sicheres System gefunden, schon gar keins, was die Features hat, die ich gerne hätte.
Ideal fände ich auch, per PHP pro Download einen FTP-Server zu steuern, der seine Accounts als MySQL-Datenbank hält. Temporären Account erstellen, Link präsentieren, Ratios benutzen mt einmaligen Freetraffic, nach ausloggen Account wieder killen. Hab ich aber noch nicht hingekriegt. Hab mal pure-ftpd probiert, der scheint aber diesen Free-Traffic nicht zu unterstützen, den jeder in höhe der gewünschten Datei kriegen sollte, bevor er sich wieder ausloggen muss.

Benutzeravatar
svbomber
SV-Rider
Beiträge: 16860
Registriert: 10.03.2003 14:59
Wohnort: Wolfsburg
Kontaktdaten:


#56

Beitrag von svbomber » 10.12.2004 10:43

Ich bastel schon seit längerem, allerdings auf kleiner Flamme, an einem phpbb-Porta mit Forum :lol:

Interessant in diesem Zusammenhang sind u.a. folgende MODs:

Download MOD: Mit diesem MOD kann man eine Art "Download-Datenbank" erstellen.

DL Mod Traffic Limit: Erlaubt ein Traffic Limit pro Datei anzugeben.

-razzle-


#57

Beitrag von -razzle- » 10.12.2004 10:45

also ganz ehrlich wenn dein hoster nich in der lage is ne trafficbegrenzung einzubauen dann hat er in seinem job nix zu suchen. irgendwie muss man sich doch schützen können.

ich bin bei www.artfiles.de und ich kann einmal ein softlimit errichten bei dem ich per mail benachrichtigt werde und zusätzlich ein hardlimit wo dicht gemacht wird.

dürfte doch nich so das problem sein aber dein hoster verdient ja ganz gut an der aktion... :evil:

Benutzeravatar
svbomber
SV-Rider
Beiträge: 16860
Registriert: 10.03.2003 14:59
Wohnort: Wolfsburg
Kontaktdaten:


#58

Beitrag von svbomber » 10.12.2004 10:51

-razzle- hat geschrieben:ich bin bei www.artfiles.de und ich kann einmal ein softlimit errichten bei dem ich per mail benachrichtigt werde und zusätzlich ein hardlimit wo dicht gemacht wird.
Das waren ja meine zwei Vorschläge an ihn, auf welche ich keine Antwort bekommen habe :?
-razzle- hat geschrieben:dürfte doch nich so das problem sein aber dein hoster verdient ja ganz gut an der aktion... :evil:
Eben, die Kohle machts. Dennoch jetzt kein Grund, für mich das Handtuch beim Hoster zu schmeissen. Alles andere ist ok. Da hatte ich vorher schlimmere Efahrungen gemacht :roll:

Artfiles ist bei fast identischem Leistungsangebot doppelt so teuer wie allinkl :idea:

Murray


#59

Beitrag von Murray » 10.12.2004 11:00

Ein Script, welches prüft, ob downgeloadet werden darf, ist die eine Sache, aber viel wichter (und dafür etwas weniger zeitaufwändig) ist eine Absicherung dagegen, dass die Datei am Script vorbei downgeloadet wird. Keine Ahnung, wie das Mod funzt, aber da muss man aufpassen, sonst hilft die Limitierung natürlich wenig. Die meisten Downloadscripts scheinen den Zugriff selber nicht zu verhindern, nur den Zugriff über das Script.

Benutzeravatar
Wörsty
SV-Rider
Beiträge: 5669
Registriert: 03.04.2003 22:08
Wohnort: 12589 Berlin
Kontaktdaten:

SVrider:

#60

Beitrag von Wörsty » 12.12.2004 17:57

Jage meine Downloads jetzt durch PHP 8)

Sieht dann so aus: http://www.woerstenfeld.de/bike/?action ... e&nav_id=2

Statistik so: http://www.woerstenfeld.de/bike/?action ... ts#traffic

Code: Alles auswählen

 $CONFIG["maxtraffic"] = "1073741824";
$CONFIG["webdir"] = "/server/host/blabla";
$CONFIG["rootdir"] = "/server/host/blabla/bike/";
$CONFIG["incdir"] = $CONFIG["rootdir"]."includes/";
 include ($CONFIG["incdir"]."db_mysql.inc.php");
 include ($CONFIG["incdir"]."db_bike.inc.php");
 
$db = new DB_bike();
 $sql = 'SELECT titel, filename FROM navigation WHERE nav_id = '.intval($_REQUEST["nav_id"]).' LIMIT 1';
				if (!$result = $db->query($sql))
				{
					header("Location: http://www.woerstenfeld.de/"); 
					exit;
				}
				$db->next_record($result);
				$data = $db->Record;
				$filename = $data['filename'];
				if ($filename != "" )
				{
					$file = $CONFIG["webdir"].$filename; 

	                                $sql = 'SELECT sum(filesize) as traffic FROM traffic';
					if (!$result = $db->query($sql))
					{
						header("Location: http://www.woerstenfeld.de/"); 
						exit;
					}
					$db->next_record($result);
					$size = $db->Record;
					if ($size['traffic'] >= $CONFIG["maxtraffic"])
					{
						echo '<font color="red" face="Verdana">Upps. <br>Leider wurde das maximale Transfervolumen erreicht. ('.round((intval($size['traffic']) / 1024 / 1024),2).' MB)<BR>Versuche es später nochmal.<hr><a href="http://www.woerstenfeld.de/">www.woerstenfeld.de</a></font>';
						exit;
					} 
				
	                                if (!is_readable($file)) 
	                                {
	                                	echo '<font color="red" face="Verdana">Upps. <br>Die Datei ist nicht da, wo sie hingehört<BR>Melde dich mal bitte bei mir.<hr><a href="http://www.woerstenfeld.de/">www.woerstenfeld.de</a></font>';
						exit;
	                                }
	                                
	                                $sql = 'INSERT INTO traffic values ("",'.intval($_REQUEST["nav_id"]).',"'.$_SERVER["REMOTE_ADDR"].'", "'.$_SERVER["HTTP_USER_AGENT"].'", "'.$_SERVER["REQUEST_URI"].'", '.filesize($file).', "'.$file.'")';
					if ($result = $db->query($sql))
					{
						$db->query('UPDATE navigation SET views = views +1 WHERE titel ="'.$data['titel'].'"');
						header('Content-Description: File Transfer'); 
						header('Content-Type: application/force-download'); 
						header('Content-Length: ' . filesize($file)); 
						header('Content-Disposition: attachment; filename=' . basename($filename)); 
						readfile($file); 
					}
					else
					{
						echo '<font color="red" face="Verdana">Upps. <br>Da ist was schiefgegangen...<BR>Melde dich mal bitte bei mir.<br><hr><a href="http://www.woerstenfeld.de/">www.woerstenfeld.de</a></font>';
					}
	                               	exit;
				}
				else
				{
					header("Location: http://www.woerstenfeld.de/"); 
					exit;
				}
Benötigt noch die db_bike.inc.php

Code: Alles auswählen

<?php

  class DB_bike extends DB_Sql {
    var $classname = "DB_bike";

    var $Host     = "dein_MySQL_host";   // host
    var $Database = "deine_db";      	// datenbank
    var $User     = "dein_user";     			// benutzer
    var $Password = "dein_pass";		         	// passwort

    function frow()
    {
        $arr = mysql_fetch_row($this->Query_ID);
        return($arr);
    }

  }

?>
und

Code: Alles auswählen

<?php
/*
 * Session Management for PHP3
 *
 * Copyright (c) 1998,1999 SH Online Dienst GmbH
 *                    Boris Erdmann, Kristian Koehntopp
 *
 * $Id: db_mysql.inc,v 1.1.1.1 2000/04/16 17:45:21 d_beu Exp $
 *
 */

class DB_Sql {

  /* public: connection parameters */
  var $Host     = "localhost";
  var $Database = "";
  var $User     = "root";
  var $Password = "";

  /* public: configuration parameters */
  var $Auto_Free     = 1;     ## Set to 1 for automatic mysql_free_result()
  var $Debug         = 0;     ## Set to 1 for debugging messages.
  var $Halt_On_Error = "yes"; ## "yes" (halt with message), "no" (ignore errors quietly), "report" (ignore errror, but spit a warning)
  var $Seq_Table     = "db_sequence";

  /* public: result array and current row number */
  var $Record   = array();
  var $Row;

  /* public: current error number and error text */
  var $Errno    = 0;
  var $Error    = "";

  /* public: this is an api revision, not a CVS revision. */
  var $type     = "mysql";
  var $revision = "1.2";

  /* private: link and query handles */
  var $Link_ID  = 0;
  var $Query_ID = 0;


  /* public:debug*/
  function debug($instr) {
        echo $instr;
  }

        
  
  /* public: constructor */
  function DB_Sql($query = "") {
      $this->query($query);
  }

  /* public: some trivial reporting */
  function link_id() {
    return $this->Link_ID;
  }

  function query_id() {
    return $this->Query_ID;
  }

  /* close sql conn */
  function close() {
        $closed = false;
        if ( 0 != $this->Link_ID ) {
           $closed = mysql_close($this->Link_ID);
        }
           return($closed);
    }  
  
  /* public: connection management */
  function connect($Database = "", $Host = "", $User = "", $Password = "") {
    /* Handle defaults */
    if ("" == $Database)
      $Database = $this->Database;
    if ("" == $Host)
      $Host     = $this->Host;
    if ("" == $User)
      $User     = $this->User;
    if ("" == $Password)
      $Password = $this->Password;

    /* establish connection, select database */
    if ( 0 == $this->Link_ID ) {

  $this->Link_ID=mysql_pconnect($Host, $User, $Password);
      if (!$this->Link_ID) {
        echo "Can't connect to my database.";
        exit;
        $this->halt("connect($Host, $User, \$Password) failed.");
        return 0;
      }

      if (!@mysql_select_db($Database,$this->Link_ID)) {
        $this->halt("cannot use database ".$this->Database);
        return 0;
      }
    }

    return $this->Link_ID;
  }

  /* public: discard the query result */
  function free() {
      @mysql_free_result($this->Query_ID);
      $this->Query_ID = 0;
  }

  /* public: perform a query */
  function query($Query_String) {
    /* No empty queries, please, since PHP4 chokes on them. */
    if ($Query_String == "")
      /* The empty query string is passed on from the constructor,
       * when calling the class without a query, e.g. in situations
       * like these: '$db = new DB_Sql_Subclass;'
       */
      return 0;

    if (!$this->connect()) {
      return 0; /* we already complained in connect() about that. */
    };

    # New query, discard previous result.
    if ($this->Query_ID) {
      $this->free();
    }

    if ($this->Debug)
      $this->debug("Debug: query = $Query_String<br>\n");

    #echo "$Query_String";
    $this->Query_ID = mysql_query($Query_String,$this->Link_ID);
    $this->Row   = 0;
    $this->Errno = mysql_errno();
    $this->Error = mysql_error();
    if (!$this->Query_ID) {
      $this->halt("Invalid SQL: ".$Query_String);
    }

    # Will return nada if it fails. That's fine.
    return $this->Query_ID;
  }

  /* public: walk result set */
  function next_record() {
    if (!$this->Query_ID) {
      $this->halt("next_record called with no query pending.");
      return 0;
    }

    $this->Record = @mysql_fetch_array($this->Query_ID);
    $this->Row   += 1;
    $this->Errno  = mysql_errno();
    $this->Error  = mysql_error();

    $stat = is_array($this->Record);
    if (!$stat && $this->Auto_Free) {
      $this->free();
    }
    return $stat;
  }

  /* public: position in result set */
  function seek($pos = 0) {
    $status = @mysql_data_seek($this->Query_ID, $pos);
    if ($status)
      $this->Row = $pos;
    else {
      $this->halt("seek($pos) failed: result has ".$this->num_rows()." rows");

      /* half assed attempt to save the day,
       * but do not consider this documented or even
       * desireable behaviour.
       */
      @mysql_data_seek($this->Query_ID, $this->num_rows());
      $this->Row = $this->num_rows;
      return 0;
    }

    return 1;
  }

  /* public: table locking */
  function lock($table, $mode="write") {
    $this->connect();

    $query="lock tables ";
    if (is_array($table)) {
      while (list($key,$value)=each($table)) {
        if ($key=="read" && $key!=0) {
          $query.="$value read, ";
        } else {
          $query.="$value $mode, ";
        }
      }
      $query=substr($query,0,-2);
    } else {
      $query.="$table $mode";
    }
    $res = @mysql_query($query, $this->Link_ID);
    if (!$res) {
      $this->halt("lock($table, $mode) failed.");
      return 0;
    }
    return $res;
  }

  function unlock() {
    $this->connect();

    $res = @mysql_query("unlock tables");
    if (!$res) {
      $this->halt("unlock() failed.");
      return 0;
    }
    return $res;
  }


  /* public: evaluate the result (size, width) */
  function affected_rows() {
    return @mysql_affected_rows($this->Link_ID);
  }

  function num_rows() {
    return @mysql_num_rows($this->Query_ID);
  }

  function num_fields() {
    return @mysql_num_fields($this->Query_ID);
  }

  /* public: shorthand notation */
  function nf() {
    return $this->num_rows();
  }

  function np() {
    print $this->num_rows();
  }

  function f($Name) {
    return $this->Record[$Name];
  }

  function p($Name) {
    print $this->Record[$Name];
  }

  /* public: sequence numbers */
  function nextid($seq_name) {
    $this->connect();

    if ($this->lock($this->Seq_Table)) {
      /* get sequence number (locked) and increment */
      $q  = sprintf("select nextid from %s where seq_name = '%s'",
                $this->Seq_Table,
                $seq_name);
      $id  = @mysql_query($q, $this->Link_ID);
      $res = @mysql_fetch_array($id);

      /* No current value, make one */
      if (!is_array($res)) {
        $currentid = 0;
        $q = sprintf("insert into %s values('%s', %s)",
                 $this->Seq_Table,
                 $seq_name,
                 $currentid);
        $id = @mysql_query($q, $this->Link_ID);
      } else {
        $currentid = $res["nextid"];
      }
      $nextid = $currentid + 1;
      $q = sprintf("update %s set nextid = '%s' where seq_name = '%s'",
               $this->Seq_Table,
               $nextid,
               $seq_name);
      $id = @mysql_query($q, $this->Link_ID);
      $this->unlock();
    } else {
      $this->halt("cannot lock ".$this->Seq_Table." - has it been created?");
      return 0;
    }
    return $nextid;
  }

  /* public: return table metadata */
  function metadata($table='',$full=false) {
    $count = 0;
    $id    = 0;
    $res   = array();

    /*
     * Due to compatibility problems with Table we changed the behavior
     * of metadata();
     * depending on $full, metadata returns the following values:
     *
     * - full is false (default):
     * $result[]:
     *   [0]["table"]  table name
     *   [0]["name"]   field name
     *   [0]["type"]   field type
     *   [0]["len"]    field length
     *   [0]["flags"]  field flags
     *
     * - full is true
     * $result[]:
     *   ["num_fields"] number of metadata records
     *   [0]["table"]  table name
     *   [0]["name"]   field name
     *   [0]["type"]   field type
     *   [0]["len"]    field length
     *   [0]["flags"]  field flags
     *   ["meta"][field name]  index of field named "field name"
     *   The last one is used, if you have a field name, but no index.
     *   Test:  if (isset($result['meta']['myfield'])) { ...
     */

    // if no $table specified, assume that we are working with a query
    // result
    if ($table) {
      $this->connect();
      $id = @mysql_list_fields($this->Database, $table);
      if (!$id)
        $this->halt("Metadata query failed.");
    } else {
      $id = $this->Query_ID;
      if (!$id)
        $this->halt("No query specified.");
    }

    $count = @mysql_num_fields($id);

    // made this IF due to performance (one if is faster than $count if's)
    if (!$full) {
      for ($i=0; $i<$count; $i++) {
        $res[$i]["table"] = @mysql_field_table ($id, $i);
        $res[$i]["name"]  = @mysql_field_name  ($id, $i);
        $res[$i]["type"]  = @mysql_field_type  ($id, $i);
        $res[$i]["len"]   = @mysql_field_len   ($id, $i);
        $res[$i]["flags"] = @mysql_field_flags ($id, $i);
      }
    } else { // full
      $res["num_fields"]= $count;

      for ($i=0; $i<$count; $i++) {
        $res[$i]["table"] = @mysql_field_table ($id, $i);
        $res[$i]["name"]  = @mysql_field_name  ($id, $i);
        $res[$i]["type"]  = @mysql_field_type  ($id, $i);
        $res[$i]["len"]   = @mysql_field_len   ($id, $i);
        $res[$i]["flags"] = @mysql_field_flags ($id, $i);
        $res["meta"][$res[$i]["name"]] = $i;
      }
    }

    // free the result only if we were called on a table
    if ($table) @mysql_free_result($id);
    return $res;
  }

  /* private: error handling */
  function halt($msg) {
    $this->Error = @mysql_error($this->Link_ID);
    $this->Errno = @mysql_errno($this->Link_ID);
    if ($this->Halt_On_Error == "no")
      return;

    $this->haltmsg($msg);

    if ($this->Halt_On_Error != "report")
      die("Session halted.");
  }

  function haltmsg($msg) {
    printf("</td></tr></table><b>Database error:</b> %s<br>\n", $msg);
    printf("<b>MySQL Error</b>: %s (%s)<br>\n",
      $this->Errno,
      $this->Error);
  }

  function table_names() {
    $this->query("SHOW TABLES");
    $i=0;
    while ($info=mysql_fetch_row($this->Query_ID))
     {
      $return[$i]["table_name"] = $info[0];
      $return[$i]["tablespace_name"] = $this->Database;
      $return[$i]["database"] = $this->Database;
      $i++;
     }
   return $return;
  }
}
?>

Antworten