WinFuture-Forum.de: [ Php ] Funktionen Ueberscheiben - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
  • 2 Seiten +
  • 1
  • 2

[ Php ] Funktionen Ueberscheiben Gibt es nicht vielleicht doch einen Weg?


#1 _PelzigesWaldtier_

  • Gruppe: Gäste

geschrieben 31. Mai 2005 - 20:22

Moin,

ich weiss schon, dass man in PHP Funktionen normalerweise nicht ueberschreiben kann. Gibt es denn wirklich keinen Weg, mit dem ich Funktionsaufrufe abfangen kann und dann einen von mir geschriebenen Code ausfuehren lassen kann?

Gruesse,
PW

Dieser Beitrag wurde von PelzigesWaldtier bearbeitet: 31. Mai 2005 - 20:22

0

Anzeige



#2 Mitglied ist offline   Cosmo 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.404
  • Beigetreten: 21. Januar 02
  • Reputation: 1
  • Wohnort:Nürnberg
  • Interessen:Macs, Computer, Macs, Pocket PCs, Macs, Webdesign und natürlich Macs :D

geschrieben 31. Mai 2005 - 21:01

ich glaub kaum dass das geht aber darf man fragen was du vor hast?
Besucht uns im IRC:
irc://irc.spotchat.org/winfuture

Eingefügtes Bild
0

#3 _PelzigesWaldtier_

  • Gruppe: Gäste

geschrieben 31. Mai 2005 - 21:07

Ich wuerde gerne alle Aufrufe der MySQL-Funktionen abfangen, um die Daten dann in Dateien zu speichern, falls der Betreiber keine MySQL-Datenbank hat aber gerne MySQL-Scripte benutzen moechte.

Ob das so geht, wie ich es mir vorstelle, weiss ich nicht. Ich wollte es eigentlich nur mal ausprobieren. Ich muss also die MySQL-Funktionen neu schreiben bzw. alle Aufrufe auf meine "neuen Funktionen" umleiten.

PW

Dieser Beitrag wurde von PelzigesWaldtier bearbeitet: 31. Mai 2005 - 21:08

0

#4 Mitglied ist offline   Slayer 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.476
  • Beigetreten: 12. Dezember 03
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Baden-Württemberg
  • Interessen:&gt; Internet<br />&gt; Musik<br />&gt; Filme<br />&gt; Events

geschrieben 31. Mai 2005 - 21:31

Vielleicht hilft dir das hier weiter...
Der Mensch hat drei Wege, klug zu handeln.
Erstens durch Nachdenken: Das ist der Edelste.
Zweitens durch Nachahmen: Das ist der Leichteste.
Drittens durch Erfahrung: Das ist der Bitterste.

(Konfuzius)
0

#5 Mitglied ist offline   Urza 

  • Gruppe: aktive Mitglieder
  • Beiträge: 255
  • Beigetreten: 16. September 04
  • Reputation: 0
  • Wohnort:Dominaria/Aventurien

geschrieben 31. Mai 2005 - 21:42

hm mir fiele da ein, eigene funktionen reinzusetzen, in der php_mysql.c die "normalen" mysql-funktionen als alias für deine neuen funktionen zu definieren und das ding neu zu kompilieren.
keine garantie, dass das so funktioniert, aber rein theoretisch müsste das so gehen ^^
ich frage mich aber doch gerade, was das NULL am ende heißt, mal nachlesen gehen xD
allerdings bringt dir das natürlich nix, wenn du diese optionen nicht hast :/ da fiele mir gerade auch kein vernünftiger weg ein, aber ich werde mal drüber nachdenken ^^

das ist der codeblock, den ich meine:
(aus der php_mysql.c im ordner (phpname)\ext\mysql)
PHP_FE(mysql_info,                  NULL)
  
	/* for downwards compatability */
	PHP_FALIAS(mysql,    mysql_db_query,  NULL)
	PHP_FALIAS(mysql_fieldname,  mysql_field_name,	NULL)
	PHP_FALIAS(mysql_fieldtable,	mysql_field_table,	NULL)
	PHP_FALIAS(mysql_fieldlen,  mysql_field_len,	NULL)
	PHP_FALIAS(mysql_fieldtype,  mysql_field_type,	NULL)
	PHP_FALIAS(mysql_fieldflags,	mysql_field_flags,	NULL)
	PHP_FALIAS(mysql_selectdb,  mysql_select_db,	NULL)
