Hinweise zu PHP-Modulen
Arbeit mit Datenbanken
Mit PHP sind Zugriffe auf Datenbanken einfach möglich → Datenbank-Service des URZ für MySQL- und PostgreSQL-Datenbanken.
Dokumentation
- Allgemein: PHP und Datenbanken
- MySQL:
Die ursprüngliche mysql-Erweiterung mit Funktionen wie
mysql_connect
undmysql_query
wird ab PHP 7 nicht mehr unterstützt. PHP-Programmierer müssen eine dieser verbesserten APIs verwenden (Vergleich):- PDO – PHP Data Objects: Tutorial mit Beispielen (englisch) – PDO_MYSQL
- mysqli-Erweiterung: Beschreibung
- MySQL Server Reference Manual (englisch))
- PostgreSQL:
Sicherheit
- Sichere Geheimnisse für Webanwendungen zum Schutz des Datenbank-Passwortes
- Schutz vor SQL Injection
Prüfen von E-Mail-Adressen
Wenn in Formularen E-Mail-Adressen abgefragt werden, müssen die vor einer Verwendung unbedingt überprüft werden.
Benutzen Sie dazu die TUCAL-Funktion check_mailadr()
.
<?php
# Absende- und Zieladressen müssen verifiziert sein –
# nicht ohne Prüfung aus einem Webformular übernehmen!
# Da können Tippfehler passieren und böswillige Eingaben gemacht werden.
require_once('php/mail.inc'); # definiert check_mailadr
$error = check_mailadr($_POST['an']); # Prüfen der Fomulareingabe "an"
if ($error) {
echo 'Fehler in der Mail-Adresse: ' . htmlspecialchars($error);
exit;
}
# Die Funktion kann nicht garantieren, dass die E-Mail-Adresse
# 100% richtig ist und eine Mail dahin ankommt.
# Es wird geprüft, ob die Adresse syntaktisch richtig ist
# und die Domain hinter dem @ existiert.
?>
Senden von E-Mail
Mit PHP können auch E-Mails versendet werden. Aber Achtung:
Dies sollte keine Funktion sein, die öffentlich zugänglich ist oder sehr viele E-Mails versendet – im Zweifelsfall bitte nachfragen!
Damit die Absende-Adresse richtig gesetzt und der Zeichensatz richtig bestimmt wird, gibt es eine eigene Funktion dieses Servers:
tuc_mail()
– Beschreibung siehe Versenden von E-Mail:
<?php
require_once('php/mail.inc'); # definiert tuc_mail()
# Ein Empfaenger
$to = 'Max Mustermann <max.mustermann@hrz.tu-chemnitz.de>';
# Bei mehreren Empfängern: array() -> wird als Bcc versendet
# $to = array('maxi.musterfrau@hrz.tu-chemnitz.de', 'max.mustermann@hrz.tu-chemnitz.de');
# Absender, muss aus *.tu-chemnitz.de sein!
$from = 'Frank Richter <frank.richter@hrz.tu-chemnitz.de>';
# Subject = Betreff, möglich: Umlaute in UTF-8 oder Latin1- (ISO-8859-1)
$subject = 'PHP-Test';
# Inhalt, auch hier Umlaute möglich
$text = 'Dies ist eine Test-Nachricht, ausgelöst durch ' .
$_SERVER['REMOTE_ADDR'];
# Antwort an - hier nicht gesetzt:
$reply_to = '';
$ok = tuc_mail($to, $from, $subject, $text, $reply_to);
if ($ok === TRUE)
echo "E-Mail wurde versendet.";
else
echo "Fehler beim Versenden: " . htmlspecialchars($ok);
?>
tuc_mail()
nicht einsetzen können oder wollen, beachten Sie bitte unbedingt die
<?php
# Der Funktion mail() müssen Sie im 5. Argument unbedingt nochmals den Absender angeben,
# damit auch Fehler-Mails an den Absender ankommen (und nicht an den Serverbetreiber)
# Absender setzen: muss unbedingt eine gültige Adresse der TU Chemnitz sein!
# Nicht aus einem Formular übernehmen!
$from = "mail@...tu-chemnitz.de";
# Absende- und Zieladressen müssen verifiziert sein –
# nicht ohne Prüfung aus einem Webformular übernehmen!
require_once('php/mail.inc'); # definiert check_mailadr
$error = check_mailadr($_POST['an']);
if ($error) {
echo 'Fehler in der Mail-Adresse: ' . htmlspecialchars($error);
exit;
}
# $betreff und $text müssen Sie selbst richtig kodieren
# Diesen Absender zweimal setzen: vvvv vvvvvvv
mail($an, $betreff, $text, "From: $from", "-f $from" );
?>
Mit tuc_mail()
können nur Text-Mails ohne Anhang gesendet werden.
Für erweiterte Funktionen nutzen Sie auf den zentralen Servern
das Modul PHPMailer
:
- Beispiel
<?php // Beispiel für die Nutzung von PHPMailer zum Senden einer HTML-E-Mail mit 2 Anhängen // PHPMailer 6.X einbinden: require('libphp-phpmailer/autoload.php'); use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; // Neue PHPMailer-Instanz erzeugen $mail = new PHPMailer; // Absender: Adresse, Klartext $mail->setFrom('...@...tu-chemnitz.de', 'Webmaster'); // Empfänger An / To: - der Klarname ist optional $mail->addAddress('empfaenger@domain', 'Vorname Name'); // Empfänger Kopie / Cc: // $mail->addCC('nutzer@domain'); // Empfänger Blindkopie / Bcc: // $mail->addBCC('nutzer@domain'); // $mail->addBCC('nutzer2@domain2'); // Betreff / Subject $mail->Subject = 'Eine HTML-Mail mit zwei Anhängen'; // Optional: Antwort-An / Reply-to: // $mail->addReplyTo('...@...tu-chemnitz.de'); // Optional: beliebigen Mail-Header setzen $mail->addCustomHeader('X-Mein-Header', 'True'); // Zeichensatz des Textinhalts $mail->CharSet = 'UTF-8'; // Lies HTML-Inhalt von Datei, konvertiert externe Bilder in eingebettete, // und erzeugt Nur-Text-Alternative für Empfänger ohne HTML-Mailprogramm $mail->msgHTML(file_get_contents('contentsutf8.html'), dirname(__FILE__)); // Falls eigener Nur-Text-Inhalt gewünscht: // $mail->AltBody = 'Der HTML-Inhalt sollte hier als normaler Text stehen.'; // Hänge ein PDF an $mail->addAttachment('datei.pdf'); // Hänge einen Termin im ICS-Format an $mail->addAttachment('termin.ics', 'Termineinladung', 'quoted-printable', 'text/calendar'); // Sende die E-Mail, prüfe auf Fehler if ($mail->send()) { echo 'E-Mail gesendet.'; } else { echo 'Fehler beim Senden: ' . $mail->ErrorInfo; }
- Tutorial (Englisch)
Verschleiern von E-Mail-Adressen
E-Mail-Adressen dürfen nicht im Klartext auf Webseiten stehen, damit Werbe-Mail-Sender keine E-Mail-Adressen „einsammeln“ können. Zum Verschleiern von E-Mail-Adressen (und auch anderen Daten, wie z.B. Telefonnummern) kann eine PHP-Funktion benutzt werden:
<?php require_once('php/mail.inc');
# Erste Subdomain angezeigt, wenn innerhalb des Campusnetzes aufgerufen
echo prot_mailadr('max.mustermann@s2006.tu-chemnitz.de');
# nach dem @ weggeschnitten:
echo prot_mailadr('maxi.musterfrau@s2010.tu-chemnitz.de', 1);
# geht auch für eine Tel/Fax-Nummer, wenn das 2. Argument ein Zahl: wie viel wird angezeigt
echo prot_mailadr('0371 / 531 12345', 11);
# wenn das 2. Argument eine Zeichenkette, wird diese angezeigt
echo prot_mailadr('0371 / 531 12345', 'Telefonnummer');
?>
Auf der erzeugten Webseite steht: max.mustermann@… maxi.musterfrau@… 0371 / 531 … Telefonnummer
Bevor die Adresse bzw. die Daten angezeigt werden, muss man noch einen Code abtippen – außer als angemeldeter Nutzer.
Funktionen für VoIP-Telefonie
Die VoIP-Telefone der TU Chemnitz können via Web gesteuert werden.
So kann per Klick das Wählen einer Telefonnummer an Ihrem Telefon (mit persönlicher Anmeldung) vorbereitet werden
(Click2Dial). Auch dafür gibt es eine vorbereitete PHP-Funktion telnu()
.
<?php require_once('php/tel.inc');
echo "Ruf doch mal an: " . telnu('123456');
?>
Abfrage von LDAP-Daten
Im zentralen LDAP-Server der TU Chemnitz stehen wesentliche Informationen zu Benutzern der TU. Diese sind auch mit PHP-Funktionen abfragbar. Zur Vereinfachung existieren einige vordefinierte Funktionen, die Sie benutzen können.
Hinweis: Hierbei handelt es sich um personenbezogene Daten. Beachten Sie unbedingt entsprechende Datenschutzbestimmungen!
Zur Verwendung muss im Seitenkopf die Datei php/ldap.inc
eingeschlossen werden:
# LDAP-Funktionen einbinden
require_once('php/ldap.inc');
- Daten für ein spezifisches Loginkennzeichen abfragen
- Abfragen mehrerer Datensätze entsprechend einem Filter
Daten für ein Loginkennzeichen abfragen
$info = ldap_userinfo('loginkennzeichen');
Fragt das LDAP-Verzeichnis nach Daten für den Benutzer mit 'loginkennzeichen'
ab und liefert ein Feld mit entsprechenden Daten.
Rückgabewert
Ein Array $info
mit Attributen und Werten:
$info['name']
- Vorname Name (UTF-8)
$info['nachname']
- Nachname (UTF-8)
$info['vorname']
- Vorname (UTF-8)
$info['mail']
- E-Mail-Adresse
$info['tel']
- Telefonnummer
$info['ou']
- immatr. Fakultät bzw. Struktureinheit
$info['ous']
- array mit evt. mehreren Struktureinheiten der Person
$info['ounumber']
- Strukturnummer
$info['ounumbers']
- array mit evtl. mehreren Strukturnummern der Person
$info['login']
- Loginkennzeichen
$info['adresse']
- Straße, PLZ Ort
$info['raum']
- Raumnummer
$info['raumlink']
- Link zu Campusfinder für Raum
$info['titel']
- akademischer Titel (falls erfasst)
$info['gebaeude']
- veraltet: Gebäude
<?php
# TUCAL
require_once('../../config.inc');
seite(__FILE__);
?>
<h1>Informationen zu Nutzer otto</h1>
<p>
<?php
require_once('php/ldap.inc');
require_once('php/mail.inc'); # für prot_mailadr
require_once('php/tel.inc'); # für telnu()
$info = ldap_userinfo('otto');
echo '<br />Nachname: ' . htmlspecialchars($info['nachname']);
echo '<br />Vorname: ' . htmlspecialchars($info['vorname']);
# Mit Spamschutz für E-Mail-Adresse
echo '<br />E-Mail: ' . prot_mailadr($info['mail']);
# Mit "click2dial" für lokale Benutzer
echo '<br />Telefon: ' . telnu($info['tel']);
echo '<br />Adresse: ' . htmlspecialchars($info['adresse']);
echo '<br />Raum: ' . htmlspecialchars($info['raum']);
echo '</p><p>Das von ldap_userinfo() gelieferte komplette Array:</p>';
echo '<pre>' . print_r($info, true) . '</pre>';
?>
Bitte beachten Sie: Im öffentlichen Verzeichnis sind Daten aller TU-Mitarbeiter/innen enthalten. Studierende können der Veröffentlichung der Daten widersprechen – diese Daten sind dann nicht abrufbar. Daten beurlaubter Mitarbeiter oder Externer sind ebenfalls nicht abrufbar.
Abfragen mehrerer Datensätze entsprechend einem Filter
$infos = ldap_info('filter');
Sie können Datensätze mehrerer Personen anhand eines LDAP-Filters abfragen.
Rückgabewert
Ein zweidimensionales Array $infos
sortiert nach Nachnamen, je gefundenem Nutzer ein Feld mit Attributen wie bei ldap_userinfo()
(s. o.):
$info[0]['name']
- Vorname Name (UTF-8) zu Person 1
$info[0]['nachname']
- Nachname (UTF-8) zu Person 1
- …
- …
$info[1]['name']
- Vorname Name (UTF-8) zu Person 2
- …
- …
<?php
# TUCAL
require_once('../../config.inc');
seite(__FILE__);
?>
<h1>E-Mail und Telefonverzeichnis für 1342… </h1>
<?php
require_once('php/ldap.inc');
require_once('php/mail.inc'); # für prot_mailadr
require_once('php/tel.inc'); # für telnu()
## Hier: Suche nach Strukturnummer 1342…
$infos = ldap_info('ouNumber=1342*');
# zwei Strukturnummern, z. B.
# $infos = ldap_info('(|(ouNumber=231533)(ouNumber=231531))');
if (count($infos) <= 0) {
echo "Kein Ergebnis ...";
} else {
echo <<<KOPF
<table class="horizontal"><tr><th>Nachname</th><th>Vorname</th><th>E-Mail</th><th>Telefon</th></tr>
KOPF;
for ($i = 0; $i < count($infos); $i++) {
echo '<tr>';
echo '<td>' . htmlspecialchars($infos[$i]['nachname']) . '</td>';
echo '<td>' . htmlspecialchars($infos[$i]['vorname']) . '</td>';
# Mit Spamschutz für E-Mail-Adresse
echo '<td>' . prot_mailadr($infos[$i]['mail']) . '</td>';
# Mit "click2dial" für lokale Benutzer
echo '<td>' . telnu($infos[$i]['tel']) . '</td>';
echo "</tr>\n";
}
echo "</table>\n";
}
?>
Daten für eine öffentliche LDAP-Gruppe abfragen
$members = ldap_groupinfo('grp:name');
Fragt das LDAP-Verzeichnis nach den Mitgliedern der Gruppe mit dem Namen 'grp:name'
ab und liefert ein Feld mit entsprechenden Daten.
Rückgabewert
Ein Array $members
mit den Loginkennzeichen der Gruppenmitglieder
Grafiken und PDF-Dokumente
Unsere PHP-Installation enthält die Erweiterung GD zum Umgang mit Grafiken. Die kommerzielle PDFlib zum Bearbeiten von PDF-Dateien ist nicht mehr verfügbar.
Zum Erzeugen von PDF-Dokumenten bitte LaTeX verwenden – Kommando: pdflatex
.
Die PHP-Anweisungen:
<?php
// Autor: Jens Pönisch https://www-user.tu-chemnitz.de/~poenisch/
require_once('FunctionGraph.class.php');
$graph = new FunctionGraph(600, 400, 10, 5);
// Funktionsname gesetzt und gültig? Wenn nein, dann leer setzen
if (isset($_REQUEST['function']) && $graph->valid_func($_REQUEST['function'])) {
$function = $_REQUEST['function'];
} else {
$function = '';
}
// cmd schaltet zwischen Bild und Formular um
if (isset($_REQUEST['cmd']) && $_REQUEST['cmd'] == 'img') {
// Aufruf mit Parameter img: Bild berechnen
header('Content-type: image/png');
$graph->drawAxes();
if ($function) {
$graph->drawFunction($function, 0.01);
}
// Bild schreiben
$graph->writePNG();
$graph->destroy();
} else {
require_once('../../config.inc');
seite(__FILE__);
$select = $graph->select_func($function);
$function_r = rawurlencode($function);
?>
<h1>Beispiel: Grafiken mit der GD-Erweiterung</h1>
<p>
<img alt="" src="gd.php?cmd=img&function=<?php echo $function_r ?>">
</p>
<form action="#" method="post" target="_self">
<label>Neue Funktion f(x) = <?php echo $select ?> (x)</label>
<button type="submit" name="cmd" value="form" style="margin-left:4em"><strong>Absenden</strong></button>
</form>
<?php
}
?>
<?php
class FunctionGraph {
var $x0;
var $y0;
var $x1;
var $y1;
var $posX0;
var $posY0;
var $scale;
var $img;
var $bg;
var $col0;
var $col1;
var $funcs = array('sin', 'cos', 'tan');
function __construct($width, $height, $x1 = 2, $y1 = 2)
{
$this->x0 = -$x1;
$this->y0 = -$y1;
$this->x1 = $x1;
$this->y1 = $y1;
$this->posX0 = $width/2;
$this->posY0 = $height/2;
$this->scale = (double)($width-20)/($this->x1-$this->x0);
$this->img = imagecreate($width, $height);
$this->bg = imagecolorallocate($this->img, 255, 255, 255);
$this->col0 = imagecolorallocate($this->img, 0, 0, 0);
$this->col1 = imagecolorallocate($this->img, 0, 127, 0);
}
function valid_func($f = '') {
return in_array($f, $this->funcs);
}
function select_func($f = '') {
$opts = '';
foreach ($this->funcs as $func) {
$opts .= '<option value="' . htmlspecialchars($func) . '"' . ($func == $f ? ' selected' : '') . '>' . $func . '</option>';
}
return '<select name="function">' . $opts . '</select>';
}
function drawAxes() {
imageline($this->img, $this->posX0 + (int)($this->x0*$this->scale)-2,
$this->posY0,
$this->posX0 + (int)($this->x1*$this->scale)+2,
$this->posY0, $this->col0);
imageline($this->img, $this->posX0,
$this->posY0 - (int)($this->y0*$this->scale)+2,
$this->posX0,
$this->posY0 - (int)($this->y1*$this->scale)-2, $this->col0);
for ($x = 1; $x <= $this->x1; $x += 1) {
imageline($this->img, $this->posX0+(int)($x*$this->scale),
$this->posY0-3,
$this->posX0+(int)($x*$this->scale),
$this->posY0+3, $this->col0);
imageline($this->img, $this->posX0-(int)($x*$this->scale),
$this->posY0-3,
$this->posX0-(int)($x*$this->scale),
$this->posY0+3, $this->col0);
}
for ($y = 1; $y <= $this->y1; $y += 1) {
imageline($this->img, $this->posX0-3,
$this->posY0-(int)($y*$this->scale),
$this->posX0+3,
$this->posY0-(int)($y*$this->scale), $this->col0);
imageline($this->img, $this->posX0-3,
$this->posY0+(int)($y*$this->scale),
$this->posX0+3,
$this->posY0+(int)($y*$this->scale), $this->col0);
}
}
function drawFunction($function, $dx = 0.1) {
$xold = $x = $this->x0;
# eval("\$yold=".$function.";");
$yold = $function($x);
# echo "$function.$yold.";
for ($x += $dx; $x <= $this->x1; $x += $dx) {
# eval("\$y = ".$function.";");
$y = $function($x);
imageline($this->img, $this->posX0+(int)($xold*$this->scale),
$this->posY0-(int)($yold*$this->scale),
$this->posX0+(int)($x*$this->scale),
$this->posY0-(int)($y*$this->scale), $this->col1);
$xold = $x;
$yold = $y;
}
}
function writePNG() {
imagepng($this->img);
}
function destroy() {
imagedestroy($this->img);
}
}
Social-Media-Funktionen: „Gefällt mir!“ usw.
Damit können Webautoren sehr einfach „Teilen“ und „Gefällt mir!“ von Facebook sowie Empfehlungen an Twitter und LinkedIn in eine Webseite einfügen. Umgesetzt wurde die 2-Klick-Lösung für mehr Datenschutz des Heise-Verlags. Darstellung und Funktion sehen Sie auf dieser Seite unten.
- Vorteil: Bei Besuch unserer Webseiten werden keine Daten unserer Webbesucher an die Dienste übermittelt. Erst wenn der Benutzer klickt, werden die Funktionen eingebunden und Daten an die Anbieter der sozialen Dienste übermittelt.
- Nachteil: Der Besucher muss zwei Mal klicken, um die Aktion wirklich auszulösen.
Zum Einbinden dieser Funktion muss die Datei php/sm.inc
eingeschlossen werden:
# Nutzung von Social-Media-Funktionen
require_once('php/sm.inc');
Zur Beachtung:
- Browser muss JavaScript unterstützen, sonst werden diese Funktionen nicht wirksam.
- Webseite muss jQuery einbinden (ist standardmäßig der Fall).
Funktionen
string sm_share([string $orientation [, NULL, NULL, array $services]])
erzeugt HTML/Script-Code zum Einbinden von Facebook/Twitter/LinkedIn-Funktionen
Parameter
$orientation |
'h' (Standard), 'v' |
Aussehen: horizontal (nebeneinander), vertikal (untereinander) |
NULL |
leer lassen | wird nicht benutzt, leerer String ist auch möglich ( '' ) |
NULL |
leer lassen | wird nicht benutzt, leerer String ist auch möglich ( '' ) |
$services |
array() |
Welche Dienste, z. B. array('facebook', 'twitter', 'linkedin'); Werte siehe Beschreibung, Option data-services (nicht alles bei uns umgesetzt) |
Rückgabewert
HTML-Text, kann mit echo
ausgegeben werden.
Zeigt die Funktionen für soziale Netzwerke nebeneinander an.
<?php require_once('php/sm.inc');
echo sm_share();
?>
Zeigt die Funktionen für soziale Netzwerke untereinander an.
<?php require_once('php/sm.inc');
echo sm_share('v', NULL, NULL, array('twitter', 'facebook', 'linkedin'));
?>