Posts mit dem Label PHP werden angezeigt. Alle Posts anzeigen
Posts mit dem Label PHP werden angezeigt. Alle Posts anzeigen

8.12.17

MySQL - Schnellere Inserts

1. Je mehr Indizes, desto langsamer die Inserts!

Bei 20000 Einträgen dauert das Befüllen auf herkömmlichem Wege auf einem RPI3 ca. 140 Sekunden. Optimiert dauert es ca. 1.5 Sekunden!!!

Code, um Zeitaufwand für Inserts zu vergleichen.

function my_autoloader($class)
{
    include 'include/' . $class . '.php';
}
$cache=5000;
$usecache = true;
$inserts=10000;
spl_autoload_register('my_autoloader');
$db = new \PDO('mysql:dbname=newdb;host=localhost', 'DB', 'PASSWORD'');
for ($i = 1; $i <= $inserts; $i++)
{
    $data[] = ["id" => 1, "zip" => "30159", "name" => "Hannover", "citizens" => 50000];
}

$beginn = microtime(true);
$sql = 'INSERT IGNORE INTO testdaten (id, zip, name, citizens) VALUES ';
if ($usecache)
{
    $dbCache = new dbcache($db, $sql, $cache, true);

    foreach ($data as $entry)
    {
        $dbCache->add('(null,' . $db->quote($entry['zip']) . ',' . $db->quote($entry['name']) . ',' . ((int) $entry['citizens']) . ')');
    }
    $dbCache->flush();
}
 else
{
     $cache=0;
     foreach ($data as $entry)
     {
         $sql2= $sql . " ('null','" . $entry['zip'] . "','". $entry['name'] . "','" . $entry['citizens'] . "')";
         //echo "debug: $sql"; die;
         $db->query($sql2);
     }
}
$dauer = microtime(true) - $beginn;
echo "Verarbeitung des Skripts: $dauer Sek.<br>";
$sql = "SELECT count(*) from testdaten";
$result = $db->query($sql);
echo "Anzahl der Datensätze: " . $result->fetchColumn() . "<br>";
$db->query("TRUNCATE table testdaten");
$db->query("INSERT INTO performance (inserts, zeit, cache) VALUES"
        . "('$inserts','$dauer','$cache')");
DBCache Klasse, gefunden hier.

class dbcache
{
    public $lastQuery;

    private $db, $limit, $sql, $cache = [], $auto;

    /**
     * @param \PDO   $db
     * @param string $sqlPrefix
     * @param int    $limit
     * @param bool   $autoFlush
     */
    public function __construct(\PDO $db, $sqlPrefix, $limit, $autoFlush = false)
    {
        $this->db    = $db;
        $this->limit = $limit;
        $this->auto  = $autoFlush;
        $this->sql   = $sqlPrefix;
    }

    /**
     * @param string $query
     */
    public function add($query)
    {
        $this->cache[] = $query;

        if ($this->auto) {
            $this->softFlush();
        }
    }

    /**
     * Flush cache and query database.
     */
    public function flush()
    {
        if (empty($this->cache)) {
            return;
        }

        // save query for logging, if something goes wrong
        $this->lastQuery = $this->sql.implode(',', $this->cache);

        $this->db->query($this->lastQuery);
        $this->cache = [];
    }

    /**
     * Flush cache if limit is reached.
     */
    public function softFlush()
    {
        if (count($this->cache) >= $this->limit) {
            $this->flush();
        }
    }
}

29.6.17

Ergebnisse aus NMAP in eine MySQL Datenbank schreiben

Es gibt bei Nmap die Möglichkeit die Ergebnisse von Netzwerkscans in eine XML-Datei zu schreiben. Die Weiterverarbeitung mit Linux-Bordmitteln ist jedoch nicht ganz trivial. Jedenfalls habe ich es mit xmlstartlet nicht so richtig hinbekommen.
Nmap wird z.B. gestartet mit

nmap -Pn 192.168.0178.0/24 -oX output/ZIELDATEI.xml

Mit einem Einzeiler, wie

xmlstarlet sel -t -m '/nmaprun/host' -v 'address[@addrtype="ipv4"]/@addr' -o ":" -v 'ports/port/@portid' -n /var/www/html/netzinfo/output/ZIELDATEI.xml

bekomme ich zwar alle Ports nacheinander angezeigt, doch die Zuordnung von IP Adressen zu den offenen Ports muss noch erfolgen.

Da ich das Ergebnis sowieso noch einmal durchgehen muss und alles in eine MySQL Datenbank eintragen will, habe ich mir das Ganze etwas vereinfacht und eine Sprache genommen, die ich etwas besser beherrsche: PHP.

Die Ausgabedatei habe ich testweise so eingeladen und ausgegeben:

$xml = file_get_contents("output/ZIELDATEI.xml");
$p = \xml_parser_create();
\xml_parse_into_struct($p, $xml, $data, $values);
\xml_parser_free($p);
echo "Index array <br><pre>";
print_r($values);
echo "data array <br><pre>";
print_r($data);
Ausgabe (auszugsweise):
260] => Array
        (
            [tag] => ADDRESS
            [type] => complete
            [level] => 3
            [attributes] => Array
                (
                    [ADDR] => 192.168.178.150
                    [ADDRTYPE] => ipv4
                )

        )

    [261] => Array
        (
            [tag] => HOST
            [value] => 

            [type] => cdata
            [level] => 2
        )

    [262] => Array
        (
            [tag] => ADDRESS
            [type] => complete
            [level] => 3
            [attributes] => Array
                (
                    [ADDR] => 74:75:48:A4:48:A8
                    [ADDRTYPE] => mac
                    [VENDOR] => Amazon Technologies
                )

        )