#ifndef NETWARE  /* The below two functions not supported on NetWare */
#if MYSQL_VERSION_ID < 40000
	PHP_FALIAS(mysql_createdb,  mysql_create_db,	NULL)
	PHP_FALIAS(mysql_dropdb,  mysql_drop_db,  NULL)
#endif
#endif	/* NETWARE */
	PHP_FALIAS(mysql_freeresult,	mysql_free_result,	NULL)
	PHP_FALIAS(mysql_numfields,  mysql_num_fields,	NULL)
	PHP_FALIAS(mysql_numrows,  mysql_num_rows,  NULL)
	PHP_FALIAS(mysql_listdbs,  mysql_list_dbs,  NULL)
	PHP_FALIAS(mysql_listtables,	mysql_list_tables,	NULL)
	PHP_FALIAS(mysql_listfields,	mysql_list_fields,	NULL)
	PHP_FALIAS(mysql_db_name,  mysql_result,  NULL)
	PHP_FALIAS(mysql_dbname,  mysql_result,  NULL)
	PHP_FALIAS(mysql_tablename,  mysql_result,  NULL)
	PHP_FALIAS(mysql_table_name,	mysql_result,  NULL)

0

#6 _PelzigesWaldtier_

  • Gruppe: Gäste

geschrieben 31. Mai 2005 - 22:08

Das ist natuerlich sehr gut. Vielen Dank fuer die Idee! Allerdings muesste der Anwender dann eine neue (dann von mir ausgelieferte) PHP-Distribution / PHP-Programm benutzen. Das ist schlecht ... Schade, dass die MySQL-Unterstuetzung nun ganz tief drin ist und kein Modul mehr ist.

Vieleicht gibt es da ja noch was anderes?

Danke aber schonmal an dich Urza. Ich werde da mal rumbasteln.

Gruesse,
PW

Nachtrag:

Ich habe einen Weg gefunden, der zwar nicht elegant ist, aber funktionieren muesste. Man erstellt eine .htaccess Datei im gewuenschten Verzeichniss und fuellt diese mit folgenden Daten:

Zitat

php_value auto_prepend_file = "C:/path/to/dir/prepend.php"
php_value auto_append_file = "C:/path/to/dir/append.php"


Dadurch wird zu jeder Datei prepend.php am Anfang und append.php am Ende hinzugefuegt.

Die prepend.php Datei erledigt folgende Aufgaben:
- Backup, der Datei, die prepend.php aufgerufen hat
- MySQL-Funktionen in der Datei mit regex austauschen / umschreiben
- Bindet eine Datei (z.B. functions.php) ein, die die neuen Funktionen enthaelt


Die append.php Datei erledigt folgende Aufgaben:
- Spielt das von prepend.php erstelle Backup zurueck

Die Datei function.php enthaellt dann die neuen Funktionen, die von dem veraenderten Script aufgerufen werden.

So muesste es theoretisch funktionieren. Ich werde es gleich mal ausprobieren.

Gruesse,
PelzigesWaldtier

Dieser Beitrag wurde von PelzigesWaldtier bearbeitet: 01. Juni 2005 - 22:49

0

#7 _PelzigesWaldtier_

  • Gruppe: Gäste

geschrieben 02. Juni 2005 - 00:13

Ich habe eine Lösung gefunden. Ich schreibe desshalb einen neuen Beitrag und bearbeite den alten nicht, da Mitglieder, die an einer Lösung interessiert sind, es mitbekommen.

Zuersteinmal muss im gewuenschten Verzeichniss eine .htaccess Datei angelegt werden, die folgenden Inhalt hat:

.htaccess sagte:

php_value auto_prepend_file "C:/xampplite/htdocs/override/o_prepend.php"

Dadurch wird jedem Script, welches aufgerufen wird, die Datei o_prepend.php vorangestellt.

Die Datei o_prepend.php wartet mit folgendem Inhalt auf:

<?php

