Eine Anzahl von (Pseudo)Zufallszahlen generieren

24. März 2010, 11:10

Mit folgender Funktion lässt sich eine gewünschte Anzahl von (Pseudo)Zufallszahlen generieren.
Ich benutze es immer, um mir die Zahlen auszugeben, die ich dann im Lotto spiele.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function genNumbers($_min = 1, $_max = 49, $_number = 6) {
  $min    = $_min;
  $max    = $_max;
  $number = $_number;
  $numbers= array();

  $array = range($min, $max);
  srand ((double)microtime()*1000000);
 
  for($x = 0; $x < $number; $x++) {
    $i = rand(1, count($array)) - 1;
    $numbers[] = $array[$i];
    array_splice($array, $i, 1);
  }
  sort($numbers);
 
  return implode(' ', $numbers);
}

Storelocator mit Google-Maps

23. März 2010, 17:54

Habe einen Prototyp für einen Storelocator mit der Google-Maps API programmiert. Die Läden werde in einem Administrationstool erfasst. Die Genauigkeit der Anzeige der einzelnen Adressen auf der Karte hängt natürlich von der Genauigkeit der Adresseingabe selbst ab.

Eine Demo des Storelocators kann man hier finden.

lastInsertID mit MDB2

22. März 2010, 20:39

Mit folgendem Snippet kann man mit der Pear-Klasse MDB2 die ID des letzten eingefügten Datensatzes ermitteln.

1
2
3
4
$sql = 'INSERT INTO benutzer (vorname, name, role) VALUES ("robert", "schneider", 1)';
$res = $db->exec($sql);
if (PEAR::isError($res)) { die($res->getMessage()); }
$uId = $db->lastInsertID('benutzer');

WP-Plugin Custom Footer

27. Februar 2010, 17:53

Kleines Wordpress-Plugin, das es einem Benutzer ermöglichen soll, den Footer einer Seite zu ändern, ohne das HTML-Template bearbeiten zu müssen. Dafür muss in der Datei footer.php des verwendeten Themes lediglich die Funktion wp_footer() eingebunden sein.

Download

Suchen, Ersetzen und reguläre Ausdrücke, Teil 2

28. Februar 2009, 16:21

Diese Funktion führt eine Suchen&Ersetzen-Aktion auf einem Text aus.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function searchReplace($search, $replace, $txt, &$hits = array()) {
  $matches   = array();
  $sItems    = array();
  $rItems    = array();
  $mCounter  = 0;
  $rCounter  = substr_count($replace, '%s');
  $replace   = str_replace('%s', '%1$s', $replace);
 
  preg_match_all($search, $txt, $matches, PREG_OFFSET_CAPTURE);
  $matches   = $matches[0];
  $mCounter  = count($matches);
 
  if($mCounter > 0) {
    for($i = 0; $i < $mCounter; $i++) {
      $sItems[$i] = substr($txt, $matches[$i][1], strlen($matches[$i][0]));
      $hits[$i]   = $sItems[$i];
      $rItems[$i] = sprintf($replace, $sItems[$i]);
    }
    $txt = str_replace($sItems, $rItems, $txt);
  }
 
  return $txt;
}

Als erster Parameter wird ein regulärer Audruck erwartet.
Der zweite Parameter ist eine Zeichenkette, mit der die gefundenen Werte ersetzt werden sollen. Enthält die Zeichenkette die Formatierungsanweisung ‘%s’ (Beschreibung siehe sprintf), so wird jedes Vorkommen dieser Anweisung durch den gefundenen Wert ersetzt.
Als dritter Parameter erwartet die Funktion den Text, auf dem die Aktion ausgeführt werden soll.
Der vierte Parameter ist optional. Dabei kann ein Array per Referenz übergeben werden, das nach der Ausführung der Aktion die gefundenen Werte enthält.

Suchen, Ersetzen und reguläre Ausdrücke, Teil 1

22. Februar 2009, 23:57

Habe hier ein paar reguläre Ausdrücke für verschiedene Textwerte zusammengetragen, die ich während der Programmierung oft verwende. Natürlich könnte man diese noch weiter verfeinern, doch für meine Bedürfnisse waren sie bisher ausreichend.

Dezimalzahl:

'/^[0-9]*$/'

Textfeld:

'/^[a-zA-Z .-]*$/'

E-Mail:

"/^[a-z0-9]+([_\\.-][a-z0-9]+)*" . "@" . "([a-z0-9]+([\.-][a-z0-9]+)*)+" . "\\.[a-z]{2,4}" . "$/"
"'/[a-zA-Z0-9_-]?[a-zA-Z0-9_\.-]+[a-zA-Z0-9_-]?@[a-zA-Z0-9\.-]+\.[a-zA-Z]{2,4}/"

Datum:

'/^\d{2}\.\d{2}\.\d{2,4}$/'

Telefon:

"/[^+-\/0-9 ()]/"

Wer sich ein wenig mit regulären Ausdrücken beschäftigen möchte, findet hier ein sehr gutes Tutorial zu dem Thema.