Auch hier ist es nicht so einfach, eine einwandfrei Zuordnung, von z.B. IP - Adressen zu offenen Ports und Mac-Adressen zu treffen.
Geholfen haben mir die Beispiele auf php.net und zwar die Funktion von efredericksen.

<?php class XmlElement {
  var
$name;
  var
$attributes;
  var
$content;
  var
$children;
};

function
xml_to_object($xml) {
 
$parser = xml_parser_create();
 
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
 
xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
 
xml_parse_into_struct($parser, $xml, $tags);
 
xml_parser_free($parser);

 
$elements = array();  // the currently filling [child] XmlElement array
 
$stack = array();
  foreach (
$tags as $tag) {
   
$index = count($elements);
    if (
$tag['type'] == "complete" || $tag['type'] == "open") {
     
$elements[$index] = new XmlElement;
     
$elements[$index]->name = $tag['tag'];
     
$elements[$index]->attributes = $tag['attributes'];
     
$elements[$index]->content = $tag['value'];
      if (
$tag['type'] == "open") {  // push
       
$elements[$index]->children = array();
       
$stack[count($stack)] = &$elements;
       
$elements = &$elements[$index]->children;
      }
    }
    if (
$tag['type'] == "close") {  // pop
     
$elements = &$stack[count($stack) - 1];
      unset(
$stack[count($stack) - 1]);
    }
  }
  return
$elements[0];  // the single top-level element}
Die Ausgabe ist so, dass ich dann durch alle Ergebnisse der Nmap Ausgabe interieren kann.
Das PHP Script sieht so aus (quick and dirty):


$xml=file_get_contents("output/ZIELDATEI.xml");
$object = \xml_to_object($xml)->children;
// Gehe alle Objekte durch:
$anzahl = count($object);
for($i=0; $i<$anzahl; $i++)
{
    // IP Adresse
    $ip = $object[$i]->children[1]->attributes['addr'];
    if(strlen($ip)<1) continue;
    echo "Adresse: $ip<br>";
    // Rechnername
    $name=$object[$i]->children[3]->children[0]->attributes['name'];
    echo "Name: $name <br>";
    // MAC Adresse
    $mac=$object[$i]->children[2]->attributes['addr'];
    echo "MAC Adresse: $mac <br>";
    $vendor=$object[$i]->children[2]->attributes['vendor'];
    echo "Hersteller: $vendor <br>";
    // Offene Ports
    $anzahlports=count($object[$i]->children[4]->children);
    $port=""; $ports="";
    for($a=0;$a<$anzahlports; $a++)
    {
        $port=$object[$i]->children[4]->children[$a]->attributes['portid'];
        if(strlen($port)>0)
        {
            $ports.= $port . ";";
        }
    }
    echo "Offene Ports: $ports <br>";
}

Mit diesen Daten kann ich nun weiterarbeiten und sie z.B. in eine MySQL Datenbank schreiben.
Vielleicht hat jemand einfachere Lösungen??



27.10.16

Joomla - Inhalte per Script auf neue Version übertragen

Ich stand vor dem Problem, die Inhalte einer ziemlich alten Joomla Version (V 1.5) auf eine neue Joomla Installation zu übertragen.

Hier ein schnell dahin gehacktes Script. Dieses muss noch mit den Zugangsdaten der alten und neuen Datenbank angepasst werden. Dann noch die Startwerte von  $rgt und $lft anpassen. Ich habe keine Ahnung, wozu sie sind. Auf jeden Fall müssen sie hochgezählt werden. Einfach mal in die Tabelle assets nach den entsprechenden Spalten gucken und die letzten Werte +1 übernehmen in das Script.

<?php


$prefix = "c27gy_";
$rgt = 36;
$lft = 35;

class mydatabase
{

    var $database = "";
    var $prefix = "c27gy_"; // Prefix der Joomla Tabellen

   
    function db_connect($database)
    {
       
        $user = "[user]";
        $pw = "[PASSWORD]";

        $mysqli = new mysqli("localhost", $user, $pw, $database);
        /* check connection */
        if (mysqli_connect_errno())
        {
            $error = "Connect failed: " . mysqli_connect_error();
            //$this->errorReport($error, true);
            exit();
        }
        $mysqli->query("SET NAMES 'utf8'");
        return $mysqli;
    }


    function getAssetID($title, $lft, $rgt, $name)
    {
       
        $sql_asset = "INSERT INTO " . $this->prefix . "assets
    (level,name,title, lft, rgt, parent_id, rules)
    VALUES
    ('3', '$name','$title', '$lft', '$rgt', '27','{\"core.admin\":{\"7\":1},\"core.manage\":{\"6\":1},\"core.create\":{\"3\":1},\"core.delete\":[],\"core.edit\":{\"4\":1},\"core.edit.state\":{\"5\":1},\"core.edit.own\":[]}')";
        $link=$this->db_connect("[DATABASE]");
        $link->query($sql_asset);
        //echo "DEBUG $sql_asset <br>";
        return $link->insert_id;
    }

    function truncateTables()
    {
        $link=$this->db_connect($this->db_new);
        // Die u.a. id anpassen!!! Nicht, dass existente Datensätze gelöscht werden
        $link->query("DELETE FROM " . $this->prefix . "assets WHERE id > 65");
        $link->query("TRUNCATE TABLE " . $this->prefix . "content");
        $link->query("TRUNCATE TABLE " . $this->prefix . "content_frontpage");
       
    }
}

$db = new \mydatabase();
// ACHTUNG: NICHT UNBEDINGT NÖTIG!!
//$db->truncateTables(); // Tabellen leeren bzw. Einträge löschen

// Mit den Datenbanken verbinden
$link = $db->db_connect("[DATABASE]");
$link1 = $db->db_connect("[DATABASE_OLD]");
// Daten aus der alten Tabelle holen
$sql_abfrage = "SELECT * FROM jos_content where state=1 ORDER by created DESC";
$result = $link1->query($sql_abfrage);
$zaehler = 0;
while ($row = $result->fetch_array())
{
    $zaehler++;

    echo $zaehler . " " . $row['alias'] . "<br>";
    $title = $row['title'];
    $alias = $row['alias'];
    $introtext = $row['introtext'];
    $fulltext = $link->real_escape_string($row['fulltext']);
    $created = $row['created'];
    $old_id=$row['id'];
    $id = $db->getAssetID($title, $lft, $rgt, "com_content.article." . $old_id);
    $rgt+=2;
    $lft+=2;
    $sql_insert = "INSERT INTO ${prefix}content (
                asset_id,
                title,
                alias,
                state,
                catid,
                introtext,
                `fulltext`,
                language,
                created, publish_up,
                featured,
                version,
                access)
VALUES('$id', '$title',
        '$alias',
        1,
        2,
         '$introtext',
         '$fulltext',
         '*',
        '$created', '$created',
         1,
         2,
         1)";
    if(!$link->query($sql_insert))
    {
        echo "Fehler! " . $link->error . "<br>$sql_insert";
    }
    $content_id=$link->insert_id;
   
    $sql_frontpage="INSERT INTO ${prefix}content_frontpage (content_id, ordering)
    VALUES ('$content_id', '$zaehler')";
    if(!$link->query($sql_frontpage))
    {
        echo "Fehler! " . $link->error . "<br>$sql_frontpage";
    }
}