// Finde Dateinamen heraus
$details = pathinfo($PHP_SELF);
define('THIS_FILE', $details['basename']);

// Erstelle Konstanten zur Hilfe
define('NEW_FILE', 'obk_'.sha1_file(THIS_FILE).'.php');

// Erstelle ein Backup der Datei
copy(THIS_FILE, NEW_FILE);

// Lade das Backup
$contents = file_get_contents(NEW_FILE);

// Wechsle Funktionen aus
$contents = str_replace('die', 'new_die', $contents);

// Speichere Datei wieder ab
$handle = fopen(NEW_FILE, 'w');
fwrite($handle, $contents);
fclose($handle);

// Binde neue Funktionen ein
require('o_newfunctions.php');

// Fuehre die veraenderte Datei aus (einfuegen)
require(NEW_FILE);

// Zum Ende werden noch alle Backups (inklusive des aktuellen, welches nicht
// mehr gebraucht wird) gelöscht
$all_files = scandir(getcwd());

foreach ($all_files as $curr_file)
{
  if (substr($curr_file, 0, 4) == 'obk_')
  {
    unlink($curr_file);
  }
}

// Stoppe die Ausfuehrung des Originalscripts
die();

?>


Es werden folgende Dinge durchgefuehrt:
- Es wird der Name des aufrufenden Scriptes gesucht
- Es wird ein Dateiname fuer das Backupgegeneriert
- Das aufrufende Script wird kopiert
- Die gewuenschten Funktionen werden in der Kopie ausgetauscht
- Die Kopie wird wieder abgespeichert
- Es werden die neuen Funktionen eingebunden
- Es wird die neue Datei eingebunden / ausgefuehrt
- Es werden alle Kopien - inklusive der aktuellen - geloescht
- Die Ausfuehrung des Originalscripts wird angehalten (Die Ausfuehrung wird einfach abgebrochen.

Die Datei o_newfunctions.php haelt alle neuen Funktionen bereit. Die sieht wie folgt aus:

<?php

// Hier folgen nun die neuen Funktionen
function new_die($text)
{
  echo 'Die neue Funktion wurde mit dem Parameter <b>'.$text.'</b> aufgerufen.';
}

?>


Zum Schluss hier noch das Beispielscript sample-userscript.php:

<?php

// Die die()-Funktion wird nachher veraendert
die('Dies ist das Ende der Welt!');

// Nur, wenn die die()-Funktion veraendert wurde,
// wird auch der folgende Text angezeigt

echo '<br />Und hier der Neuanfgang!';

?>


Ich habe alles getestet und es funktioniert wunderbar. Wie gesagt: Diese Loesung ist nicht sehr elegant, funktioniert aber. Nun muss man das Script bzw. die auszutauschenden Funktionen nur noch seinen Wuenschen anpassen.

Wichtig: PHP 5 wird benoetigt, da die Funktion scandir() in aelteren Versionen nicht vorhanden ist.

Nachtrag:
Ich habe das Script mal etwas erweitert. Es wurden Fehlerbehandlung, ein Ereignislog und einige kleine Fehlerkorrekturen hinzugefuegt. Auch kann man nun einzelne Dateien ausschliessen lassen. Auch werden alle Dateien, die dem Script gehoeren nicht mehr vom Apachen angezeigt (werden denied; direktes Aufrufen nicht mehr moeglich). Es ist quasi "transparent". Das Wort mag ich. Nicht vergessen die .htaccess Datei anzupassen!

http://pelzigeswaldtier.de/?pageID=2

Gruesse,
PelzigesWaldtier

Dieser Beitrag wurde von PelzigesWaldtier bearbeitet: 10. September 2005 - 11:02

0

#8 Mitglied ist offline   Floele 

  • Gruppe: aktive Mitglieder
  • Beiträge: 919
  • Beigetreten: 22. Juni 04
  • Reputation: 0

geschrieben 02. Juni 2005 - 06:37

Der einzige Nachteil an der Methode ist das "str_replace". Dass hier wirklich nur die Funktionen ausgetauscht werden (und nicht andere Textstellen mit dem gleichen Namen) ist nämlich nicht garantiert ;D
Aber ansonsten eine nette Idee :P
0

#9 Mitglied ist offline   Urza 

  • Gruppe: aktive Mitglieder
  • Beiträge: 255
  • Beigetreten: 16. September 04
  • Reputation: 0
  • Wohnort:Dominaria/Aventurien

geschrieben 02. Juni 2005 - 12:46

nicht übel :) darauf wäre ich nicht so schnell gekommen. wahrscheinlich gar nicht :)
0

