Newsgroup: it.comp.www.php
Titolo: Codice fiscale.

Sono un novizio del PHP e ho trovato in rete questo script per il codice 
fiscale, funziona perfettamente in PHP4, ma con il PHP5 non va.
Mi date una mano per adattarlo al PHP5?
Grazie
------------------------------------------------------------------------
<?php
var $codicefiscale;        //risultato del calcolo
var $errori=array();       //array contenente eventuali errori nel calcolo
}
function 
calcolacodicefiscale($ccognome,$cnome,$csesso,$ccomune,$cdatasingola="",$cgiorno="",$cmese="",$canno=""){
 
//----------------------------------------------------------------------------------------------------//
   //settaggi vari
   $MESI = "ABCDEHLMPRST"; //lettere x corrispondenza mesi
   $crisultato=new risultato; //conterrï¿œ risultato-errori
 
   //matrice per calcolare il carattere di controllo
   //il primo indice ï¿œ il codice ascii del carattere il secondo indice 
la posizione pari o dispari
   // "A"
   $MATRICECOD[65][0] = 1;
   $MATRICECOD[65][1] = 0;
   // "B"
   $MATRICECOD[66][0] = 0;
   $MATRICECOD[66][1] = 1;
   // "C"
   $MATRICECOD[67][0] = 5;
   $MATRICECOD[67][1] = 2;
   // "D"
   $MATRICECOD[68][0] = 7;
   $MATRICECOD[68][1] = 3;
   // "E"
   $MATRICECOD[69][0] = 9;
   $MATRICECOD[69][1] = 4;
   // "F"
   $MATRICECOD[70][0] = 13;
   $MATRICECOD[70][1] = 5;
   // "G"
   $MATRICECOD[71][0] = 15;
   $MATRICECOD[71][1] = 6;
   // "H"
   $MATRICECOD[72][0] = 17;
   $MATRICECOD[72][1] = 7;
   // "I"
   $MATRICECOD[73][0] = 19;
   $MATRICECOD[73][1] = 8;
   // "J"
   $MATRICECOD[74][0] = 21;
   $MATRICECOD[74][1] = 9;
   // "K"
   $MATRICECOD[75][0] = 2;
   $MATRICECOD[75][1] = 10;
   // "L"
   $MATRICECOD[76][0] = 4;
   $MATRICECOD[76][1] = 11;
   // "M"
   $MATRICECOD[77][0] = 18;
   $MATRICECOD[77][1] = 12;
   // "N"
   $MATRICECOD[78][0] = 20;
   $MATRICECOD[78][1] = 13;
   // "O"
   $MATRICECOD[79][0] = 11;
   $MATRICECOD[79][1] = 14;
   // "P"
   $MATRICECOD[80][0] = 3;
   $MATRICECOD[80][1] = 15;
   // "Q"
   $MATRICECOD[81][0] = 6;
   $MATRICECOD[81][1] = 16;
   // "R"
   $MATRICECOD[82][0] = 8;
   $MATRICECOD[82][1] = 17;
   // "S"
   $MATRICECOD[83][0] = 12;
   $MATRICECOD[83][1] = 18;
   // "T"
   $MATRICECOD[84][0] = 14;
   $MATRICECOD[84][1] = 19;
   // "U"
   $MATRICECOD[85][0] = 16;
   $MATRICECOD[85][1] = 20;
   // "V"
   $MATRICECOD[86][0] = 10;
   $MATRICECOD[86][1] = 21;
   // "W"
   $MATRICECOD[87][0] = 22;
   $MATRICECOD[87][1] = 22;
   // "X"
   $MATRICECOD[88][0] = 25;
   $MATRICECOD[88][1] = 23;
   // "Y"
   $MATRICECOD[89][0] = 24;
   $MATRICECOD[89][1] = 24;
   // "Z"
   $MATRICECOD[90][0] = 23;
   $MATRICECOD[90][1] = 25;
   // "0"
   $MATRICECOD[48][0] = 1;
   $MATRICECOD[48][1] = 0;
   // "1"
   $MATRICECOD[49][0] = 0;
   $MATRICECOD[49][1] = 1;
   // "2"
   $MATRICECOD[50][0] = 5;
   $MATRICECOD[50][1] = 2;
   // "3"
   $MATRICECOD[51][0] = 7;
   $MATRICECOD[51][1] = 3;
   // "4"
   $MATRICECOD[52][0] = 9;
   $MATRICECOD[52][1] = 4;
   // "5"
   $MATRICECOD[53][0] = 13;
   $MATRICECOD[53][1] = 5;
   // "6"
   $MATRICECOD[54][0] = 15;
   $MATRICECOD[54][1] = 6;
   // "7"
   $MATRICECOD[55][0] = 17;
   $MATRICECOD[55][1] = 7;
   // "8"
   $MATRICECOD[56][0] = 19;
   $MATRICECOD[56][1] = 8;
   // "9"
   $MATRICECOD[57][0] = 21;
   $MATRICECOD[57][1] = 9;
 
   //converte tutto in maiuscolo
   $ccomune=strtoupper(stripslashes($ccomune));
   $ccognome=strtoupper(stripslashes($ccognome));
   $cnome=strtoupper(stripslashes($cnome));
   //controlla in quale formato ï¿œ stata passata la data
   if ($cdatasingola==""){
     //prende buoni $cgiorno $cmese $canno
     if (strlen($canno)<2) {
       $canno="0".$canno;
     }//se l'anno ï¿œ 1 -> anno = 01
     //controlla validitï¿œ data
     if (!calcolacodicefiscale_controllodata($cgiorno,$cmese,$canno)){
       //setta l'errore
       $crisultato->errori[]="Data $cgiorno/$cmese/$canno non corretta";
     }
   } else {
     //prende buono $cdatasingola
 
     //spezza la data
     $pezzi=explode("/",$cdatasingola);
 
     //ci sono 3 pezzi ?
     if (sizeof($pezzi)!=3){
       //se non ho 3 pezzi
       //setta l'errore
       $crisultato->errori[]="Data $cdatasingola non corretta";
     } else {
       //se ha 3 pezzi
       //setta giorno mese anno
       $cgiorno=$pezzi[0];
       $cmese=$pezzi[1];
       $canno=$pezzi[2];
       if (strlen($canno)<2) {
         $canno="0".$canno;
       }//se l'anno ï¿œ 1 -> anno = 01
 
       //controlla validitï¿œ data
       if (!calcolacodicefiscale_controllodata($cgiorno,$cmese,$canno)){
         //setta l'errore
         $crisultato->errori[]="Data $cdatasingola non corretta";
       }
     }
   }
 
   //calcola comune
   $codcomune=calcolacodicefiscale_calcolacomune($ccomune);
 
   //se non trova il comune
   if ($codcomune=="0"){
     //setta l'errore
     $crisultato->errori[]="Non ho trovato il comune '$ccomune'";
   }
 
   //se non ha errori calcola il codice
   if (!sizeof($crisultato->errori)) {
 
     //setta $csesso 40 o 0  a seconda che sia F o qualcos'altro (M)
     if (strtoupper($csesso)=="F"){
       $csesso=40;
     } else {
       $csesso=0;
     }
     $codice=calcolacodicefiscale_calcolacognome(trim($ccognome));
      //inserisce cognome
     $codice.=calcolacodicefiscale_calcolanome(trim($cnome)); 
//inserisce nome
     $codice.=substr($canno,-2); 
//inserisce anno
     $codice.=substr($MESI,$cmese-1,1); 
//inserisce mese
     $tmp=strval(intval($csesso)+$cgiorno); 
//inserisce giorno+sesso
     //aggiunge lo 0 iniziale se $tmp ï¿œ da 1 a 9                     //
     if (strlen($tmp)<2){                                            //
       $tmp="0".$tmp;                                              //
     }                                                               //
     $codice.=$tmp;                                                  //
     $codice.=$codcomune; 
//inserisce comune
     //calcola carattere di controllo
     $codcontrollo = 0;
     //scorre $codice fino ad ora calcolato
     For ($i= 0;$i<=14;$i++){
       //aggiunge a $codcontrollo il valore relativo al carattere 
trovato in base alla posizione pari o dispari
       $codcontrollo = $codcontrollo + $MATRICECOD[ord(substr($codice, 
$i, 1))][ $i % 2];
     }
     $codice .= chr(65 + ($codcontrollo % 26) ); 
//inserisce carattere di controllo
     //scrive il codice trovato in $crisultato
     $crisultato->codicefiscale=$codice;
   }
   return $crisultato;
}
function calcolacodicefiscale_noaccentate($s){
 
   $ACCENTATE=" ï¿œï¿œï¿œï¿œï¿œï¿œï¿œï¿œï¿œï¿œï¿œï¿œ";
   $NOACCENTO=" AEEIOUAEEIOU";
   $i=0;
   //scorre la stringa originale
   while ($i<strlen($s)){
     $p=strpos($ACCENTATE,substr($s,$i,1));
     //se ha trovato una lettera accentata
     if ($p){
       //sostituisce con la relativa non accentata
       $s[$i]=substr($NOACCENTO,$p,1);
     }
     $i++;
   }
   return $s;
}
function calcolacodicefiscale_calcolacognome($cogn){
 
   $VOCALI = " AEIOU";
   $CONSONANTI = " BCDFGHJKLMNPQRSTVWXYZ";
 
   //elimina le accentate
   $cogn=calcolacodicefiscale_noaccentate($cogn);
   $i = 0;
   $stringa = "";//stringa conterï¿œ le 3 lettere
   //scorre il cognome in cerca di 3 consonanti
   while ((strlen($stringa) < 3) and ($i < strlen($cogn))){
     //se trova una consonante la aggiunge a $stringa
     if (  strrpos($CONSONANTI, substr($cogn, $i, 1))   ){
       $stringa = $stringa.substr($cogn, $i, 1);
     }
     $i++;
   }
   $i = 0;
   //se non ha ancora 3 consonanti sceglie fra le vocali
   while ((strlen($stringa) < 3) and ($i < strlen($cogn))){
     //se trova una vocale la aggiunge a $stringa
     if (  strrpos($VOCALI, substr($cogn, $i, 1))       ){
       $stringa = $stringa.substr($cogn, $i, 1);
     }
     $i++;
   }
   //se non ha ancora 3 lettere aggiunge x per arrivare a 3
   if (strlen($stringa) < 3) {
     for ($i=strlen($stringa);$i<=2;$i++){
       $stringa = $stringa."X";
     }
   }
   return $stringa;
}
function calcolacodicefiscale_calcolanome($nom){
 
   $VOCALI = " AEIOU";
   $CONSONANTI = " BCDFGHJKLMNPQRSTVWXYZ";
   //elimina le accentate
   $nom=calcolacodicefiscale_noaccentate($nom);
   $i = 0;
   $cons = "";
   $stringa = "";//stringa conterï¿œ le 3 lettere
   //scorre il nome in cerca di 4 consonanti
   while ((strlen($cons) < 4) and ($i < strlen($nom))){
     if (  strrpos($CONSONANTI, substr($nom, $i, 1))     ){
       //se trova una consonante la aggiunge a $cons
       $cons = $cons.substr($nom, $i, 1);
     }
     $i++;
   }
   if (strlen($cons)>3){
     //se ha 4 consonanti prende la 1ï¿œ, 3ï¿œ, 4ï¿œ
     $stringa=substr($cons,0,1).substr($cons,2,2);
   } else {
     //altrimenti mette quelle che ha trovato in $stringa
     $stringa=$cons;
   }
   $i = 0;
   //scorre il nome in cerca di vocali finchï¿œ $stringa non contiene 3 
lettere
   while ((strlen($stringa) < 3) and ($i < strlen($nom))){
     if (  strrpos($VOCALI, substr($nom, $i, 1))         ){
       //se trova una consonante la aggiunge a $stringa
       $stringa = $stringa.substr($nom, $i, 1);
     }
     $i++;
   }
   //se non ha ancora 3 lettere aggiunge x per arrivare a 3
   if (strlen($stringa) < 3) {
     for ($i=strlen($stringa);$i<=2;$i++){
       $stringa = $stringa."X";
     }
   }
   return $stringa;
}
 