Die Funktion in_array und 0

19. Februar 2009, 17:06

Habe heute während der Arbeit eine (jedenfalls für mich) überraschende Entdeckung gemacht.

1
2
3
4
$a  = array('str1', 0, 2);
$s  = 'str2';
$f  = in_array($s, $a);
$fs = in_array($s, $a, true);

Wenn man die Funktion in_array ohne dritten Parameter aufruft und sich die 0 im zu testenden Array befindet, so liefert die Funktion immer true zurück. Keine Ahnung ob das wirklich beabsichtigt ist, aber es kann zu schwer auffindbaren Fehlern führen.

Im Beispiel oben hat die Variable $f den Wert true. Indem man den dritten (optionalen) Parameter der Funktion, der eine zusätzliche Typenprüfung vornimmt, auf true setzt, erhält man “das richtige Ergebnis”. Der Wert von $fs ist nun false.

Auswahlliste generieren

22. Januar 2008, 23:13

PHP-Funktion um eine Select-Auswahlliste anhand eines Arrays zu generieren.

1
2
3
4
5
6
7
8
9
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
38
39
40
41
define(NL, "\n");

function getSelect($name, $values, $selected = array(), $emptyField = '', $size = 1, $multiple = false, $eventHandler = '', $cssClass = '') {
  $select = '';
 
  $selected_attr = ' selected="selected"';
  $multiple_attr = ' multiple="multiple"';
 
  $select .= '<select name="' . $name . '" id="' . $name . '" size="' . $size . '"';
  if($multiple)
    $select .= $multiple_attr;
  if(!empty($eventHandler))
    $select .= $eventHandler;
  if(!empty($cssClass))
    $select .= ' class="' . $cssClass . '"';
  $select .= '>' . NL;
 
  if(!empty($emptyField))
    $select .= '<option>' . $emptyField . '</option>' . NL;
   
  for($i = 0; $i < count($values); $i++) {
    $select .= '<option value="' . $values[$i][0] . '"' . (in_array($values[$i][0], $selected) ? $selected_attr : '') . '>';
    $select .= $values[$i][1] . '</option>' . NL;
  }
 
  $select .= '</select>' . NL;
 
  return $select;
}

// example
$data = array();
$data[] = array(1, 'Mazda');
$data[] = array(2, 'Audi');
$data[] = array(3, 'Mercedes');
$data[] = array(4, 'Dacia');

$selected = array(2,4);
echo getSelect('cars', $data, $selected, '', 3, true, '', 'my_cars');
$selected = array(2);
echo getSelect('cars', $data, $selected, '', 1, false, '', 'my_cars');

Blättern-Funktion

9. Januar 2008, 10:53

Diese Funktion erzeugt ein Pagemenu.
Die Konstante OFFSET speichert die Anzahl der Datensätze pro Seite.

1
2
3
4
5
6
7
8
9
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
define('OFFSET', 5);

function leafThrough($total, $start) {
  $pagenav  = '';
  $querystr = '';

  if(!empty($_SERVER['QUERY_STRING'])) {
    $tmp = explode('&', $_SERVER['QUERY_STRING']);
    foreach($tmp as $key => $val) {
      if(substr($val, 0, 6) == 'start=') {
        unset($tmp[$key]);
        break;
      }
    }
    $querystr = implode('&', $tmp) . '&';
  }

  if($total > OFFSET) {
    $pages = intval($total / OFFSET);
    if($total % OFFSET)
      $pages++;
     
    for($i = 1; $i <= $pages; $i++) {
      $fwd  = ($i-1) * OFFSET;
      $link = '<a href="' . $_SERVER['PHP_SELF'] . '?' . $querystr . 'start=' . $fwd . '"%s>' . str_pad($i, 2, '0', STR_PAD_LEFT) . '</a> ';
      $pagenav .= ($start == $fwd ? sprintf($link, ' class="active"') : sprintf($link, ''));
    }
  }

  return $pagenav;
}

// example
$start = (isset($_GET['start']) ? intval($_GET['start']) : 0);
echo 'Records: ' . ($start+1) . ' - ' . ($start+OFFSET) . '<br /><br />';
echo leafThrough(56, $start);

Ordner schützen mit .htaccess

13. Dezember 2007, 14:46

Erzeugt eine .htaccess und eine .htpasswd in dem Ordner, in dem das Script ausgeführt wird.
PHP-Code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function createHtpasswd($name, $user, $passwd) {
  $nl = "\n";

  $path = explode('/', $_SERVER['SCRIPT_FILENAME']);
  array_pop($path);
  $path = implode('/', $path);

  $handle = fopen('.htaccess', 'w');
  fputs($handle, 'AuthType Basic' . $nl);
  fputs($handle, 'AuthName "' . $name . '"' . $nl);
  fputs($handle, 'AuthUserFile ' . $path . '/.htpasswd' . $nl);
  fputs($handle, 'require user ' . $user . $nl);
  fclose($handle);
 
  $handle = fopen('.htpasswd', 'w');
  fputs($handle, $user . ':' . crypt($passwd, 21));
  fclose($handle);
}

