Archive for the ‘PHP’ Category

$Var in einem String suchen.

7. October 2008

Eine, im ersten Augenblick banale, dennoch bei mir gern gesehene, Funktion, die uns einen eindeutigen Wert liefert.

Beschreibung:

bool find ( string $haystack , string $needle [, bool $insensitive ] )

Funktion:

#01
#02
#03
#04
#05
#06
#07
#08
#09
#10
#11
#12
#13
#14
#15
#16
#17
#18
#19
#20
function find($p_string, $p_pattern, $p_insensitive = false)
{
if($p_insensitive)
{
$function = 'stripos';
}
else
{
$function = 'strpos';
}

if($function($p_string, $p_pattern) === false)
{
return false;
}
else
{
return true;
}
}

Ergänzungen, Feedback und Meinungen sind herzlich willkommen.

Steam- und Community-IDs

17. September 2008

Aus meinem letzten Projekt möchte ich eine Funktion vorstellen, die vorallem für Webmaster mit HLStats interessant sein könnten. Und zwar geht es darum, eine STEAM_ID eines Spielers in seine Community-ID umzuwandeln, um so wiederum an sein Steam-Community-Profil zugelangen.

So bekommt der Spieler schnell ein “Geschicht” und es ermöglicht einemen Kontakt mit ihm aufzunehme und ggf. Freundschaften zu schließen.
Wer mit dem Begriff Steam im Zusammenhang mit Cumputerspielen nichts anfangen kann, für den dürfte das folgende Funktion auch vollkommen uninteressant sein.
Gefunden habe ich diese im Alliedmods Forum und noch ein wenig angepasst:

#01
#02
#03
#04
#05
#06
#07
#08
#09
#10
#11
#12
#13
#14
#15
#16
#17
#18
#19
#20
#21
#22
#23
#24
#25
#26
#27
function GetCommunityID($szAuthID)
{
$iServer = '0';
$iAuthID = '0';
$szTmp = strtok($szAuthID, ':');

while(($szTmp = strtok(':')) !== false)
{
$szTmp2 = strtok(':');

if($szTmp2 !== false)
{
$iServer = $szTmp;
$iAuthID = $szTmp2;
}
}

if($iAuthID == '0')
{
return '0';
}

$i64friendID = bcmul($iAuthID, '2');
$i64friendID = bcadd($i64friendID, bcadd('76561197960265728', $iServer));

return $i64friendID;
}

In die andere Richtung funktoiniert auch:

#01
#02
#03
#04
#05
#06
#07
#08
#09
#10
#11
#12
#13
#14
#15
#16
#17
#18
#19
#20
function GetSteamID($i64friendID)
{
$iServer = '1';

if(bcmod($i64friendID, 2) == '0')
{
$iServer = '0';
}

$i64friendID = bcsub($i64friendID, $iServer);

if(bccomp('76561197960265728', $i64friendID) == -1)
{
$i64friendID = bcsub($i64friendID, '76561197960265728');
}

$i64friendID = bcdiv($i64friendID, '2');

return ('STEAM_0:'.$iServer.':'.$i64friendID);
}

CSS und Javascript verstecken

27. February 2008

Wer hat es sich als Webdesigner nicht schon mindestens einmal die Möglichkeit gewünscht, sein Design gegen ein einfaches Copy & Paste im Internet zu schützen.

Denn im Internet werden, ohne Rücksicht auf Urheberrechte, viele Designs oder zumindest Teile davon schamlos übernommen. Eine juristische Aufbereitung ist in vielen Fällen nicht möglich und häufig stehen Aufwand und Nutzen in keinem Verhältnis. Trotzdem sind solche Taten ärgerlich.
Doch das muss nicht sein, denn mit etwas PHP können wir ein einfaches Copy & Paste schon verhindern.

Vorwort
Es gibt keinen 100%igen Weg ein Design im Internet komplett zu schützen, denn Browser müssen die Dateien lesen und entsprechend umsetzen. Dadurch wird das Design bereits beim Besuchen der Webpage auf dem Computer des Besuchers gespeichert und ermöglicht ihm, deren Quelltexte einzusehen. Dies betrifft grundsätzlich alle clientseitigen Elemente wie (X)HTML, CSS, Javascript und Bilder.
Doch die eigentlichen Designs entstehen heutzutage in Cascading Style Sheets, sogenannte CSS Datein, und werden seperat geladen. Genauso wie Javascript oder Bilder. Und genau hier setzen wir an.

Technik
Aus einer CSS Datei machen wir eine PHP Datei, da diese nur serverseitig gelesen werden können, und binden die genauso, wie ihr Vorgänger, in den (X)HTML Code ein.

<style>
@import url(./css/style.php);
</style>

Vorher müssen wir den HTML Code aber noch um folgende Zeilen erweitern:

session_start();
$_SESSION['initCSS'] = TRUE;

Wichtig: Dieser Block muss vor dem Einbinden der style.php stehen.

Somit erstellen wir eine Session und setzen die Variabel initCSS auf true.
Die style.php füllen wir wie gewohnt mit CSS und ergänzen den Kopf und Fuß mit etwas PHP, so dass die style.php eine solche Form annimmt:

#01
#02
#03
#04
#05
#06
#07
#08
#09
#10
#11
#12
#13
#14
#15
#16
#17
#18
#19
#20
#21
#22
#23
#24
#25
#26
#27
#28
#29
#30
#31
#32
#33
#34
#35
#36
#37
<?php