function calcolacodicefiscale_controllodata($g,$m,$a){
 
   $controllo=false;
   $controllo=checkdate(intval($m),intval($g),intval($a));
   return $controllo;
}
 
function calcolacodicefiscale_calcolacomune($com){
 
   $finali="12344";  // stringa che contiene le lettere finali del file 
a seconda dell'iniziale
   $PERCORSO="./dati/comuni/"; //path dei files comuni1-4.csv
   $iniziale=substr($com,0,1);
   // se l'iniziale non ï¿œ una lettera ritorna il codice di errore
   if ((ord($iniziale)<65)||(ord($iniziale)>90)) {
     return ("0");
   }
   //sceglie il nome del file in base all'iniziale 
$filecomuni=$PERCORSO."comuni".substr($finali,floor((ord($iniziale)-64)/6),1).".csv";
   //apre in lettura il file in $filecomini che contiene l'elenco dei 
comuni e dei rispettivi codici
   $fp = fopen($filecomuni,"r");
   $cod="0";
   // legge il file finchï¿œ non trova il comune (inserisce il codice in $cod)
   while (  ($stringa = fgets($fp,4096)) and ($cod=="0")   ){
     //riporta nell'array $campi il nome del comune letto($campi[0]) e 
il codice ($campi[1])
     $campi=explode(";",$stringa);
     if ($campi[0]==$com) {
       //se ha trovato il comune mette in $cod il codice
       $cod=substr($campi[1],0,4);
     }
   }
   fclose($fp);
   return $cod;
} 
 