7.12.15

PHP - auf Variablen der Elternklasse zurückgreifen

Nachdem ich den Fehler gemacht habe (schon wieder) wichtige Variablen nicht als Array zu definieren, was sich sehr einfach hin- und herschieben lässt, musste ich von der Kindklasse auf Werte von Variablen der Elternklasse zugreifen.

Dies ist zum einen möglich, indem man dort eine Funktion (Methode jajaja)  integriert, die die Werte übergibt.

Nach einigem Googlen habe ich allerdings eine für mich praktikablere Lösung gefunden.

Beispiel


class A
{
  var Variable1;
  var Variable2;
  var Variable3;

 function __construct()
{
     include 'meineconfig.php'; // Werte von Variablen a,b,c etc.
    $this->Variable1=$a;
    $this->Variable1=$b;
    $this->Variable1=$c;
}


}


class B extends A
{

   function __construct()
  {
       parent::__construct();
  }
}

$B=new B();
echo $B->Variable1;


15.6.15

VServer bei Strato - Plesk 12 - PHP Scripte werden nicht ausgeführt

Wie oft bei Google zu finden, scheint Plesk manchmal ein Problem mit neueren (per Update installierten) PHP Versionen zu haben.

Nachdem ich versehentlich das cgi-Verzeichnis im httpdocs Ordner gelöscht hatte, lief PHP, welches als cgi Modul eingebunden wird, (natürlich) nicht mehr.

Lösung:

PHP unter Servicepakete -> Paketname  -> Hosting Parameter -> Scripting als Apache Modul ausführen lassen.
Dann Synchronisierung abwarten und PHP sollte funktionieren.

24.3.15

Videos umwandeln und per HTML5 wiedergeben

Ausgangslage:

Ich hatte einige Videos mit meinem neuen Quadrocopter erstellt und wollte dieses "mal eben" für andere bereit stellen.
HTML5 unterstützt das Streamen von mp4 Videos, nicht aber von avi´s.
Das die Videos im avi-Format und einer Auflösung von 1280*720 vorliegen, sollen diese zunächst umgewandelt werden.

Das ist sehr einfach unter Linux (hier Ubuntu 12) möglich, wenn avconv installiert ist.

apt-get install libav-tools

Da der benötigte Codec vermutlich auch noch nicht vorhanden ist, sollte auch ein

apt-get install libavcodec-extra-53

hinterher geschoben werden.

Danach lässt sich ein Video sehr einfach konvertieren mit

avconv -i MOVI0000.avi -s 640x360 -vcodec libx264 MOVIE0000.mp4

 Ein solches Video lässt sich sehr einfach einbetten in HTML-Code mit

 <video width="640" height="360" controls autoplay >..
    <source src="MOVIE0000.mp4" type="video/mp4">..
    Sorry, dein Browser unterstützt kein HTML5 Video...
    </video>


Um die spätere Anzeige grafisch etwas aufzupeppen, bietet es sich an, Thumbnails der Videos zu erstellen. Möchte man von jedem mp4 Video ein Screenshot erstellen und als jpg speichern, lässt sich folgender Einzeiler verwenden:

for i in *.mp4; do avconv -i "$i" -ss 00:00:05 -s 320x180 -vsync 1 -qscale 1 -vframes 1 "${i%.mp4}.jpg"; done

Damit wird das aktuelle Verzeichnis gescannt, alle mp4 Dateien mit avconv bearbeitet und nach 5 Sekunden Laufzeit ein jpg-Bild im Format 320*180 Pixel gespeichert. Die Auflösung müsste je nach Ausgangsmaterial angepasst werden, um unschöne Ergebnisse zu vermeiden.


Wenn das soweit läuft, lässt sich auch schnell etwas scripten. Mit diesem kleinen Beispiel werden alle mp4 Dateien im Ordner "videos" gescannt und per Link aufgeführt. Wenn unter dem gleichen Dateinamen - mit der Endung jpg - eine Datei existiert, wird diese als Vorschaubild angezeigt und bei Klick auf den Link wird das entsprechende Video angezeigt.

