Archiv für die Kategorie ‘PHP & MySQL’

PHP: Deutsche Personalausweisnummer generieren

Mittwoch, 13. Mai 2009

Mit dieser von mir geschriebenen Funktion kann man eine zufällige deutsche Personalausweisnummer genierieren lassen. Als Ergebnis erhält man ein Array mit den 4 Positionen der Personalausweisnummer.

Mit meiner Funktion aus dem Beitrag vom 28. April 2009 kann anschließend die generierte Personalausweisnummer wieder ausgelesen werden.

Diese Funktion darf nur für Testzwecke verwendet werden.
Ein Missbrauch ist ausdrücklich untersagt!

< ?php
/**
 * Eine deutsche Personalausweisnummer generiern
 * Darf nur für Testzwecke genutzt werden!!!
 * Ein Missbrauch ist untersagt!!!
 *
 * by Frank Burian, nQuee netappz - http://www.nquee.com
 */
function createGermanPersonalId($intLocation = null,
                                             $intNumber = null,
                                             $strNationality = 'D',
                                             $strBirthday = null, // z.B. 14.12.1981
                                             $strExpiration = null) // z.B. 14.12.2020
                                             // null = Zufällig
{
	$arrResult = array();
	// Prüfsumme ermitteln
	if (!function_exists('createChecksum')) {
		function createChecksum($intID) {
			$intMultiplier = 7;
			$intSum = 0;
			$intIDLength = strlen($intID);
			for ($a=0; $a<$intIDLength; $a++) {
				$intSign = (integer) substr($intID,$a,1);
				$intTmpSum = ($intSign*$intMultiplier);
				$intSum += $intTmpSum;
				if ($intMultiplier == 7) {
					$intMultiplier = 3;
				} elseif ($intMultiplier == 3) {
					$intMultiplier = 1;
				} else {
					$intMultiplier = 7;
				}
			}
			return substr($intSum,strlen($intSum)-1,1);
		}
	}
 
	// Parameter prüfen/ Vorbelegungen
	if (is_null($intLocation)) $intLocation = rand(1000,9999);
	if (!preg_match("|^[0-9]+$|",$intLocation) || ($intLocation&lt;1000) || ($intLocation>9999)) {
		return false;
	}
	if (is_null($intNumber)) $intNumber = rand(11000,99999);
	if (!preg_match("|^[0-9]+$|",$intNumber) || ($intNumber&lt;10000) || ($intNumber>99999)) {
		return false;
	}
	if (empty($strNationality)) $strNationality = chr(rand(65,95));
	if ((strlen($strNationality) != 1) || (ord($strNationality)&lt;65) || (ord($strNationality)>95)) {
		return false;
	}
	if (is_null($strBirthday)) {
		$strBirthday = date("d.m.y", mktime(0,0,0,rand(1,12),rand(1,28), rand(date('Y',time())-60,date('Y',time())-16)));
	}
	if (!preg_match("/^([0-9]{1,2}).([0-9]{1,2}).([0-9]{2,4})$/i",$strBirthday)) {
		return false;
	}
	if (is_null($strExpiration)) {
		$strExpiration = date("d.m.y",mktime(0,0,0,rand(1,12),rand(1,28),rand(date('Y',time())+1,date('Y',time())+5)));
	}
	if (!preg_match("/^([0-9]{1,2}).([0-9]{1,2}).([0-9]{2,4})$/i",$strExpiration)) {
		return false;
	}
	// Informationen generieren
	$strBirthday = explode('.',$strBirthday);
	$strBirthday = $strBirthday[2].$strBirthday[1].$strBirthday[0];
	$strExpiration = explode('.',$strExpiration);
	$strExpiration = $strExpiration[2].$strExpiration[1].$strExpiration[0];
	$strTemp = $intLocation.$intNumber.createChecksum($intLocation.$intNumber);
	$arrResult[0] = $strTemp.$strNationality;
	$arrResult[1] = $strBirthday.createChecksum($strBirthday);
	$arrResult[2] = $strExpiration.createChecksum($strExpiration);
	$arrResult[3] = createChecksum($strTemp.$arrResult[1].$arrResult[2],true);
	return $arrResult;
}
 