/*
======================================================================= 
 
                           - per utilizzare lo script ï¿œ sufficiente 
inserire all'inizio della pagina in cui si effettua la
visualizzazione del risultato la seguente riga: 
 
 
require("calcolacodicefiscale.inc.php");
 
- per visualizzare il risultato usare un codice del tipo: 
                            //
$r=new risultato;
$r=calcolacodicefiscale($cognome,$nome,$sesso,$comune,$datanascita);
if (sizeof($r->errori)){
echo "Si sono verificati i seguenti errori:<br>";
reset ($r->errori);
while (list ($key, $val) = each ($r->errori)) {
echo ($key+1)."- ".$val."<br>";
}
} else {
echo $r->codicefiscale;
}
========================================================================
*/ 
 
?>

fiscale, funziona perfettamente in PHP4, ma con il PHP5 non va.
 
Cosa fa, con PHP5?
 
Leonardo
 
-- 
 
Then felt I like some watcher of the skies, when a new planet swims into his ken;
Or like stout Cortez when with eagle eyes, he star'd at the Pacific; and all his men
Look'd at each other with a wild surmise - silent, upon a peak in Darien.


 
Non da nessun errore, non da il codice fiscale.
Questo � il codice per il form immissione dati:
 
<form name="form1" method="POST"
   action="<?php $_SERVER['SELF_PHP']; ?>">
   <table align="center" width="370" border="0" class="form">
     <tr>
       <td align="center" class="testo_blu"><b>CALCOLO DEL CODICE 