#10 _PelzigesWaldtier_

  • Gruppe: Gäste

geschrieben 02. Juni 2005 - 15:59

Zitat (Floele: 01.06.2005, 23:37)

Der einzige Nachteil an der Methode ist das "str_replace". Dass hier wirklich nur die Funktionen ausgetauscht werden (und nicht andere Textstellen mit dem gleichen Namen) ist nämlich nicht garantiert ;)
Aber ansonsten eine nette Idee :imao:
<{POST_SNAPBACK}>


Danke. :) Man koennte, wenn man lustig ist, mit regulaeren Ausdruecken arbeiten, die auf vorhandene Parameter pruefen (muesste natuerlich vorher angegeben werden) usw. Dadurch koennte man ja einigermassen sicherstellen, dass nur die gewuenschten Funktionen ueberschrieben werden. Aber naja. So, wie es jetzt ist, reicht es ersteinmal. ;)

PW

Dieser Beitrag wurde von PelzigesWaldtier bearbeitet: 02. Juni 2005 - 16:01

0

#11 Mitglied ist offline   Floele 

  • Gruppe: aktive Mitglieder
  • Beiträge: 919
  • Beigetreten: 22. Juni 04
  • Reputation: 0

geschrieben 02. Juni 2005 - 16:14

Oder besser damit:
http://docs.php.net/....tokenizer.html

Aber das wird wahrscheinlich zum umständlich :imao:
0

#12 _PelzigesWaldtier_

  • Gruppe: Gäste

geschrieben 02. Juni 2005 - 17:06

Das wuerde auch gehen und ist sogar zuverlaessiger. Und so umstaendlich ist es auch nicht. Ausprobiert (Aus dem Manual):

<?php

$source = file_get_contents('sample.php');
$tokens = token_get_all($source);

foreach ($tokens as $token)
{
    if (is_string($token))
    {
        echo $token;
    }
    else
    {
        list($id, $text) = $token;

        switch ($id)
        {
            case T_PRINT:
         echo 'new_print';
            break;

            default:
         echo $text;
            break;
        }
    }
}


Das Problem ist nur, dass nur einige wenige Dinge (und meist nur Sprachkonstrukte) mit dieser Methode herausgefiltert werden koennen. Eine Liste alles Tokens kann man hier finden: http://docs.php.net/en/tokens.html

Funktionen wie z.B. mysql_quiensabe() kann man damit nicht austauschen? Oder hab ich das nicht so ganz verstanden?

PW

Dieser Beitrag wurde von PelzigesWaldtier bearbeitet: 02. Juni 2005 - 17:07

0

#13 Mitglied ist offline   Floele 

  • Gruppe: aktive Mitglieder
  • Beiträge: 919
  • Beigetreten: 22. Juni 04
  • Reputation: 0

geschrieben 02. Juni 2005 - 17:10

Ist T_FUNCTION nicht das wonach du suchst?
0

#14 _PelzigesWaldtier_

  • Gruppe: Gäste

geschrieben 02. Juni 2005 - 17:27

Leider nicht. T_FUNCTION ersetzt das Sprachkonstrukt oder wie auch immer man das nennt. Siehe hier:

Zitat

function name($param)
{
  return $nichts;
}


PW
0

#15 Mitglied ist offline   Floele 

  • Gruppe: aktive Mitglieder
  • Beiträge: 919
  • Beigetreten: 22. Juni 04
  • Reputation: 0

geschrieben 02. Juni 2005 - 18:10

Hm, sieht so aus als wäre es dann T_STRING. Da T_CONSTANT_ENCAPSED_STRING etwas anderes ist, müsste man damit dann in der Lage sein richtige Funktionen von Funktionsnamen in Strings unterscheiden zu können.
0

Thema verteilen:


  • 2 Seiten +
  • 1
  • 2

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0