session_start();

if (!$_SESSION['initCSS'])
{
header('Location: http://www.kuhrti.de');
}

header('Content-Type: text/css');

print('

//CSS hier einfügen

body
{
margin: 0;
padding: 0;
background: #1a1b1e;
font: normal 13px Verdana, Arial, Helvetica, sans-serif
}

#global
{
background: #ffffff;
}

//noch mehr CSS



'); //print() schließen. Ab hier kein CSS mehr einfügen

$_SESSION['initCSS'] = FALSE;

?>

Was hier geschieht ist einfach. Die Variable $_SESSION['initCSS'] wird geprüft woraufhin entschieden wird, ob wir auf unsere Homepage weitergeleitet werden oder ob wir uns als CSS Datei zu erkennen geben. Da die Session aber bereits beim Laden der Page gesetzt wurde, passieren wir die Abfrage und wandeln mit Hilfe von header(‘Content-Type: text/css’) die style.php zu einer CSS Datei um (zumindest glaubt das der Browser). Anschließend muss die $_SESSION['initCSS'] wieder zurückgesetzt werden, da diese sonst die ganz Sitzung über true bleibt.
Wer jetzt versucht unsere style.php direkt mit einem Browser zu lesen, wird ungewollt wieder auf unsere Webpage zurückgeleitet. An dieser Stelle könnten wir auch vulgär dazu auffordern, unser Design nicht zu kopieren, jedoch vermute ich, dass ein Dieb eher verwirrt ist, wenn er trotz richtiger URL immer im Kreis läuft, als ihm durch unsere Aufforderung zu bestätigen, dass er der Sache ein Schritt näher ist – was eigentlich falsch ist, denn PHP Dateien lassen sich nicht einsehen.

Gleiches gilt für Javascript
Allerdings muss hier foldender Header gesetzt werden:

header('Content-Type: application/x-javascript');

Schlusswort
Mehr Aufwand sollte zu diesem Thema aber nicht betrieben werden, da manche erfahrenere User auch mit dieser Technik nur zwei Klicks benötigt, um an den richtigen Code zu kommen. Das Ganze soll den Dieben die Sache nur erschweren, denn ich behaupte, dass jemand, der Code klauen muss, weil er selber keine Ahnung hat, auch zu blöd ist, dieses System auszutricksen.

Zum Schluss stellt sich nur noch die Frage: will überhaupt jemand mein Design kopieren?

Wer das Ganze ein mal live sehen will, kann auf spez-clan.de wechseln und dort versuchen die “style.css” auszulesen.

Skype Status auslesen

7. February 2008

Skype unterstützt die Funktion seinen Onlinestatus über die Skypehomepage abzufragen. Allerdings sind wir hier auf wenige, vorgefertigte Grafiken beschränkt. Doch mit etwas PHP können wir unsere eigenen Grafiken verwenden.

(more…)

Schneller Performance mit mysql_fetch_assoc()

3. February 2008

Endlich haben wir es schwarz auf weiß: Die klassische und weit verbreitete Variante Datensätze mit mysql_fetch_array() auszulesen ist out. Die Alternative mysql_fetch_assoc() ist schneller (entspricht mysql_fetch_array($sql, MYSQL_ASSOC)), denn wir herhalten ein nur halb so großes Array und sparen daher viel Zeit. Das klingt logisch. Jan Walther ist der Sache für uns auf den Grund gegangen und wollte wissen wie viel Zeit wir dadurch gewinnen.

Hier geht es zum kompletten Test auf phpperformance.de…

ICQ Status auslesen

3. February 2008

Eines meiner ältesten Scripts ist eine Funktion, mit dessen Hilfe ich meinen ICQ Status auslesen lassen kann. Ziel war es die standard ICQ-Blume abzulösen und durch eine eigene Grafik zu ersetzen.
Dieses Script ist simpel aber performancelastig, weil wir weiterhin den vorhanden ICQ Service nutzen und diesen dazu missbrauchen, uns unseren Status mitzuteilen:

$fp = fopen('http://status.icq.com/online.gif?icq='.$uin, 'r');

Den daraus folgenden String verabeiten wir mit der Funktion strlen().
Da die abgefragten on- und offline Statusbilder unterschiedliche Dateigrößen besitzen, definieren wir ihre Werte:

define('ONLINE', 1281);
define('OFFLINE', 1963);

Eine komplette Funktion könnte so aussehen:

#01
#02
#03
#04
#05
#06
#07
#08
#09
#10
#11
#12
#13
#14
#15
#16
#17
#18
#19
#20
#21
#22
#23
#24
#25
#26
#27
<?php
define('ONLINE', 1281);
define('OFFLINE', 1963);

function icqStatus($uin)
{
$fp = fopen('http://status.icq.com/online.gif?icq='.$uin, 'r');
$img = fread($fp , 2048);
$size = strlen($img);

switch ($size)
{
case ONLINE:
$status = 'online';
break;

case OFFLINE:
$status = 'offline';
break;

default:
$status = 'disabled';
}

return $status;
}
?>

Statt des Textes in der Variable $status könnten wir nun auch eine eigene Grafik setzen.

Wichtig: Es es unbedingt notwendig, dass wir auch diese Option, mit der wir unseren Status online einsehen können, bei unserem ICQ aktivieren.