FISCALE</b>
         <table align="center" width="350">
           <tr>
             <td height="1"></td>
           </tr>
           <tr>
             <td class="testo_blu">cognome: <input class="form"
               type="text" size="15" name="cognome" class="form">
             </td>
             <td class="testo_blu" align="right">nome: <input
               class="form" type="text" size="15" name="nome"
               class="form">
             </td>
           </tr>
         </table>
         <table align="center" width="350">
           <tr>
             <td width="110" align="right" class="testo_blu">sesso(m/f):
               <input class="form" type="text" name="sesso" size="2"
               maxlength="1" class="form">
             </td>
             <td width="240" align="right" class="testo_blu">data
               (g/m/aaaa): <input class="form" type="text" size="15"
               name="datanascita" class="form">
             </td>
           </tr>
         </table>
         <table align="center" width="350">
           <tr>
             <td align="right" class="testo_blu">comune di nascita: <input
               type="text" size="20" name="comune" class="form">
             </td>
           </tr>
         </table>
         <table align="center" width="350">
           <tr>
             <td class="testo_blu"><input class="form" type="submit"
               class="testo_blu" name="Submit" value="Calcola">
               &nbsp;&nbsp;&nbsp;&nbsp; <input class="form" type="reset"
               class="testo_blu" name="reset" value="Cancella"></td>
           </tr>
         </table>
         <table bgcolor="#3e9f87" align="center" width="370" border="0">
           <tr>
             <td align="center">&nbsp;&nbsp;&nbsp;&nbsp; <?php
             if ($REQUEST_METHOD == "POST") {
               //calcola
               require("calcolacodicefiscale.inc.php");
               $r = new risultato;
               $r = calcolacodicefiscale($cognome, $nome, $sesso, 
$comune, $datanascita);
               if (sizeof($r->errori)) {
                 echo "<font class=testo_bianco> Si sono verificati i 
seguenti errori:<p align=left>";
                 reset($r->errori);
                 while (list ($key, $val) = each($r->errori)) {
                   echo "<font class=testo_bianco>";
                   echo ($key + 1) . "- " . $val . "<br>";
                   echo"</font>";
                 }
               } else {
                 echo "<font 
class=testo_bianco_big>$r->codicefiscale</font>";
               }
                                     } ?>
             </td>
           </tr>
         </table>
       </td>
     </tr>
   </table>
