[[php]]
 

PHP

Bücher

  • ISBN-13: 978-3839154090 (PHP für dich: So einfach war PHP-lernen noch nie! von Claudia Unkelbach)

Links

Syntax

PHP-Info

<?php
phpinfo();
?>

if not

<?php
if($var != 'xyz') { }
?>

alle variablen ausgeben

<?php
print_r($_POST);
print_r($GLOBALS, 1);
print_r(get_defined_vars());
print_r(get_declared_classes());
print_r(get_defined_functions());
?>
<?php
        print '$GLOBALS = ' . var_export($GLOBALS, true) . "\n";
?>

Array in Variable speichern

<?php
// Wenn du die Kommata's im Array nicht haben MUSST:
$string = implode(",", $array);
// oder so:
$string = implode(",", $array["artikel"]);
// Wenn doch:
foreach($array as $value)
{
        $string .= $value;
}
// oder so:
foreach($array as $key => $value)
{
        $string .= $key."=".$value;
}
// hier werden aus dem Array nur die Werte von "key=artikel" in der Variablen gespeichert:
foreach ($_REQUEST as $key => $value) {
        if (strncmp($key, "artikel") == 0) {
                $string .= $value;
        }
}
?>

Das global Schlüsselwort

Um die Variablen innerhalb und außerhalb der Funktion zugänglich zu machen, bietet PHP das Schlüsselwort global. Dieses Schlüsselwort ermöglicht es, außerhalb einer Funktion liegende Variablen „in die Funktion hinein“ zu holen. Nur dadurch können sie auch innerhalb der Funktion ihre Gültigkeit besitzen und z.B. ausgegeben werden.

Beachten Sie, dass eine Änderung der Variable, die Sie mittels global für die Funktion sichtbar gemacht haben, nicht nur für die Verwendung innerhalb der Funktion gilt, sondern auch außerhalb.

?>
<?php
$a = 1;
$b = 2;
function Summe()
{
        global $a;
        global $b;
        $a = $a + $b;
}
Summe();
echo $a;
?>

Die Verwendung von GLOBALS

<?php
echo htmlspecialchars(print_r($GLOBALS , 1));
?>
<?php
$name = Fritz;
echo $GLOBALS["name"];
?>
<?php
$a = 1;
$b = 2;
function Summe()
{
        $GLOBALS["a"] = $GLOBALS["a"] + $GLOBALS["b"];
}
Summe();
echo $a;
?>

statische Variablen

Normalerweise würde diese Funktion sinnlos sein, da die Variable „$a“ immer wieder auf „0“ gesetzt wird und nach der Ausgabe erst um „1“ erhöht wird.

Da die Variable „$a“ aber als static deklariert wurde, verliert sie ihren Wert nicht und die Funktion gibt bei jedem Aufruf einen neuen Wert aus, der um „1“ höher ist als der vorhergehende Wert.

<?php
function Test()
{
        static $a = 0;
        echo $a;
        $a++;
}
?>

Static-Variablen ermöglichen auch einen Weg zum Umgang mit rekursiven Funktionen. Das sind Funktionen, die sich selbst aufrufen. Hierbei besteht die Gefahr, so genannte Endlos- Schleifen zu programmieren. Sie müssen also einen Weg vorsehen, diese Rekursion zu beenden. Die folgende einfache Funktion zählt rekursiv bis 10. Die statische Variable „$zaehler“ wird benutzt, um die Rekursion zu beenden:

<?php
function Test()
{
        static $zaehler = 0;
        $zaehler++;
        echo $zaehler;
        if ($zaehler < 10) {
                Test ();
        }
        $zaehler--;
}
?>

Statische Variablen werden wie in oben stehenden Beispielen deklariert. Das Zuweisen eines Wertes, welcher das Ergebnis eines Ausdrucks ist, wird mit einem parse error quittiert.

Variablen und Dateien

<?php
//
// Inhalt der Variable anzeigen
//
echo $test;
//
// GET-Daten in Variablen schreiben
//
$var1 = $_GET["var1"];
$var2 = $_GET["var2"];
$var3 = $_GET["var3"];
$var4 = $_GET["var4"];
//
// Variablen-Inhalt einem SHELL-Script übergeben
//
$KOMMANDO1 = "/opt/bin/test.sh"." var1=".$var1." var2=".$var2." var3=".$var3." var4=".$var4;
//
// SHELL-Kommando ausführen
//
echo shell_exec("$KOMMANDO1;");
//
// Variablen-Inhalt durch eine Pipe schicken
//
$KOMMANDO2 = "echo"." '".$test."' | /opt/bin/test.sh";
//
// SHELL-Kommando ausführen
//
echo shell_exec("$KOMMANDO2;");
?>

Variable-Inhalt in eine Datei schreiben

hiermit kann man nachsehen, welche Daten z.Z. in den Variablen stehen, alle Variableninhalte werden in die Datei “/tmp/GLOBALS.txt“ geschrieben:

<?php
$dateiname = "/tmp/GLOBALS.txt";
$handler = fOpen($dateiname , "a+");
fWrite($handler , print_r($GLOBALS, 1));
fClose($handler);
?>

Inhalt der Variablen „$test“ wird in die Datei “/tmp/test.txt“ geschrieben:

<?php
$dateiname = "/tmp/test.txt";
$handler = fOpen($dateiname , "a+");
fWrite($handler , $test);
fClose($handler);
?>

Wert aus einer Datei auslesen

Beispiel-Configurationsdatei vorbereiten:

