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;
}
nice !!!! :H:
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.
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.
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
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 );
}
?>