// Aufruf:
$arrPersonalId = createGermanPersonalId();
echo $arrPersonalId[0].'< <'.$arrPersonalId[1].'<'.$arrPersonalId[2].'<<<<<<'.$arrPersonalId[3];
?>

Personalausweisnummer überprüfen und auslesen

Dienstag, 28. April 2009

Mit dieser von mir entwickelten Funktion kann man, via PHP, eine deutsche Personalausweisnummer auf ihre Gültigkeit prüfen.
Ist die Personalausweisnummer gültig, erhält man ein Array mit allen Information zu der Person.

// Edit: Habe am 13. Mai 2009 nochmal eine überarbeitete Funktion in diesen Beitrag integriert.

< ?php
/**
 * PASS    : XXXXXXXXXXD << XXXXXXX < XXXXXXX <<<<<<< X
 * FUNCTION: $ID01       << $ID02   < $ID03   <<<<<<< $ID04
 *
 * by Frank Burian, nQuee netappz - http://www.nquee.com
 */
function checkGermanPersonalId($ID01,$ID02,$ID03,$ID04) {
 
	$arrResult = array();
	// Prüfsumme ermitteln
	if (!function_exists('buildChecksum')) {
		function buildChecksum($intID) {
			$intMultiplier = 7;
			$intSum = 0;
			if (strlen($intID) == 11) {
				$intIDLength = 9;
			} elseif (strlen($intID) == 7) {
				$intIDLength = 6;
			} else {
				$intIDLength = strlen($intID);
			}
			for ($a=0; $a<$intIDLength; $a++) {
				$intSign = (integer) substr($intID,$a,1);
				$intTmpSum = ($intSign*$intMultiplier);
				$intSum += (integer) substr($intTmpSum,strlen($intTmpSum)-1,1);
				if ($intMultiplier == 7) {
					$intMultiplier = 3;
				} elseif ($intMultiplier == 3) {
					$intMultiplier = 1;
				} else {
					$intMultiplier = 7;
				}
			}
			return substr($intSum,strlen($intSum)-1,1);
		}
	}
	// Erste ID prüfen
	if (strlen($ID01) != 11) {
		return false;
	}
	if (buildChecksum($ID01) != substr($ID01,9,1)) {
		return false;
	}
	$arrResult['firstLocation'] = substr($ID01,0,4);
	$arrResult['origin'] = strtoupper($ID01{10});
	$arrResult['isGerman'] = ($arrResult['origin'] == 'D') ? true : false;
	// Zweite ID prüfen
	if (strlen($ID02) != 7) {
		return false;
	}
	if (buildChecksum($ID02) != $ID02{6}) {
		return false;
	}
	$arrResult['birthday']['day'] = $ID02{4}.$ID02{5};
	$arrResult['birthday']['month'] = $ID02{2}.$ID02{3};
	$arrResult['birthday']['year'] = $ID02{0}.$ID02{1};
	$arrResult['age'] = intval((mktime(0,0,0,date("m"),date("d"),date("Y")) -
						mktime(0,0,0,$arrResult['birthday']['month'],$arrResult['birthday']['day'],$arrResult['birthday']['year']))
						/ (3600 * 24 * 365));
	$arrResult['isAdult'] = ($arrResult['age'] >= 18) ? true : false;
 
	// Dritte ID prüfen
	if (strlen($ID03) != 7) {
		return false;
	}
	if (buildChecksum($ID03) != $ID03{6}) {
		return false;
	}
	$arrResult['expiration']['day'] = $ID03{4}.$ID03{5};
	$arrResult['expiration']['month'] = $ID03{2}.$ID03{3};
	$arrResult['expiration']['year'] = $ID03{0}.$ID03{1};
	// Vierte ID prüfen
	$intCompletePersonalId = substr($ID01,0,10).$ID02.$ID03;
	if (buildChecksum($intCompletePersonalId) != $ID04) {
		return false;
	}
	return $arrResult;
}
// Aufruf:
print_r(checkGermanPersonalId('6127057594D','8703189','1911149','2'));
?>