// Verzeichnis, in dem die Videos und Vorschaubilder abgelegt sind
//
$dir="videos";
$directory=scandir($dir);
// Wenn Aktion gewählt, erstelle HTML-Gerüst für die selektiert Videodatei
//
if($_GET['action']=="show")
{
    $datei=$dir . "/" . strip_tags($_GET['file']);
    echo "<video width=\"1280\" height=\"720\" controls autoplay >";
    echo "<source src=\"$datei\" type=\"video/mp4\">";
    echo "Sorry, your browser doesn't support HTML5 video...";
    echo "</video><hr>";
}
// Gehe alle Dateien des Verzeichnisses durch
//
foreach($directory as $file)
{
    // Endung mp4?
    if(preg_match("/mp4$/", $file))
    {
        $datei = $dir . "/" . $file;
        $size=filesize($datei); // Dateigröße holen
        $creationdate=date("Y-m-d" ,filectime($datei)); // Erstellungsdatum der Datei
        // Gibt es eine Vorschaudatei?
        $thumbnail=$dir . "/" . str_replace("mp4","jpg",$file);
        $description="";
        if(file_exists($thumbnail))
        {
                 $description ="<img src=\"$thumbnail\" width=\"300\"> <br>";
         }
       $description.=$file . " " . human_filesize($size) . "  [$creationdate]";
       echo "<a href=\"" . $_SERVER['PHP_SELF'] . "?action=show&    file=$file\">$description</a><br>";
    }
}
function human_filesize($bytes, $decimals = 2) {
  $sz = 'BKMGTP';
  $factor = floor((strlen($bytes) - 1) / 3);
  return sprintf("%.{$decimals}f", $bytes / pow(1024, $factor)) . @$sz[$factor];
}

22.3.15

Wansview und andere Webcams ansteuern mit PHP und einfügen in FHEM

Seit neuestem bin ich Besitzer einer Wansview NC M620W.


Steuerung über PHP-Scripte

Kamera nach rechts drehen

$url="http://192.168.1.202";
$getstring="/web/cgi-bin/hi3510/param.cgi?cmd=ptzctrl&-step=1&-act=right&-speed=13";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url . $getstring);
//curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
//curl_setopt($ch, CURLOPT_USERPWD, 'admin:123456');

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
          'Content-Type: application/xml',
          'Connection: Keep-Alive',
          'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
          'Authorization: Basic [BASE64HASH]'
         
                                            ));
$data = curl_exec($ch);
echo $data;
curl_close($ch);


Einbindung in FHEM:

Dank dieser Anleitung hat es geklappt!


1. FHEM HTTPSRV aktiviert (in fhem.cfg):
define myCamWeb HTTPSRV cam /usr/share/web CAM

2. In /usr/share/web Datei index.html erstellt mit folgendem Inhalt:
<embed type="application/x-vlc-plugin" width= "1024" height= "768" name="player" autoplay="yes" loop="yes" target="rtsp://[Benutzer]:[Passwort]@192.168.1.202:554" />
3.  FHEM aktualisieren
4. Weblink erstellen (in Kommandozeile von FHEM):
define weblink_test weblink iframe https://<ip von fhem>/fhem/cam/index.html



Update:

Kamera fittek Tenvis

Steuerung
curl -H "Authorization: Basic YWRtaW46cmfdaHRub3c5OQ==" "http://192.168.178.221/web/cgi-bin/hi3510/ptzctrl.cgi?-step=1&-act=up&-speed=45"

Geht nicht: (?)
curl --digest -u "admin:2222" "http://192.168.178.223"



5.1.15

Deutsches Datum mit PHP - Anpassung von setlocale

Problem:

Trotz setlocale(LC_ALL, 'de_DE') wollte die Ausgabe eines deutschen Datums nicht gelingen.

Schuld war der nicht unter diesem Namen installierte  deutsche Zeichensatz.

Unter Linux lässt sich mittels

locale -a

anzeigen, welche Zeichensätze installiert sind.

Dort aufgeführt war u.a.

de_DE.utf8


Die Änderung

setlocale(LC_ALL, 'de_DE.utf8');

erbrachte die Lösung!

Schnell überprüfen lässt sich das durch die Ausgabe von

print(strftime('%A %B'));


30.10.14

JPGraph unter Ubuntu 12.04

Nach dem Downloaden des Paketes wollte ich mir die Beispiele ansehen, allerdings kam immer die Meldung

The function imageantialias() is not available in your PHP installation. Use the GD version that comes with PHP and not the standalone version

