Neuigkeiten:

still alive...

Hauptmenü

Erweiterungen für psysdb

Begonnen von k00ni, 07. März 2010, 10:24:52

Vorheriges Thema - Nächstes Thema

k00ni

Ich habe nun lange mit der db-Klasse vom Powie zu tun gehabt und brauchte hier und da ein paar Erweiterungen. Dass sind Funktionen die zum Teil eigenständig sind oder auf bestehenden aufbauen. Vielleicht braucht ihr ja das ein oder andere. Soweit dürften sie auch vollkompatibel mit der Version aus dem pSys sein.
 

serverid ) ) 
   return false;
else
   return true;
}

 
 

query ( $query ) ) 
   return false;
else
{
   $array = array ();
   while ( $entry = $this->fetch () )
   {
      $array [] = $entry [$column];
   }
   return $array;
}
}

 
 

fetch_row ( $query );
return $row [ $column ];
}  

 
 

escape_by_ref ( $A_argument );
           }
       }
       return true;
   }

 
 

 $value )
{
   $tmp [ $key ] = $this->escape ( $value );
}
return $tmp;
}

 
 

escape_by_ref ( $S_table );
if ( 0 serverid ) ) )
   return true;
else
   return false;
}

Powie


k00ni


escape_by_ref ( $like );
$res = $this->fetch_array ( \"SHOW TABLES FROM \". $this->dbname .\" LIKE \'%$like%\';\" );
foreach ( $res as $table )
{
   $tables [] = $table
  • ;
}
return $tables;
}

 



Nachfolgend eine Funktion zum Dumpen einer Datenbank. Es wird die Datenbank genommen, welche man beim Initialisieren der Klasse ausgewählt hat. Zum Dumpen wird der mysqldump-Befehl genutzt, der auf vielen Systemen zur Verfügung stehen sollte (getestet mit PHP4).
Die psysdb-Klasse muss etwas modifiziert werden, da man die Zugangsdaten bisher ja nicht speichert.
Erstmal die Funktion:
 

escape_by_ref ( $cache_dir );
$command = \"mysqldump -h\".  $this->dbhost .
               \" -u\".  $this->dbuser .
               \" -p\".  $this->dbpassword .
             \" --opt \". $this->dbname .\" >\".
                  \" \". $cache_dir .\"/backup____\". $this->dbname .
                                     \"____\". date ( \'d_m_Y_H_i\', time () ) .\".sql\";
exec ( $command, $output, $return );
return array ( \'output\' => $output,
            \'return\' => $return );
}

 
 
Die nötigen Modifikationen:
Im Konstruktur ( function psysdb ( ... ) ) folgendes hinzufügen:
 

$this->dbuser = $dbuser;
$this->dbpassword = $dbpassword;
$this->dbhost = $dbhost;
$this->dbname = $dbname;

 
 
Damit dürfte es dann funktionieren.

k00ni

Und weil ich grad mal dabei bin ....
 

 Wert)
 */
function insertInto ( $table, $data )
{
$this->escape_by_ref ( $table );
$data = $this->escape_array ( $data );
$set_comma = false;
$sql = \"INSERT INTO $table ( \";
foreach ( $data as $key => $value )
{
   if ( true == $set_comma )
   {
      $sql .= \',\';
   }
   $set_comma = true;
   $sql .= $key;   
   $sql_where .= \"\'\". $value .\"\'\";   
}          
       $sql .= \"VALUES ( \". $sql_where .\" );\";
return $this->query ( $sql );
}

 
 
Man übergibt der Funktion den Tabellennamen und danach ein Array, was wie folgt aussieht:
 

array ( \'Spalte1\' => \'Wert1\', \'Spalte2\' => \'Wert2\', ... );

 
 
Die Keys müssen den Spaltennamen entsprechen, die Werte sind die späteren Werte im VALUES-Bereich.

k00ni

Ich hab hier grad eine gefühlte Ewigkeit einen Bug gesucht, obwohl alles funktionierte. Problem war aber, dass mir die db-Klasse immer wieder num_rows = 1 zeigte, obwohl das Statement falsch war.
Daher würde ich vorschlagen, dass wenn ein Fehler geworfen wird durch eine fehlerhaftes Query, dass dann die \"Statistik\"-Werte zurückgesetzt werden:
 

$this->num_rows = 0;
$this->insert_id = 0;
$this->rows_affected = 0;

 
 
Sonst kommt man in Teufelsküche, wenn man auf if ( $foo->num_rows == 1) prüft, ein true zurückbekommt, aber in Wirklichkeit das Query falsch war und er die Werte eines vorherigen Queries gesetzt hatte.
 
Viele Grüße

k00ni

Hier noch eine generische update-Funktion. Sie funktioniert analog zur insertInto-Funktion.
 

escape_all ( $table, $data, $column_name, $column_value );
$set_comma = false;
if ( false == is_array ( $data ) OR 0 == count ( $data ) )
{
   return false;
}
$sql = \"UPDATE $table SET \";
foreach ( $data as $key => $value )
{
   if ( true == $set_comma )
   {
      $sql .= \',\';
   }
   $set_comma = true;
   $sql .= $key . \"=\'\". $value .\"\'\";   
}          
       $sql .= \" WHERE $column_name = \'$column_value\'\";      
       return $this->query ( $sql );
}
?>

all your base are belong to us / Discord