[PHP] mssql_* wurde zu sqlsrv_*
Hoppla - schon lange keine Verbindung mehr mit PHP zu MS SQL Servern aufgebaut. Nun war es mal wieder an der Zeit und schon geht es nicht mehr :). Einige Stunden später habe ich es geschafft, die neuen PHP-MSSQL-Treiber in meinen Apache2 zu konfigurieren.
PHP unterstütz leider die alten mssql_*-Funktionen nicht mehr und setz voll auf die Lösung aus dem Hause Microsoft. Die neuen PHP-Treiber können Sie hier runterladen:
http://msdn.microsoft.com/en-us/sqlserver/ff657782.aspx.
Eine ganze Batterie an DLLs haben Sie nun. Aber welche ist für was?
Mit Hilfe des beinhaltenden Readme-File kommen wir ein ganz schönes Stückchen weiter.
|
Driver file |
PHP version |
Thread safe? |
Use with PHP .dll |
|---|---|---|---|
|
php_sqlsrv_53_nts_vc6.dll php_pdo_sqlsrv_53_nts_vc6.dll |
5.3 |
no |
php5.dll |
|
php_sqlsrv_53_nts_vc9.dll php_pdo_sqlsrv_53_nts_vc9.dll |
5.3 |
no |
php5.dll |
|
php_sqlsrv_53_ts_vc6.dll php_pdo_sqlsrv_53_ts_vc6.dll |
5.3 |
yes |
php5ts.dll |
|
php_sqlsrv_53_ts_vc9.dll php_pdo_sqlsrv_53_ts_vc9.dll |
5.3 |
yes |
php5ts.dll |
|
php_sqlsrv_52_nts_vc6.dll php_pdo_sqlsrv_52_nts_vc6.dll |
5.2 |
no |
php5.dll |
|
php_sqlsrv_52_ts_vc6.dll php_pdo_sqlsrv_52_ts_vc6.dll |
5.2 |
yes |
php5ts.dll |
Nachdem wir grob schätzen konnten, welche DDL für uns ist, hangeln wir uns die Apache Fehlermeldungen lang in der Hoffnung das es irgendwann geht.