Nach einigem Googlen hatte ich zunächst versucht PHP mit der GD-Bibliothek erneut zu compilieren, bin dabei aber grandios gescheitert :(

Gut, dass Google nach weitere Treffer lieferte. Nach Auskommentieren der folgenden Else-Anweisung in der Funktion der Datei
jpgraph/gd_image.inc.php
     function SetAntiAliasing($aFlg=true) {
        $this->use_anti_aliasing = $aFlg;
        if( function_exists('imageantialias') ) {
            imageantialias($this->img,$aFlg);
        }
        else {
            //JpGraphError::RaiseL(25128);//('The function imageantialias() is not available in your PHP installation. Use the GD version that comes with PHP and not the standalone version.')
        }
    }

Dann hatte ich noch das Problem, dass die TTF-Fonts nicht vorhanden waren.
Arial.ttf und arialbd.ttf mussten installiert werden mittels
apt-get install ttf-mscorefonts-installer
 Diese befinden sich dann im Pfad:

/usr/share/fonts/truetype/msttcorefonts/

Ein Zugriff war jedoch weiterhin nicht möglich.
Fehlermeldung:

 PHP Warning:  file_exists(): open_basedir restriction in effect

Das bedeutet, dass PHP keine Rechte für das entsprechende Verzeichnis, in dem die Fonts liegen, besitzt.
Diese Restriktion habe ich innerhalb der Domainkonfiguration des Apache ausgeschaltet

<Directory />
php_admin_value open_basedir none
.......
</Directory>

Evtl. müssen die Fonts noch entsprechend kopiert werden oder die Config von JPGraph angepasst werden.




18.9.13

Screenshots mit PHP erstellen

aptitude install imagemagick wkhtmltopdf
<?php
 
// save this snippet as url_to_png.php
// usage: php url_to_png.php http://example.com
if (!isset($argv[1])){
    die("specify site: e.g. http://example.com\n");
}
 
$md5 = md5($argv[1]);
$command = "wkhtmltopdf $argv[1] $md5.pdf";
exec($command, $output, $ret);
if ($ret) {
    echo "error fetching screen dump\n";
    die;
}
 
$command = "convert $md5.pdf -append $md5.png";
exec($command, $output, $ret);
if ($ret){
    echo "Error converting\n";
    die;
}
 
echo "Conversion compleated: $argv[1] converted to $md5.png\n"; 
  

Whois-Klasse für PHP

Nach längerer Zeit habe ich mich mal wieder auf die Suche nach einer guten PHP-Klasse für Whois-Abfragen begeben.
Und jetzt bin ich endlich fündig (und glücklich) geworden :)

Hier findet ihr eine Klasse, die endlich das tut, was sie soll.

Chapeau!

23.7.13

PHP und JS Schnipsel - Datumsfunktionen

Datum aus einer MySQL-Datenbank formatieren:


$datum_de = date("d.m.Y ", strToTime($datum));



Datumspicker mit jquery einbinden:

  1. Framework und CSS einbinden 
    <script type="text/javascript" src="http://code.jquery.com/jquery-1.9.1.js"</script>
    <script type="text/javascript" src="http://code.jquery.com/ui/1.10.3/jquery-ui.js">
    </script> <link rel="stylesheet" href="http://code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css" type="text/css" />
  2. Funktion definieren (geht auch ohne PHP :))
function datepicker($fieldId)
{
    ?>
    <script type="text/javascript">

        jQuery(function($){
            $.datepicker.regional['de'] = {clearText: 'enternen', clearStatus: 'Auswahl löschen',
                closeText: 'schließen', closeStatus: 'Änderungen nicht übernehmen',
                prevText: 'vorheriger Monat', prevStatus: 'vorheriger Monat',
                nextText: 'nächster Monat', nextStatus: 'nächster Monat',
                currentText: 'heute', currentStatus: '',
                monthNames: ['Januar','Februar','März','April','Mai','Juni',
                    'Juli','August','September','Oktober','November','Dezember'],
                monthNamesShort: ['Jan','Feb','Mär','Apr','Mai','Jun',
                    'Jul','Aug','Sep','Okt','Nov','Dez'],
                monthStatus: 'anderer Monat', yearStatus: 'anderes Jahr',
                weekHeader: 'Wo', weekStatus: 'Woche des Monats',
                dayNames:
                    ['Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag'],
                dayNamesShort: ['So','Mo','Di','Mi','Do','Fr','Sa'],
                dayNamesMin: ['So','Mo','Di','Mi','Do','Fr','Sa'],
                dayStatus: 'Setze DD als ersten Wochentag', dateStatus: 'Wähle D, M d',
                dateFormat: 'yy-mm-dd', firstDay: 1,
                changeMonth: true,
                changeYear: true,
                initStatus: 'Bitte wählen Sie ein Datum', isRTL: false};
            $.datepicker.setDefaults($.datepicker.regional['de']);
        });
        $(function() {
            <?php echo "\$(\"#" . $fieldId . "\").datepicker();";
            ?>
        });

    </script>
    <?php
}

