Jump to content
Sign in to follow this  
k00ni

Erweiterungen für psysdb

Recommended Posts

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;
}

Share this post


Link to post
Share on other sites

escape_by_ref ( $like );

	$res = $this->fetch_array ( "SHOW TABLES FROM ". $this->dbname ." LIKE '%$like%';" ); 

	foreach ( $res as $table )
	{
		$tables [] = $table [0];
	}

	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.

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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 );
}
?>

Share this post


Link to post
Share on other sites
Guest
You are commenting as a guest. If you have an account, please sign in.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×