Tja ist doch ganz logisch dann nehmen wir mal die "*v6.dll". Selbstverständlich wäre es zu viel verlangt, wenn man an dieser Stelle diese Funktionen ähnlich der alten aufbaut. Also lesen und lernen wir http://de3.php.net/manual/en/function.sqlsrv-connect.php!
Das wichtigste im Überblick:
Connection:
<?php
//resource sqlsrv_connect ( string $serverName [, array $connectionInfo ] )
// Aufbau einer Verbindung:
$connectionInfo = array( "Database"=>"MeineTestDatenbank", "UID"=>"MeinTestUser", "PWD"=>"MeinTestPasswort");
$link = sqlsrv_connect("Servername\Instanz", $connectionInfo) or die("Fatal-Error: ".sqlserv_errors()." actuator: Databse Connect");
?>
Query
<?php //sqlsrv_query ( resource $conn , string $sql [, array $params [, array $options ]] ) //Bei dem neuen query muss zwingend eine Connection angegeben werden. $query = sqlsrv_query($link, "SELECT * FROM TestTabelle"); ?>
Die anderen Funktionen, wie sqlsrv_fetch_array() sind in etwa gleich und müssten im Einzelfall nochmal nachgelesen werden.
Getestet mit Microsoft SQL Server Express R2.
Geplagt, aber doch zurueck :) – Google Penatly
Viele anstrengende Tage liegen zurück, welche mich unter anderem vom Bloggen abgehalten haben. Hatte viel zu tun und viel zu kämpfen mit Nichtigkeiten, welche extrem viel Zeit gekostet haben. Dann musste ich projektbedingt mal wieder mit SEO (Search Engine Optimization) beschäftigen. Der Schock kam an einem sonnigen Nachmittag, als ich was über Google Penalty laß. Google Penalty hmm schon gehört, aber was war das doch gleich? Dann nahm das Übel seinen Lauf und ich fing an etwas über die Google Penalty zu lesen und wie man sich dagegen wehren kann. Einige unruhige Nächte später kam ich zu dem Ergebnis das alles halb so Schlimm ist.
Das wichtigste Vorweg wann tritt eine Google Penatly auf?
Google Penalty ist quasi,wie Penalty direkt übersetzt "Strafe", welches sich meist auf die Suchergebnisse auswirkt. Diese Bestrafung kann in Form von Rankingverlust (d.h. man wird z.B. 6 Seiten nach hinten geschoben) oder durch komplette Verbannung der Webseite erfolgen.
Es gibt eine Hand von Faktoren wodurch eine Google Penalty ausgelöst werden kann.
1. Strafe wegen Überoptimierung
Wenn Sie es mal wieder zu genau nehmen und alles sehr schnell gehen muss werden Sie von Google gebremst. Aggressives Linkbuilding mit gleichen Keywords (hierbei gilt auch Alt-Texte, Title-Texte und Meta-Texte) führen zu einer Strafe.
2. Links auf verbotene Websites
Haben Sie auf Ihrer Webseite Links eingebunden, die Google als "verboten" deklariert hat, werden Sie mit hoher Wahrscheinlichkeit eine Penalty erhalten. Diese Seiten sind meist Webseiten die gegen geltendes Recht verstoßen oder anderweitig Regel-un-konform sind.
3. Links zu/von Linkfarmen/Landing Places/Brückenseiten
Böse Geschichte sind Linkfarmen, Landing Places und Brückenseiten, denn diese sind bei Google als "Schlechte Nachbarschaft" eingestuft. Diese Seiten gelten als Spamseiten, also Seiten ohne nützliche und echte Inhalte. Falls Sie nicht sicher sind ob Sie eine derartige Seite verlinken, können Sie diese prüfen lassen über den Service Bad-Neighborhood.com.
4. Spammen von Keywords
Robots und PageCrawler sind in der Lage festzustellen, ob der Text nur für Robots geschrieben wurde oder für echte User. Deswegen der Tipp: Schreiben Sie die Texte natürlich und vermeiden Sie bestimmte Phrasen allzu häufig zu nutzen. Wenn die Suchmachienen Crawler merken, dass der Text nur dem Zweck dient seine Seite für ein bestimmtes Keyword zu pushen erfolgt eine Strafe (Penalty).
Dieses ist nur ein kleiner Auszug von Möglichkeiten die zu einer Bestrafung führen können, aber die Wichtigsten. Denn Dinge wie "übermäßig automatisierte Abfragen von Google-APIs", wird denke ich keiner von Ihnen einfach so unterbewusst tun ;). Wenn Sie das Alles noch mal genau nachlesen wollen - lesen Sie die Google Webmasterrichtlienen.
Die Frage ist wie erkennt man die Google Penalty und wie wird man von dieser Strafe wieder befreit?
Zum einen kann man eine komplette Verbannung seiner Seite erkennen, wenn Sie bei Google Suche site:itriese.de z.B. eintippen und kein Suchergebnis oder nur die Startseite zurück kommt. Die Rankingbestrafung ist nicht so einfach zu erkennen, außer Sie haben ein guten Besucherzähler wie z.B. Google Analytics und so die Möglichkeit einen Verlauf der letzten Wochen sehen zu können. Nimmt die Zahl der Besucher enorm ab, sollten Sie versuchen Ihre wichtigen Keywords bei Google zu prüfen. Plötzlich schwindene Besucher sind ein erstes Anzeichen für eine Rankingbestrafung. Da Google auch kein Unmensch ist, zeigen die Webmastertools in 80% der Fällen, warum Ihre Seite gebannt wurde. Die Webmaster-Konsole sagt Ihnen genau wo das Problem liegt. Laden Sie dafür eine eine Sitemap hoch und sehen Sie im Seitenstatus nach. Dieses ist eine einfache Methode das Problem zu finden und zu erkennen. Wenn Sie das Problem behoben haben hilft eigentlich nur warten. Sie können zwar in den Webmastertools einen Antrag auf Wiederaufnahme stellen, allerdings entscheidet Google, wann Sie wieder aufgenommen werden. Selbstverständlich sollten Sie das Problem vorher behoben haben.
Also kurz und knapp die Lösung Ihrer Probleme sind die Google Webmastertools: http://www.google.de/webmasters/.
Lösen Sie das angemeckerte Problem und dann hilft nur Geduld. Der Erfahrung vieler Webseitenbetreiber nach, welche ich zu diesem Problem befragt habe, erfolgt eine Google Penalty ~ 1-4 Monate. Also 1-4 Monate bis sich die Webseite wieder vollständig erholt hat. Vorausgesetzt Sie haben den Umstand behoben, welches bei Ihnen zu einer Google Penalty führte.
Google wird die Sanktionen automatischen Entfernen, wenn die Webseite noch im Index ist und das Problem behoben ist. Falls Ihre Webseite komplett dauerhaft aus dem Index entfernt wurde, hilft nur ein Antrag auf Wiederaufnahme.
Die Google Webmastertools sind ein nützliches Entwicklungswerkzeug, welches Ich jedem Webseitenbetreiber nahelegen würde.
PHP Google Weather API
Die aktuellen Wetterinformationen auf seiner Webseite ausgeben - wird durch die teilweise versteckte Google Weather API ermöglicht.
<?php
// Für Bonn
$stadt = "53125-Germany";
// Sprache der Wetter Informationen
$sprache = "de";
// Google Weather API abfragen
$api = simplexml_load_string(utf8_encode(file_get_contents("http://www.google.com/ig/api?weather=".$stadt."&hl=".$sprache)));
// XML-Content parsen
$icon = "http://www.google.com".$api->weather->current_conditions->icon->attributes()->data;
$style = $api->weather->current_conditions->condition->attributes()->data;
$temp = $api->weather->current_conditions->temp_c->attributes()->data;
$wet = $api->weather->current_conditions->humidity->attributes()->data;
$location = $api->weather->forecast_information->city->attributes()->data;
// Ausgabe
echo "<center>".$location."<br/><img src=\"".$icon."\" /><br/>".$style.", ".$temp."° C<br/>".utf8_decode(str_replace(":", ": ", preg_replace('/[^a-zA-Z0-9\:\%]/', "", $wet)))."</center>";
?>
Unter http://www.google.com/ig/api?weather=53125-Germany&hl=de könnt Ihr weitere Informationen aus der XML rausziehen so auch den Wetter-Forecast für die nächsten 3 Tage.
Viel Spaß
[PHP] Google Calendar API nutzen
Um die Google Calendar API zu nutzen ist ein "Private Link" erforderlich. Diesen könnt Ihr unter den jeweiligen Kalender-Einstellungen finden. Loggt euch bei Google ein und geht auf Kalender. Dort dann linke Seite bei dem gewünschten Kalender auf "Kalender Einstellungen" drücken.
Ganzen unten auf der Seite findet ihr "Privatadresse":
Die Adresse muss nun zu einem sauberen XML-File gemünzt werden. Klicken wir auf "XML" und das "/basic" am Ende des Links wird entfernt und durch "/full?singleevents=true&futureevents=true&orderby=starttime&sortorder=a" ersetzt.
Der Code dazu um mit der Google API zu arbeiten:
<?php
// Datumsformate festlegen
$dateformat='d.m.Y';
$timeformat='H:i';
// Die Privatadresse (XML)
$calendarfeed ="https://www.google.com/calendar/feeds/myprivateadress/basic";
// Ersetzung
$calendarfeed = str_replace("/basic", "/full?singleevents=true&futureevents=true&orderby=starttime&sortorder=a", $calendarfeed);
// Laden des XML-Files
$xml =simplexml_load_string((file_get_contents(($calendarfeed))));
// Temporäre Zählvariable
$count=0;
// Ausgabe der Termine
// In diesem Beispiel werden nur die nächsten 3 Termine ausgegeben.
echo "<table>";
foreach ($xml->entry as $entry){
$count++;
// Viele weitere Informationen können aus dem XML geholt werden wie z.B. $entry->description;
// für die Beschreibung und viele Weitere. Einfach mal das XML-File durchstöbern.
// Schema für den Google Cal XML Ausgabe laden.
$ns_gd = $entry->children('http://schemas.google.com/g/2005');
$gCalDate = date($dateformat, strtotime($ns_gd->when->attributes()->startTime)+date("Z",strtotime($ns_gd->when->attributes()->startTime)));
$gCalDateStart = date($dateformat, strtotime($ns_gd->when->attributes()->startTime)+date("Z",strtotime($ns_gd->when->attributes()->startTime)));
$gCalDateEnd = date($dateformat, strtotime($ns_gd->when->attributes()->endTime)+date("Z",strtotime($ns_gd->when->attributes()->endTime)));
$gCalStartTime = gmdate($timeformat, strtotime($ns_gd->when->attributes()->startTime)+date("Z",strtotime($ns_gd->when->attributes()->startTime)));
$gCalEndTime = gmdate($timeformat,strtotime($ns_gd->when->attributes()->endTime)+date("Z",strtotime($ns_gd->when->attributes()->endTime)));
echo "<tr><td style=\"vertical-align: top\">Termin:</td><td style=\"padding-left: 10px;\">".$gCalDateStart." ".$gCalStartTime." ".utf8_decode($entry->title);
if($count >=3){ echo "</td><tr>"; break; }else{ echo "<hr style=\"margin-right: 26px;\"/><br/><td></tr>"; }
}
echo "</table>";
?>
a) In der php.ini allow_url_fopen = On gesetzt ist
b) z.B. OpenSSL installiert ist.
Dieser Fehler kann auftreten, wenn der Server nicht SSL-Fähig ist. Benötigt wird dieses, da er Google Calendar nur via HTTPS angesprochen werden kann. Alternativ einen Webspace nutzen, welcher es kann und einen "Proxy" anlegen hierfür z.B.
// http://meinserver.de/proxy.php
<?php
$calendarfeed ="https://www.google.com/calendar/feed/privatelink/basic";
$calendarfeed = str_replace("/basic", "/full?singleevents=true&futureevents=true&orderby=starttime&sortorder=a", $calendarfeed);
echo file_get_contents($calendarfeed);
?>
Logischerweise muss bei dem Script die Kalender-Feed Adresse dann auf z.B. http://meinserver.de/proxy.php geändert werden.
Viel Spaß damit :)
[C#] Herunterladen der letzten Tagesschau
Immer die zuletzt ausgestrahlte Tagesschau auf seinen PC holen?
Dieses ist einfach gemacht. Zuerst wird die Tagesschau-Webseite ausgelesen und mit einem regulären Ausdruck die letzte Tagesschau HD-Version herausgeholt. Im nächsten Step erfolgt ein simpler Download.
System.Net.WebClient wClient = new WebClient();
String strSource = wClient.DownloadString("http://www.tagesschau.de/multimedia/multimediaindex2.html");
// Als HD - Version downloaden
Match match = Regex.Match(strSource, "http://tagesschau(.*?).h264.mp4", RegexOptions.IgnoreCase);
if (match.Success)
{
string strTagesschau= match.Groups[0].Value;
wClient.DownloadFile(strTagesschau, "tagesschau.h265.mp4");
}
Have some fun...
WordPress Plugin selber erstellen (Content-Manipulationen)
Im heutigen Beitrag erstellen wir ein WordPressplugin.
Dafür erstellen wir eine PHP-Datei im Ordner /wp-content/plugins/mycustom-plugin/myp.php
<?php /* Plugin Name: My first Plugin Plugin URI: http://www.itriese.de/ Description: Nice Text! Version: 1.0 Author: Jörg Sager Author URI: http://www.itriese.de/ License: GPL Stable Tag: 1.0 */ ?>
Dieser "Header" ist wichtig, damit WordPress dieses als Plugin identifiziert. Ihr könnt wenn ihr die Datei gespeichert habt nun auch schon im WordPress unter "Plugins" dieses Plugin nur mit diesem Header-Text schon sehen.
Ich habe mir überlegt, dass dieses Plugins verschiedene Variablen in einem Text ersetzt, wenn die Ausgabe erfolgt. Also quasi $itriese_link wird zu "<a href="http://www.itriese.de">ITRiese.de</a>"
Dafür müssen wir nun einen add_filter anlegen. (Eine schöne Auflistung aller möglichen Filter gibt es auf der WordPress-Seite (http://codex.wordpress.org/Plugin_API/Filter_Reference))
<?php
/*
Plugin Name: My first Plugin
Plugin URI: http://www.itriese.de/
Description: Nice Text!
Version: 1.0
Author: Jörg Sager
Author URI: http://www.itriese.de/
License: GPL
Stable Tag: 1.0
*/
// unsere funktion - in $content wird der wiedergebende Content reingeschrieben, welcher am ende "Returned" werden muss.
function unserefunktion($content) {
$content = str_replace("\$itriese_link", '<a href="http://www.itriese.de">ITRiese.de</a>', $content);
return $content;
}
add_filter('the_content', 'unserefunktion');
?>
Wenn ihr das Plugin nun aktiviert und in einem Artikel $itriese_link schreibt wird automatisch $itriese_link ersetzt durch "<a href="http://www.itriese.de">ITRiese.de</a>".
Thema: Sicherheit im Web Back in Action
Einleitung Thema Sicherheit im Web
Das Internet ist voll von "bösartigen" Nachrichten über Hacker, Viren, Malware, Spybots und Trojanern. Doch wie soll man sich Schützen? Mindestens genau so viele Nachrichten über Hacker gibt es Blogeinträge, die alle Tipps vermitteln wollen wie sich der Internetuser vor Schadprogrammen schützen sollte. Von den sogenannten Internet-Tarnkappen "Proxy-Servern" bis zu sicheren Browsern, SSL-Zertifikaten oder einfach Offline bleiben ;). Die Frage die hier bei zustellen ist wieso wird so aktiv versucht den Benutzer an sich sicher zu machen, anstatt die Anbieter. Ich denke das Problem hierbei liegt zum größten Teil daran, dass es ~ 82 Millionen potentielle Internetnutzer gibt. Dazu kommt die aktuelle .de-Domainanzahl, welche bei etwa 14.419.721 (Stand: 26.05.2011, Quelle denic.de) liegt. Nach ein wenig googeln habe ich herausgefunden, dass die Durchschnitts Pro-Kopf-Domains bei Domaininhabern bei etwa 86 Domains pro Person liegt. Damit wären es gerade mal ~ 162.000 Webmaster hier in Deutschland mit .de-Domains. Nun die Frage ~ 162.000 Leuten sichere Lösungen zu verkaufen oder 82 Millionen?
Dieser Text ist selbstverständlich absolut Kritik/Anschuldigungs frei.
Ich möchte heute der anderen Seite dieser Konstellation helfen.
Ich habe mich hingesetzt um eine kleine Lösung für Webmaster zubauen, wie Sie sicher sensible Inhalte übertragen können ohne, dass Web-Crawler oder HTTP-Sniffer diese sofort mitlesen und auswerten können.
PHP encrypt / JavaScript decrypt on the fly...
Um den Content serverseitig zu verschlüsseln nutze ich folgende Funktion:
function endecrypt($text, $key = '') {
// Kein Schlüssel angegeben, so gebe den Text zurück
if ($key == '') return $text;
// Leerzeichen aus Schlüssel entfernen
$key = str_replace(' ', '', $key);
// Ist der Schlüssel kleiner als 8 Zeichen -> exit();
if (strlen($key) < 8) exit('key error');
// Länge des Schlüssels
$key_len = strlen($key);
// Schlüssel über 32 Zeichen, dann bleibt er bei 32
if ($key_len > 32) $key_len = 32;
// encrypt/decrypt text ...
$k = array(); // key array
for ($i = 0; $i < $key_len; ++$i) {
$k[$i] = ord($key{$i}) & 0x1F;
}
for ($i = 0; $i < strlen($text); ++$i) {
$e = ord($text{$i});
if ($e & 0xE0) {
$text{$i} = chr($e ^ $k[$i % $key_len]);
}
}
return $text;
}
Dieses ist eine recht simple Funktion, welche anhand eines eingegebenen Schlüssels den übergebenden Text verschlüsselt oder entschlüsselt.
Wenn ein Text z.B. mit dem Schlüssel "ABCABCABC" verschlüsselt wurde muss der verschlüsselte Text und der Schlüssel "ABCABCABC" übergeben werden um den Text zu entschlüsseln.
Die gleiche Funktion habe ich nochmal für JavaScript geschrieben um später den Text auf der Webseite wieder entschlüsseln zu können.
// Ersatz für die PHP-Funktion ord
function ord(c)
{
return c.toString().charCodeAt(0);
}
// DeEncrypt mit Javascript
function endecrypt(text, key){
if (key == '') {
return text;
}
key = key.replace(/ /g, '');
if(key.length < 8){
throw new Error(\"key error\")
}
var key_len = key.length;
if(key_len > 32) key_len = 32;
k = new Array();
for(i = 0; i < key_len; ++i){
k[i] = ord(key.charAt(i)) & 0x1F;
}
var newtext = \"\";
for(i=0; i < text.length; ++i){
var e = text.charCodeAt(i);
if(e & 0xE0){
newtext += String.fromCharCode(e ^ k[i % key_len]);
}
}
return newtext;
}
Schon können wir etwas serversteitig verschlüsseln und an den Webbrowser des Internetnutzers übertragen. Dieser kann dann on-the-fly mit Hilfe von JavaScript den verschlüsselten Text wieder entschlüsseln. Wenn nun ein HTTP-Sniffer am Werk ist, wird dieser nur den verschlüsselten Text zu Gesicht bekommen und wird zu 99% damit nichts anfangen können / nicht auswerten können.
Das ganze noch mal komplett als Beispiel hier.
Um den Content zu sehen müssen Sie das Passwort :"Be A-Saf3-Key" ohne "" eingeben!
Script für dieses Beispiel:
<?php
function endecrypt($text, $key = '') {
// Kein Schlüssel angegeben, so gebe den Text zurück
if ($key == '') return $text;
// Leerzeichen aus Schlüssel entfernen
$key = str_replace(' ', '', $key);
// Ist der Schlüssel kleiner als 8 Zeichen -> exit();
if (strlen($key) < 8) exit('key error');
// Länge des Schlüssels
$key_len = strlen($key);
// Schlüssel über 32 Zeichen, dann bleibt er bei 32
if ($key_len > 32) $key_len = 32;
// encrypt/decrypt text ...
$k = array(); // key array
for ($i = 0; $i < $key_len; ++$i) {
$k[$i] = ord($key{$i}) & 0x1F;
}
for ($i = 0; $i < strlen($text); ++$i) {
$e = ord($text{$i});
if ($e & 0xE0) {
$text{$i} = chr($e ^ $k[$i % $key_len]);
}
}
return $text;
}
echo "<html>
<head><title>Sicherheit!</title></head>
<body>
<div id=\"code\">".endecrypt("Meiner geheimer Content sollten nur Leute sehen die es auch dürfen ;)", "Be A-Saf3-Key")."</div>
<script type=\"text/javascript\">
function ord(c)
{
return c.toString().charCodeAt(0);
}
function endecrypt(text, key){
if (key == '') {
return text;
}
key = key.replace(/ /g, '');
if(key.length < 8){
throw new Error(\"key error\")
}
var key_len = key.length;
if(key_len > 32) key_len = 32;
k = new Array();
for(i = 0; i < key_len; ++i){
k[i] = ord(key.charAt(i)) & 0x1F;
}
var newtext = \"\";
for(i=0; i < text.length; ++i){
var e = text.charCodeAt(i);
if(e & 0xE0){
newtext += String.fromCharCode(e ^ k[i % key_len]);
}
}
return newtext;
}
if ( isNaN(document.getElementById('code'))){
var decodekey = prompt(\"Geben Sie Ihr Passwort fuer diese Seite ein\",\"\");
document.getElementById('code').innerHTML = endecrypt(document.getElementById('code').innerText, decodekey);
}
</script>
</body>
</html>
";
?>
Als denkbaren Anwendungsfall fällt mir auch ein, dass man den Email-Verkehr verschlüsseln könnte. Durch ein simples Plugin könnte man hier Abhilfe schaffen, dass nicht jeder Ihre Email mit liest.
Ihr habt sicher noch gute Ideen wo man dieses gut einsetzen kann.
Viel Spaß beim ver- und entschlüsseln!
[PHP] TVParser / Parsen wir das TV Programm
In einem Anflug von Langerweile überlegte ich was ich mal wieder bloggen könnte - nachdem ich mich einige Zeit nicht gemeldet habe. Verspreche hier mit hoch und heilig wieder etwas mehr zu bloggen ;).
So nun zu dem heutigen Code-Snippet:
Ich kam auf die Idee einmal einen TV Parser zu schreiben, damit ich das Fernsehprogramm immer gut im Blick habe.
Die Informationen über das Fernsehprogramm hole ich von TVToday.de.
Zuerst habe ich eine Klasse erstellt um die Webseite auszulesen und zu parsen.
tvparser.php
<?php
/*
Daten die benötigt werden:
* {DATE} = 00.00.0000 , {CHANNEL} = PRO7
*/
class tvparser{
var $link = "http://www.tvtoday.de/programm?format=genre&offset=0&date={DATE}&slotIndex=all&channel={CHANNEL}&tips=&order=time";
// Holt alle Sendeblöcke für das angebende Datum und den angegebenden Fernsehsender
function parseChannel($date, $channel){
// - prepare link
$parseLink = $this->link;
$parseLink = str_replace("{DATE}", $date, $parseLink);
$parseLink = str_replace("{CHANNEL}", $channel, $parseLink);
$html = file_get_contents($parseLink);
$getReg = '/(<tr valign="top">((.|\n)*?)<\/tr>)/';
preg_match_all($getReg, $html, $programm);
return $programm;
}
function makeOutput($value){
$value = preg_replace("/Showview ([0-9]|[\W])+/", "", $value);
$value = str_replace(" ", "", $value);
$value = addslashes ($value);
return $value;
}
// Holt die Uhrzeit des Sendeblocks
function getTime($value){
preg_match("/([\W]|[0-9])+/", $value, $ttime);
return trim(str_replace("&","",$ttime[0]));
}
// Holt den Titel des Sendeblocks
function getTitle($value){
$explode = explode("(", $value);
return trim($explode[0]);
}
// Holt die Randinformationen zu dem Sendeblock
function getInfo($value){
$explode = explode(")", $value);
return trim($explode[1]);
}
// Holt die Minuten und den Sendeblock-Typ
function getMinAndType($value){
$explode = explode("Min.", $value);
return $explode;
}
}
?>
So nun haben wir das Werkzeug die Daten zu holen.
Um das ganze auszugeben habe ich eine weitere Datei erstellt.
Meine index.php:
<?php
error_reporting(E_ALL);
// Klasse wird geladen und initialisiert.
include("tvparser.php");
$tvparser = new tvparser();
// Das Fernseh-Programm wird geparsed
$programm = $tvparser->parseChannel($_GET['date'], $_GET['channel']);
// Alle Sendeblöcke durch gehen und ausgeben
foreach($programm[0] as $value){
// Ausgabe der Sendeblöcke
$source = $tvparser->makeOutput(strip_tags($value));
echo $source."<br><br>";
// Informationen einzeln pro Block
$time = $tvparser->getTime($source);
$source = trim(str_replace($time, "", $source));
$title = $tvparser->getTitle($source);
$info = $tvparser->getInfo($source);
$minAtype = $tvparser->getMinAndType($info);
$explode = explode("-", $time);
$von = strtotime($_GET['date']." ".str_replace(".", ":", $explode[0]));
$bis = strtotime($_GET['date']." ".str_replace(".", ":", $explode[1]));
}
?>
Der Aufruf des PHP TV Parsers erfolg durch index.php?channel=PRO7&date=26.05.2011 - Das Datum sollte das aktuelle Datum sein bis max 7 Tage voraus.
Das war es schon. Nun können Sie sich ihre eigene Fernsehzeitung schnell und einfach "zusammenschustern".
Viel Spaß damit ;)
[PS] Verzeichnisstruktur in Excel exportieren
Wer schon immer mal die gesamte Verzeichnisstruktur seines Computers sehen möchte:
$vz = Get-ChildItem -Recurse "C:\\" | where {$_.PSIsContainer}
foreach($obj in $vz){
$obj.Fullname | out-file C:\Verzeichnisstruktur.csv -append
}
[PS] Doppelte Dateien finden
Doppelte Dateien finden und Sie ausgeben / verschieben.
# Generieren von Md5-Hash von Dateien
function md5checksumFromFile([string]$filename){
$inputStream = New-Object System.IO.StreamReader ($filename)
$md5provider = [System.Security.Cryptography.MD5]::Create();
$md5Bytes = $md5provider.ComputeHash($inputStream.BaseStream)
$inputStream.Close()
$md5builder = New-Object System.Text.StringBuilder
$md5Bytes | Foreach-Object { [void] $md5builder.Append($_.ToString("X2")) }
$output = New-Object PsObject
$output | Add-Member NoteProperty HashValue ([string]$md5builder.ToString())
return $output.hashvalue.ToString()
}
$mymd5list = New-Object system.collections.ArrayList
# Holt alle Files inkl. die Files des Unterordners
$filelist = Get-ChildItem -Recurse "C:\\files\\" | where {!$_.PSIsContainer}
# Durchlaufen der Files
foreach($obj in $filelist){
# MD5-Checksum des Files ermitteln
$xmd5 = md5checksumFromFile($obj.Fullname);
$founded = $false;
#Prüfung ob die MD5-Checksum schon existiert
for($i=0; $i -le ($mymd5list.count-1); $i++)
{
if($mymd5list[$i] -eq $xmd5){
$founded = $true;
}
}
if($founded -eq $true){
$output = $obj.Name + " gibt es schon..."
Write-output $output
# Hier könnte man doppelte Files verschieben Move-Item $obj.Fullname ...
}else{
# Falls es noch nicht in der Liste gibt wird die Checksum hinzugefügt.
$md5files = $mymd5list.Add($xmd5)
}
}