29.4.13

Verschlüsselte Verbindung mit MySQL Server

Diese Anleitung ist sehr gut, jedoch gab es bei immer noch folgende Fehlermeldung, obwohl die Rechte zu den Pfaden mit chown mysql:mysql entsprechend angepasst wurden:

SSL error: Unable to get certificate from '/etc/ssl/mysql/server.cert'
130429 13:09:59 [Warning] Failed to setup SSL
130429 13:09:59 [Warning] SSL error: Unable to get certificate

Erst dieser Fund hat die Lösung gebracht.

Und wieder war Apparmor mein Problem :(

Auch diese Anleitung ist ganz gut gemacht :)


26.10.12

Header nur auf erster Seite bei TCPDF

TCPDF ist eine sehr schöne Klasse, um mit PHP PDF-Dateien zu generieren.
Was ich allerdings bei den Beispielen nicht finden konnte ist die Möglichkeit, einen Header nur auf der ersten generierten Seite anzeigen zu lassen.

Doch das ist ziemlich einfach, nach dem Includieren von TCPDF wird die Klasse erweitert mit

class MYPDF extends TCPDF
{

Dann könnte man eine Variable definieren, mit der man je nach Anwendungsfall das Generieren des Headers auf jeder Seite  ein- oder abschalten kann:

public $showHeaderOnlyOnFirstPage = true;

Anschließend wird die Header-Funktion modifiziert:

public function Header()
    {
       
        if($this->showHeaderOnlyOnFirstPage &&  $this->page>1) return;

 Danach folgen die weiteren Anweisungen für den Header, wie beispielsweise:

// Logo
        $logo = K_PATH_IMAGES . PDF_HEADER_LOGO;
        $wappen = K_PATH_IMAGES . PDF_HEADER_LOGO_NDS;
        //echo $logo; echo "<br>" . $wappen;
        $this->Image($logo, 25, 10, 25, '', 'JPG', '', 'T', false, 250, '', false, false, 0, false, false, false);
        $this->Image($wappen, 170, 10, 16, '', 'JPG', '', 'T', false, 300, '', false, false, 0, false, false, false);
        // Set font
        $this->SetFont('helvetica', '', 16);
        // Title
        $this->SetXY(65, 15);
        $this->Cell(10, 15, PDF_HEADER_TITLE, 0, false, 'M', 0, '', 0, false, 'M', 'M');
........

Einfach, oder??



7.9.12

Formulare erstellen mit der Formbuilder Klasse

Den Source-Code gibt es hier:

php-form-builder-class


Aktuell ist Version 3.0, Beispiele zum einfachen Einbau in die eigene Seite sind dort ebenfalls zu finden.
Mein Problem war folgende Fehlermeldung:

 PHP Fatal error:  Class 'Element_HTMLExternal' not found in ........

Irgendwie gab es diese Klasse in dem heruntergeladenen Paket nicht.
Lösung: selber anlegen
class Element_HTMLExternal extends Element_HTML {}
oder in den Scripten die Zeilen mit

new Element_HTMLExternal
in
new Element_HTML
ändern.

15.8.12

Whois für PHP einrichten (Ubuntu 12)



Installation:


apt-get install php-net-whois
&
apt-get install  php-net-socket

 Apache neu starten

 Aufruf:

require_once 'Net/Whois.php';
$nw = new Net_Whois;
echo $nw->query ("linux.ie");

GeoIP für Ubuntu einrichten

apt-get install php5-geoip
Download von GeoLiteCity.dat von Maxmind.com  und kopieren nach
/usr/share/GeoIP/GeoIPCity.dat (<- Umbenennen!).


Aufruf:
$geo = geoip_record_by_name($ip);

Openhab und Ecoflow Max - API Anbindung

 Ich wollte die neu erworbene Powerstation in Openhab einbinden, um den aktuellen Status (Ladestand etc.) über Openhab auswerten zu können. ...