if(isset($_POST['generate']))
  createHtpasswd($_POST['name'], $_POST['user'], $_POST['passwd']);

HTML-Formular:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<table cellpadding="3" cellspacing="0">
  <tr>
    <td>AuthName:</td>
    <td><input type="text" name="name" value="" size="40" /></td>
  </tr>
  <tr>
    <td>User:</td>
    <td><input type="text" name="user" value="" size="40" /></td>
  </tr>
  <tr>
    <td>Passwd:</td>
    <td><input type="text" name="passwd" value="" size="40" /></td>
  </tr>
  <tr>
    <td>&nbsp;</td>
    <td><input type="submit" name="generate" value="Generate" /></td>
  </tr>
</table>
</form>

Dateidownload erzwingen

21. Oktober 2007, 01:13
1
2
3
4
5
6
7
8
$file = PATH_TO_FILES . basename($_GET['f']);
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header("Content-Transfer-Encoding: binary");
header("Cache-Control: no-store, no-cache, must-revalidate");
header('Content-Length: ' . filesize($file));
header('Content-Disposition: attachment; filename="' . basename($file) . '"');
readfile($file);

E-Mail-Versand mit zusätzlichen Headers

6. Oktober 2007, 12:33
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function sendMail($from_name, $from_mail, $to, $subject, $body, $type = 'plain', $charset = 'uft-8', $cc = '', $bcc = '') {
  $headers = 'From: ' . $from_name . ' <' . $from_mail . ">" . NL;
  $headers .= (!empty($cc) ? 'Cc: ' . $cc . NL : '');
  $headers .= (!empty($bcc) ? 'Bcc: ' . $bcc . NL : '');
  $headers .= 'Reply-To: ' . $from_mail . NL;
  if($type == 'html') {
    $headers .= 'MIME-Version: 1.0' . NL;
  }
  $headers .= 'Content-Type: text/' . $type . '; charset="' . $charset . '"' . NL;
  $headers .= 'X-Mailer: PHP/' . phpversion();
 
  $send = @mail($to, $subject, $body, $headers);

  return $send;
}

Tabelle aus einer Liste generieren

8. September 2007, 16:05

Da ich schon so oft vor der Aufgabe stand, anhand einer Liste eine Tabelle mit x Spalten zu erzeugen, und genauso oft die Funktion neu schrieb, da ich auf der Suche nach einer bereits geschriebenen Funktion nicht fündig wurde, wird sie nun hier festgehalten, frei nach der Prinzip “Don’t repeat yourself!”.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
define('NL', "\n");

function createTableFromList($list, $cols) {
  $table_b = '<table cellpadding="0" cellspacing="0" border="1">' . NL;
  $table_c = '';
  $table_e = '</table>' . NL;
 
  $cells = count($list);
  $empty_cells = $cols - $cells%$cols;
 
  if($cells == 0) return 'Liste ist leer.';
 
  for($i = 0; $i < $cells; $i++) {
    if($i == 0 || $i%$cols == 0) $table_c .= '<tr>' . NL;
    $table_c .= '<td>' . $list[$i] . '</td>' . NL;
    if($i%$cols == $cols - 1) $table_c .= '</tr>' . NL;
  }
 
  if($empty_cells > 0 && $empty_cells < $cols)
    $table_c .= str_repeat('<td>&nbsp;</td>' . NL, $empty_cells) . '</tr>' . NL;
 
  return $table_b . $table_c . $table_e;
}

Dateien in einem Ordner auflisten

30. August 2007, 12:14
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function getFiles($dir) {
  $file = '';
  $files = array();

  if(is_dir($dir)) {
    if($pointer = opendir($dir)) {
      while(($file = readdir($pointer)) != false) {
        if($file == '.' || $file == '..') continue;
        $files[] = $file;
      }
      closedir($pointer);
    }
  }
  return $files;
}

Passwort generieren

1. April 2006, 17:35
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function passwd($len = 8) {
  $passwd = '';
  $char = array('*', '+', ',', '-', '.', '/',
                '0', '1', '2', '3', '4', '5',
                '6', '7', '8', '9', 'A', 'B',
                'C', 'D', 'E', 'F', 'G', 'H',
                'I', 'J', 'K', 'L', 'M', 'N',
                'O', 'P', 'Q', 'R', 'S', 'T',
                'U', 'V', 'W', 'X', 'Y', 'Z',
                'a', 'b', 'c', 'd', 'e', 'f',
                'g', 'h', 'i', 'j', 'k', 'l',
                'm', 'n', 'o', 'p', 'q', 'r',
                's', 't', 'u', 'v', 'w', 'x',
                'y', 'z');
 
  for($i = 0; $i < $len; $i++) {
    $passwd .= $char[rand(0, count($char) - 1)];
  }
 
  return $passwd;
}