Da ich nur Webspace besitzte, der auch über eine
SQL Datenbank verfügt, ich aber in diese nicht von Extern Datensätze schreiben oder lesen kann, dies aber für Statistikführung meiner Programme muss, habe ich eine Klasse entworfen, mit welcher man trotzdem mit Hilfe von einem PHP Script in die Datenbank schreiben kann.
Hier erst einmal die
Unit / Klasse:
Delphi-Quellcode:
unit MYSQLPHPTunnel;
interface
uses IdMultipartFormData, IDHTTP;
type THTTP_POST_VARS =
record
Variable :
string;
Inhalt :
string;
end;
type TmysqlphpTunnel =
class
private
FTunnelScript :
string;
FHTTP_POST_VARS : TIdMultiPartFormDataStream;
procedure SetHTTP_POST_VARS (AData :
array of THTTP_POST_VARS);
public
constructor create;
destructor destroy;
override;
procedure AccessDataBase (AData :
array of THTTP_POST_VARS);
property phpscript :
string read fTunnelscript
write ftunnelscript;
end;
implementation
constructor TmysqlphpTunnel.create ;
begin
inherited create;
self.FTunnelScript := '
';
end;
destructor TmysqlphpTunnel.destroy;
begin
inherited destroy;
end;
procedure TmysqlphpTunnel.SetHTTP_POST_VARS(AData :
array of THTTP_POST_VARS);
var i : integer;
HTTP : TIDHTTP;
begin
self.FHTTP_POST_VARS := TIdMultiPartFormDataStream.Create;
if high(AData) >= 0
then
for i := 0
to high(AData)
do
self.FHTTP_POST_VARS.AddFormField(Adata[i].variable,AData[i].Inhalt);
HTTP := TIDHTTP.create(
nil);
HTTP.Post(self.FTunnelScript,self.FHTTP_POST_VARS);
self.FHTTP_POST_VARS.free;
HTTP.Free;
end;
procedure TmysqlphpTunnel.AccessDataBase (AData :
array of THTTP_POST_VARS);
begin
SetHTTP_POST_VARS(AData);
end;
end.
Wie verwendet man diese nun?
Zunächst braucht man ein PHP Srcipt auf dem eigenen Webspace welches die eigentliche Arbeit (Schreiben von Datensätzen in die
DB) übernimmt.
Dies könnte z.B. so aussehen:
Code:
<?php
// HTTP_POST_VARS auslesen
$name = $HTTP_POST_VARS['Name'];
$VID = $HTTP_POST_VARS['VID'];
$TimeStamp = $HTTP_POST_VARS['TimeStamp'];
$ATC = $HTTP_POST_VARS['ATC'];
$allow_realname = $HTTP_POST_VARS['Allow_RealName'];
// define variables
$db_host = 'host';
$db_user = 'user';
$db_pass = 'password';
$db_name = 'dbname';
$db_add_value = 'INSERT INTO table VALUES ';
//
db connection
$
db = mysql_connect($db_host, $db_user, $db_pass);
if (!$
db)
{
die('Could not connect: ' . mysql_error());
}
else
{
mysql_select_db($db_name);
$anfrage = "INSERT INTO Livetrack VALUES ('".$Name."','".$VID."','".$TimeStamp."','".$allow_realname."','".$ATC."')";
mysql_query($anfrage);
}
mysql_close($
db);
?>
Die Klasse TmysqlphpTunnel übernimmt nun jediglich das Senden der HTTP_POST_VARS an das PHP Script auf dem Webspace.
Eine Anwendung könnte so aussehen:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var Postvars :
array of THTTP_POST_VARS;
Tunnel : TmysqlphpTunnel;
begin
// Setzen der HTTP_POST_VARS Variablen und Inhalte
setlength(Postvars,5);
PostVars[0].Variable := '
Name';
PostVars[0].Inhalt := '
Marco test';
PostVars[1].Variable := '
VID';
PostVars[1].Inhalt := '
224003';
PostVars[2].Variable := '
TimeStamp';
PostVars[2].Inhalt := '
123456';
PostVars[3].Variable := '
Allow_RealName';
PostVars[3].Inhalt := '
true';
PostVars[4].Variable := '
ATC';
PostVars[4].Inhalt := '
Observer';
// TmysqlphpTunnel Object erzeugen
Tunnel := TmysqlphpTunnel.create;
// Vollständigen Pfad des PHP Scriptes setzen, welches das Schreiben in die DB übernimmt
Tunnel.phpscript := '
Pfad zum PHP Script + PHP Script Angabe';
// 'www.mein-web-sapce.de/dbaccess.php'
// Datensatz in DB Schreiben
Tunnel.AccessDataBase(PostVars);
Tunnel.Free;
end;
Zugrunde lag dieser
Beitrag