</form>
 

  non da il codice fiscale.
 
Nota che ti ha chiesto "cosa fa" e non "cosa non fa", cioè una risposta 
positiva è più utile per capire il problema.
 
Ad esempio per aiutare una diagnosi potresti incollare il codice HTML 
della parte dove ti aspettavi il codice così uno si fa un'idea di quale 
parte sia stata eseguita come atteso e quale no.
Non riportare tutto il codice, ma solo le parti essenziali. Io quando 
ho visto il post iniziale così lungo ho chiuso direttamente la 
discussione.
 
 
-- 
Andrea
 

                 while (list ($key, $val) = each($r->errori)) {
 
	if (!empty($r->errori) {
                  echo '<font class="testo_bianco"> Si sono verificati i 
 seguenti errori: <p align="left">';
		foreach($r->errori as $key => $val) {


 		foreach($r->errori as $key => $val) {
 
Scusami se approfitto della tua cortesia.
Ora riporta questo errore:
 
 
Parse error: syntax error, unexpected '{' in 
/membri2/italy/codice_fiscale.php on line 95
 
su questa linea
 
-->  if (!empty($r->errori)
        {
        echo '<font class="testo_bianco"> Si sono verificati i
        seguenti errori: <p align="left">';
        foreach($r->errori as $key => $val)
         {


> 	if (!empty($r->errori)) {
 
Pero', diamine, ci potevi arrivare anche da te, eh. Tante le parentesi aperte,
tante devono essere le parentesi chiuse :-)



 
Hai ragione e ti chiedo scusa :-) E' da poco che sto imparando a 
programmare (sono pensionato) e ogni giorno che passa mi rendo conto 
della mia impreparazione.
 
Ora l'errore riportato � sparito, per� seguita a funzionare bene con 
PHP4 e non con il PHP5.
Ti allego l'indirizzo della pagina incriminata:
http://italy.altervista.org/codice_fiscale.php
 
 
Grazie ancora se abuso della tua pazienza.
 
Mauro

 ...(sono pensionato) ....
 
Beh per tutti quelli che ancora pensano che il php sia un linguaggio per 
ragazzini, beccatevi questa ! :)
 
 
 


66 primavere :-)


http://italy.altervista.org/codice_fiscale.php
 
 
"Data //0 non corretta" -- non sta leggendo i parametri in ingresso.
 
Probabilmente perche' in PHP4 usavi i parametri "magici", e PHP5 li ha
deprecati. Adesso non basta piu' scrivere
 
	<input name="pippero" />
 
in una form, perche' la pagina action riceva "$pippero"... bisogna che
tu ti recuperi la variabile dalla "supervariabile" $_POST. Magari, con
qualche controllo di errore.
 
Questo e' un sistema orrido senza nessun controllo:
 
	// Righe aggiunte
	$campi = array('cognome','nome','sesso','comune','datanascita');
	foreach ($campi as $campo) {
		if (!isset($_POST[$campo])) {
			${$campo} = 'VUOTO';
		} else {
			${$campo} = $_POST[$campo];
		}
	}
	unset($campi, $campo);
	// Fine righe aggiunte. Adesso le variabili dovrebbero esserci.
 
        //calcola
        require("calcolacodicefiscale.inc.php");
        $r = new risultato;
        $r = calcolacodicefiscale($cognome, $nome, $sesso, 
$comune, $datanascita);
        if (sizeof($r->errori)) {
        	...


 	// Fine righe aggiunte. Adesso le variabili dovrebbero esserci.
 
GRANDEEE!! Funziona perfettamente, ora cercherò di capire il 
funzionamento del codice aggiunto.
 
Grazie ancora Leonardo
 

funzionamento del codice aggiunto.
 
Se vuoi, nel mio messaggio c'era scritto ;-D



 
 
:-)

 per ragazzini, beccatevi questa ! :)
 
usato in modo base (non ad oggetti) � la versione degli anni '2000 del
vecchio Basic.
 
-- 
Alessandra
 
[NUOVO] "Contiamo! il gioco tv, in Delphi" (ebook) -
http://tinyurl.com/contiamo-gioco-delphi
 
Altri libri e pubblicazioni su > 
http://alessandraromano.weebly.com
 
 
Neppure i preti, i teologi, i vescovi e i cardinali sono riusciti a
sradicare la religione dal cuore degli uomini. - Arcivescovo Makarios
III

 vecchio Basic.
 
tu che linguaggio usi per i tuoi programmi?
 
 

 tu che linguaggio usi per i tuoi programmi?
 
Delphi.
 
-- 
Alessandra
 
[NUOVO] "Contiamo! il gioco tv, in Delphi" (ebook) -
http://tinyurl.com/contiamo-gioco-delphi
 
Altri libri e pubblicazioni su > 
http://alessandraromano.weebly.com
 
 
Sono contrario ai rapporti prima del matrimonio; fanno arrivare tardi
alla cerimonia.

 Delphi.
 
Il Pascal degli anni '90. :P
 
Scusate, non ho resistito. :)
 
Bye.
 

 Scusate, non ho resistito. :)
 
Pascal si, degli anni '90 no..
 
-- 
Alessandra
 
[NUOVO] "Contiamo! il gioco tv, in Delphi" (ebook) -
http://tinyurl.com/contiamo-gioco-delphi
 
Altri libri e pubblicazioni su > 
http://alessandraromano.weebly.com
 
 
Mosè: quest'uomo che tanto ha dato al ciclismo in Italia e nel mondo...
- Giobbe Covatta

 Pascal si, degli anni '90 no..
 
Hai ragione, anni '80 (1986).
 
PHP invece è del '95, quindi la proporzione che avevi fatto è rispettata 
nel mio assunto.
 
Bye.
 
P.S.: sono cazzate entrambe le affermazioni. Era questo il succo del 
discorso.

 discorso.
 
non direi proprio.
 
-- 
Alessandra
 
[NUOVO] "Contiamo! il gioco tv, in Delphi" (ebook) -
http://tinyurl.com/contiamo-gioco-delphi
 
Altri libri e pubblicazioni su > 
http://alessandraromano.weebly.com
 
 
Cristiano: seguace degli insegnamenti di Cristo solo finché non
intralcino i peccati a cui si dedica più volentieri - Ambrose Bierce

 Delphi.
 
Conosco il linguaggio Delphi, in effetti ï¿œ molto potente (all'epoca
surclassava nettamente il concorrente Visual Basic, ma purtroppo quest'ultimo la
spuntava per via della fama di essere facilissimo da imparare... %) ).
Peccato che sembra sia poco diffuso rispetto ad altri linguaggi.
 
Comunque la ditta produttrice di Delphi nel tempo ha
abbracciato anche altri linguaggi, fra cui proprio il PHP realizzando
il "Delphi per PHP", quindi quest'ultimo non lo considererei proprio
al livello del BASIC... (seppur usato senza adoperare l'OOP) ;)
 
Ma sei una sviluppatrice indipendente o lavori per un'azienda?