# echo 'RELEASE="1.2.3"' >> /etc/datei.conf
<?php
$cfgverzeichnis=("/etc");
$cfgdatei=("datei.conf");
$cfgdatei_inhalt=file($cfgverzeichnis."/".$cfgdatei);
foreach ($cfgdatei_inhalt as $index => $zeile) {
        if(strncmp($zeile,"RELEASE",7)==0) {
                $release_wert=substr($line,9,strlen($zeile)-11);
        }
}
echo $release_wert;
?>
  1. „RELEASE“ ist die zu suchende Zeichenfolge und sie sie ist „7“ Zeichen lang;
  2. die „9“ gibt die Anzahl der zu überspringenden Zeichen an ('RELEASE=“' → 7+2=9);
  3. „strlen($zeile)“ ist eine interne Funktion, die die Gesamtlänge der Zeile angibt;
  4. es sollen „Gesamtlänge“ minus „11“ Zeichen gelesen werden;
  5. auf „11“ kommt man, in dem die „7“ zu überspringenden Zeichen mit dem abschließenden doppelten Hochkommata (“) und dem Zeilenumbruch addiert werden (die ja jeweils ein weiteres Zeichen dar stellen) ⇒ ('RELEASE=“'+'„\n' → 7+2+2=11);
  6. damit ist die ZEILENLÄNGE minus 11 genau die Zeichenanzahl, die zwischen den doppelten Anführungszeichen stehen;

warten bis eine Datei da ist

Hier ist diese nützliche Funktion:

function auf_datei_warten($wartedatei) {
    $loop_max=100;
    $loop_zahl=0;
    while (!file_exists($wartedatei)) {
        sleep(1);
        $loop_zahl++;
        flush();
        if ($loop_zahl > $loop_max)  {
            return false;
        }       
    }
    return true;
}

und so setzt man sie beispielsweise ein:

if (auf_datei_warten($dateiname)) {
	// Datei ist da, kann los gehen...
	// wir geben der Datei noch eine Sekunde extra
	sleep(1);
} else {
	// Datei ist in der vorgegebenen Zeitspanne nicht eingetroffen. ABBRUCH!
	exit(1);
}

PHP-Script um Spammer zu finden

Um einen Spammer zu finden, der per PHP-Befehl Mails versendet, gibt es einen einfachen Trick - man verwendet ein Handlerscript.

Man lässt die Mails von PHP nicht direkt an sendmail senden, sondern an ein Script, welches zuerst einen Syslog-Eintrag vornimmt und dann die Mail an sendmail weitergibt. Dabei setzt das Script vor die Mail (also als erste Headerzeile) eine Zeile, die den Web-User enthält.

So kann man sowohl im Syslog-Logfile zählen, wer wie viele Mails verschickt wie auch im Header der Mail bei Abuse-Beschwerden sehen, wer die Nachrichten versendet hat.

Folgendes Script kann hier eingesetzt werden:


      #!/bin/bash
      logger -t sendmail-php -- Message sent from $1 &> /dev/null
      (
      echo "X-ConfixxWeb: $1"
      cat
      ) | /usr/sbin/sendmail -t -i

Das Script wird unter /usr/sbin/sendmail-php gespeichert und mit

chmod 755 /usr/sbin/sendmail-php

ausführbar gemacht.

Nun muss man noch dafür sorgen, dass PHP nicht mehr sendmail nutzt, sondern sendmail-php. Dies lässt sich bei Systemen ohne Confixx in den VirtualHost Einstellungen von Apache machen:

      <VirtualHost>
      ...
      php_admin_value sendmail_path "/usr/sbin/sendmail-php www1"
      </VirtualHost>

Auf Rechnern mit Confixx lässt sich das für mehrere User gleichzeitig setzen, wenn man folgende Zeile bei httpd-specials für den User setzt:

      php_admin_value sendmail_path "/usr/sbin/sendmail-php ##user##"

Die Funktion kann man testen, indem man folgendes PHP-Script in ein Webverzeichnis setzt und per http aufruft:

      <?php
        $from="example@server.de";
        $to="deinname@server.de";
        $subject="Testnachricht - bitte loeschen!";
        $message="Testnachricht - bitte loeschen!";
        mail($to, $subject, $message, "From: $from");
        echo "<h1>Die Nachricht wurde versendet.</h1>";
      ?>

Dies sollte folgenden Eintrag im Syslog (/var/log/syslog oder bei Suse /var/log/messages) ergeben:

      Jun 30 18:00:00 hostname sendmail-php: Message sent from www1

Einen Ueberblick erhä man schnell durch folgendes Kommando:

      cat /var/log/syslog | grep sendmail-php

Weiterhin sollte die Nachricht direkt unter den Received Zeilen folgenden Header enthalten:

      X-ConfixxWeb: www1

Spamnachrichten lassen sich damit schnell einem User zuordnen.

Mit folgendem Kommando lä sich herausfinden, welcher User laut aktuellem Syslog wie viele Nachrichten versendet hat:

      grep sendmail-php /var/log/syslog | awk '{print $9}' | sort | uniq -c | sort -n

PHP-Script um das Format von Bildern zu ermitteln

/home/bin/bildformat.php

#!/bin/php
<?php
        #
        #print_r(get_defined_vars());
        #
        $info = getimagesize ($argv['1']);
        print $info['0'] . "x" . $info['1'];
        #print "\n";
        #print $info['3'];
?>

Beispiel

Damit dieses Script unter FreeBSD genauso funktioniert, wie unter Linux, muss ein symbolischer Link angelegt werden:

# ln -s /usr/local/bin/php /bin/

So benutzt man das Script:

# /home/bin/bildformat.php fotos/Bild_0001.jpg
2272x1704
 
Falls nicht anders bezeichnet, ist der Inhalt dieses Wikis unter der folgenden Lizenz veröffentlicht:GNU Free Documentation License 1.2
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki