Version: 1.0

Type: Full Script

Category: Algorithms

License: GNU General Public License

Description: Put in a 17 digit VIN number and it tells you if the check digit computes or not. Future plans include extracting the manufacturer and other known information from the VIN. If anyone writes a class from this code please share here. phpbuilder rocks!



<?php
	if (!$vin){
		echo "<p>Enter VIN number:</p>";
		echo "<form method=post action=\"" . $_SERVER['PHP_SELF'] . "\">";
		echo "<p><INPUT TYPE=\"TEXT\" MAXLENGTH=\"17\" SIZE=\"31\" NAME=\"vin\"></p>";
		echo "<p><INPUT TYPE=\"SUBMIT\" VALUE=\"Check It\"></p>";
		echo "</form>";
		exit;}
// check vin lenth
	if (strlen($vin) != "17"){
		echo "ERROR - VIN lenth must be 17 characters long.<br>You only entered " . strlen($vin) . " characters.";
		exit;}
// make VIN all caps 
$vin = strtoupper($vin);
// model years 1980 - 2000
$MODEL_YEARS = array("A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "P", "R", "S", "T", "V", "W", "X", "Y");
// weights for multiplyer
$WEIGHTS = array("8", "7", "6", "5", "4", "3", "2", "10", "9", "8", "7", "6", "5", "4", "3", "2");
// characters
$CHARS = array("A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "P", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9");
// character values
$CHAR_VALUES = array("1", "2", "3", "4", "5", "6", "7", "8", "1", "2", "3", "4", "5", "7", "9", "2", "3", "4", "5", "6", "7", "8", "9", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9");
// makea new array
$VIN_CHARS = array();
$count = 0;
	foreach ($CHARS as $char){
		$VIN_CHARS[$char] = $CHAR_VALUES[$count];
		$count++;}		
// check digit 0 - 9 and 10 = X 
$CHECK_DIGITS = array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "X");
// push each character of the vin into an array removing the 9th character (check digit)
echo "Your VIN's check digit is " . substr($vin, 8, 1);
echo "<br>";
$count = 0;
$vin_array = array();
	for ($i=0;$i<17;$i++){
		if ($i!=8){$vin_array[$count] = substr($vin, $i, 1);
			$count++;}}
// preform the math
$total = 0;
	for ($i=0;$i<16;$i++){
		$this_digit = $vin_array[$i];
		$this_total = $WEIGHTS[$i] * $VIN_CHARS[$this_digit];
		$total = $total + $this_total;
		}
$remainder = fmod($total, 11);
	if (substr($vin, 8, 1)!= $CHECK_DIGITS[$remainder]){
		echo "ERROR - Check digit does not compute.<br>Recheck your VIN number.<br>";
		echo "Computed check digit: $CHECK_DIGITS[$remainder]<br>";
		echo "Your check digit: " . substr($vin, 8, 1) . "<br>";
	 	}
	else {echo "Computed check digit: $CHECK_DIGITS[$remainder]<br>";
		echo "VIN number seems to be valid.<br>";}
?>