il sito codicefiscale.com calcola erratamente i codici fiscali corti
cambiare la X non basta perché andrebbe ricalcolato pure il codice di controllo motivo per il quale il codice fiscale continua a risultare errato
qui ti posto un altro pezzo di codice per il controllo del codice fiscale, semplificato ed un pò ottimizzato
Codice PHP:
// Verifica se ha già inizializzato i valori corrispondenti ai caratteri
if (isset($fiscalCodeCharacterValues) === false)
{
// Inizializza l'array
$fiscalCodeCharacterValues = array('0' => 1, '1' => 0, '2' => 5, '3' => 7,
'4' => 9, '5' => 13, '6' => 15, '7' => 17, '8' => 19, '9' => 21, 'A' => 1,
'B' => 0, 'C' => 5, 'D' => 7, 'E' => 9, 'F' => 13, 'G' => 15, 'H' => 17,
'I' => 19, 'J' => 21, 'K' => 2, 'L' => 4, 'M' => 18, 'N' => 20,
'O' => 11, 'P' => 3, 'Q' => 6, 'R' => 8, 'S' => 12, 'T' => 14,
'U' => 16, 'V' => 10, 'W' => 22, 'X' => 25, 'Y' => 24,
'Z' => 23);
}
// Rende il valore passato tutto in maiuscolo
$value = strtoupper($value);
// Inizializza il valore di controllo
$checkValue = 0;
// Inizia il calcolo del valore di controllo sui numeri dispari
for($index = 1; $index <= 13; $index += 2)
{
// Acquisisce il caratteri dispari
$char = ord($value[$index]);
// Confronta il valore
if (48 <= $char && $char <= 57)
{
$checkValue += $char - 48;
}
else
{
$checkValue += $char - 65;
}
}
// Continua il calcolo del valore di controllo sui numeri pari
for($index = 0; $index <= 14; $index += 2)
{
// Aggiunge i valore per il codice di controllo
$checkValue += $fiscalCodeCharacterValues[$value[$index]];
}
// Esegue gli ultimi calcoli sul valore di controllo
$checkValue = ($checkValue % 26) + 65;
// Confronta il valore
if ($checkValue != ord($value[15]))
{
// Errore
}
// Tutto ok
la variabile $fiscalCodeCharacterValues la faccio inizializzare solo se necessaria perché controllando anche la partita iva potrebbe presentarsi il caso in cui la partita iva contenga il codice fiscale con il risultato che verrebbe inizializzata due volte
NOTA1: controllare la validità del codice fiscale può essere utile all'utente per dare un minimo di feedback ma, nella pratica, è inutile perché non è possibile verificare i casi di omonimia che per quanto rari possano essere ci sono e fanno danni 
NOTA2: la partita iva potrebbe anche essere nel formato internazionale ovvero non composta solo dal numero quindi scartare tutte le p.ive che hanno una lunghezza diversa da 11 è errato ... se è 13 è pure corretta, basta eliminare i primi due caratteri dal controllo (per le partite ive italiane ovviamente)