MySQL Volltextsuche mit deutscher Stoppwortliste

Donnerstag, 28. Februar 2008

Da ich mich gerade mit der Volltextsuche in MySQL beschäftigt habe und feststellen musste, dass es garnicht so einfach ist eine deutsche Stoppwortliste zu finden, die ein unnötiges anschwillen des Volltext-Indizes verhindern soll - habe ich mal recherchiert und die gängisten deutschen Wörter in einer Wortliste zusammen gefasst.

Die Stoppwortliste muss dann nur noch auf den Server geladen werden - ich habe sie in /etc/ kopiert, wo auch meine my.cnf liegt - und in der my.cnf muss dann noch folgendes ergänzt werden:

[mysqld]
ft_min_word_len = 3
ft_stopword_file = /etc/stopwords_german

Danach MySQL neustarten, bei mir wäre es “/etc/init.d/mysql restart”.

Um zu prüfen ob alle Einstellungen erfolgreich übernommen wurden, reicht es aus diesen MySQL-Befehl auszuführen:

show variables like 'ft_%'

Wenn schon ein Volltext-Index besteht, muss dieser natürlich erneuert werden. Das macht man mit einem einfachen MySQL-Befehl:

REPAIR TABLE tbl_name QUICK;

Hoffe ich konnte jemand weiterhelfen.

Deutsche Stoppwortliste

Welche IP gehört zu welchem Land?

Freitag, 02. März 2007

Für ein neues Projekt, welches ich noch nicht bekannt geben möchte, benötige ich einen Datenbank von IP-Ranges und der dazu gehörigen Länder! Also kurz gesagt, ich will wissen welche IP aus welchem Land kommt.
Ich habe auf phpclasses.org eine Klasse (Country From IP) gefunden, die einen Datenbestand von über 42.000 IP-Ranges hat. Allerdings in 5 Textdateien - Also, wäre solch eine Abfrage sehr schmerzhaft für die Performance. Ich habe mir deshalb die Mühe gemacht, alle diese Informationen in eine Datenbank umzusetzen und biete euch hier den SQL-Dump zum Download an. Zusätzlich auch noch ein ZIP-File mit den Flaggen der jeweiligen Länder, die Ihr aber auch in der oben genannten PHP-Klasse findet.

Die IP-Angaben sind als Integer definiert. Das heißt, wenn Ihr das Land einer IP wissen wollt, müsst ihr die IP vorher mit der Funktion ip2long() in einen Integerwert umwandeln.

Download: SQL-Dump
Download: Flaggen als Grafiken

Kaputte Tabellen erkennen und reparieren

Dienstag, 27. Februar 2007

Das Datenaufkommen bei meinem Projekt Spambog.com ist sehr groß, und die Datenbank erreicht eine stattliche Größe!
Es kommt aber oft vor das die Tabelle crasht und dann wieder repariert werden muss. Da ich aber nicht jede Minute dieses prüfen kann, haben ich ein Cronjob laufen, der die betroffene Tabelle jeden Minute prüft und gegebenenfalls repariert.


...
$strSQLCmd = "CHECK TABLE incoming";
$sqlResult = mysql_query($strSQLCmd);
$arrData = mysql_fetch_array($sqlResult);

if (eregi('Table is marked as crashed',$arrData['Msg_text'])):
$strSQLCmd = “REPAIR TABLE incoming”;
$sqlResult = mysql_query($strSQLCmd);
endif;