Site d’inscription avec gestion automatique des numéros
Nicolas Bondier, 2011-09-13
Updated on 2011-09-28
by Nicolas Bondier
Switzernet
Contents
Structure des bases de données
Modification du prix d’un numéro
Réserver un numéro de téléphone
Vérifications au lancement (number.php)
Affichage de la liste des numéros disponible (numbers.php)
Mise à jour de la base de donnée (number.php)
Fonctions mysql utilisées par les fonctions principales (numbers.php)
Envoie de l’email au client (numbers.php)
Fonctions communes utilisées dans les pages de subscribe (functions_communes.php)
Calcul du prix des numéros de téléphone (calcul_price.php)
Affichage des listes déroulantes (index.php et getpref2.php)
Gestion des réservation de numéros choisit avant la validation (index.php)
Mise à jour de la page de payement (index.php et getpref2.php)
Ce document décrit la conception et la mise en place d’une gestion automatique des numéros disponibles sur le site d’inscription de Switzernet.
Afin de remplacer la procédure visant à rajouter des numéros manuellement dans la base de données du site internet switzernet.com, il a été décidé de remplacer cette procédure par une gestion automatique prenant en compte, les numéros de clients existants et les numéros réservés par les nouveaux clients.
Les prix des numéros sont définis dans la page ‘calcul_price.php’. Ils sont calculés une fois et insérés pour chacun des numéros dans la base de données locale du site switzernet.com. Il est cependant possible de changer la tarification d’une combinaison de digits en changeant la valeur retourné de la fonction correspondante à cette combinaison.
Pour que cette tarification soit appliquée sur tous les numéros libres, il faut incrémenter la valeur de l’index ‘$last_price_index’ de la page ‘calcul_price.php’ (voir le code commenté). La modification sera appliquée pour les numéros libres, préfixes par préfixes, que lors de la prochaine mise à jour de la liste des numéros dudit préfixe, c'est-à-dire au jour j+1 la dernière mise à jour du préfixe.
Par exemple, si on a affiché la liste des numéros disponibles commençant par 021550 aujourd’hui, la mise à jour des tarifs des numéros commençant par 021550 se fera demain (lors du premier affichage de ces numéros).
Lors de l’inscription d’un client, il y a deux niveaux de réservation :
- Anonyme : Elle est exécutée lorsque un
client choisit un numéro mais n’a pas fini de s’inscrire. Ceci permet
d’empêcher un deuxième client de choisir le même numéro le temps que le premier
ai fini son inscription. Cette réservation est effective jusqu’à la fin de
l’inscription (elle devient nominative) ou bien jusqu’à ce que le client
choisisse un autre numéro. L’ancien numéro sélectionné repasse alors dans la
liste des numéros libres.
Si le client a quitté le navigateur après avoir choisi un numéro et sans avoir fini
son inscription, ce numéro est réservé jusqu’à la prochaine mise à jour des
numéros libres.
- Nominative : Une fois la procédure d’inscription terminée, le numéro réservé est lié à l’adresse email du client dans la base de donnée du site internet. Cette réservation est effective pendant un nombre de jour (par défaut 21) définit par la valeur de ‘number_config.days_before_cancel’ de la base de donnée du site.
Code |
Commentaires |
<html> <head> <meta http-equiv="content-type" content="text/html; charset=iso-8859-1"> <meta name="author" content="Clément Chadourne - Switzernet"> <meta name="robots" content="index, follow"> <meta name="keywords" content=""> <meta name="description" content=""> <link href="style.css" rel="stylesheet" type="text/css"> <title> Choix d'un numéro </title> </head>
<body> <center>
<table width="800" align="center"> <tr> <td> <table width="100%" cellpadding="0" cellspacing="0"> <tr> <td> <a href="http://www.switzernet.com/"><img src="images/switzernet.gif" title="Switzernet VoIP téléphonie IP Suisse"></a> <img src="images/slogan_1.gif" title="appeler le monde pour presque rien à partir de la Suisse: appels en Suisse, Allemagne, UK, Etats-Unis gratuits" /> </td> <td width="100" height="26" align="right" valign="bottom"><a class='tab' href="numeros.php?language=1"><font color="#000000">FR</font></a> | <a class='tab' href="numeros.php?language=2"><font color="#000000">DE</font></a> | <a class='tab' href="numeros.php?language=3"><font color="#000000">EN</font></a></td> </tr> </table>
<table width="100%" cellpadding="3" cellspacing="0" align="center" > <td width="100" height="26" align="center" valign="middle"><a class='tab' href="../060801-web/index.php">Accueil</a></td> <td width="100" height="26" align="center" valign="middle"><a class='tab' href="../060801-web/content.php?id=14">Switzernet?</a></td> <td width="100" height="26" align="center" valign="middle"><a class='tab' href="../060801-web/tariff.php">Tarifs</a></td> <td width="100" height="26" align="center" valign="middle"><a class='tab' href="../060801-web/partner.php">Partenaires</a></td> <td width="100" height="26" align="center" valign="middle"><a class='tab' href="../070608-subscribe/produit.php">Produits</a></td> <td width="100" height="26" align="center" valign="middle"><a class='tabinverse' href="../070608-subscribe/index.php">Inscription</a></td> <td width="100" height="26" align="center" valign="middle"><a class='tab' href="../060801-web/contact.php">Support</a></td> </table> </td> </tr> <tr> <td> <table width="100%" cellpadding="10" cellspacing="0" align="center" ><tr> </tr> </table> </td> </tr> </table> <p><font color="#0066ff"><strong></strong></font></p><p> </p><a name="top" id="top"></a><center><h2>Liste de numéros :</h2></center>
|
Reprise du code pour l’affichage du menu et des sections. |
<?php include "include/configure.php"; include "include/db2connect.php"; include "include/dbconnect.php"; include "include/calcul_price.php"; include "include/functions_communes.php"; require('include/class.phpmailer.php');
date_default_timezone_set("Europe/Zurich"); $temps_debut = microtime(true); delete_old_log();
// Donnée de la session utilisateur if (!isset($_SESSION['language'])) { if (constant("LANGUAGE_1") != '') { $language = explode(';', constant("LANGUAGE_1")); $_SESSION['language']['id'] = $language[0]; $_SESSION['language']['code'] = $language[1]; } // If no language defined, "1;FR" is the default else { $_SESSION['language']['id'] = '1'; $_SESSION['language']['code'] = 'FR'; } }
include "includes/check_language.php"; include "includes/languages/language_" . $_SESSION['language']['code'] . ".php";
if (isset($_POST['prefixes1_1'])&&isset($_POST['prefixes2_1'])&&stripslashes($_GET['num']=="1")){ $prefix1=preg_replace('/0/','41',$_POST['prefixes1_1']); $prefix2=$_POST['prefixes2_1']; if (!unused_numbers_is_updated($prefix1, $prefix2)){ update_database($prefix1, $prefix2); } $id_number_to_post="1"; $unused_num_pr=get_unused_numbers_with_prices($prefix1, $prefix2); echo "<form method='POST' name='validation'>"; display_unused_numbers_and_prices($unused_num_pr); echo "</form>";
} else if (isset($_POST['prefixes1_2'])&&isset($_POST['prefixes2_2'])&&stripslashes($_GET['num']=="2")){ $prefix1=preg_replace('/0/','41',$_POST['prefixes1_2']); $prefix2=$_POST['prefixes2_2']; if (!unused_numbers_is_updated($prefix1, $prefix2)){ update_database($prefix1, $prefix2); } $id_number_to_post="2"; $unused_num_pr=get_unused_numbers_with_prices($prefix1, $prefix2); display_unused_numbers_and_prices($unused_num_pr); } // Pour variable venant de la carte else if (isset($_GET['id_prefixe'])){ $prefs=get_prefixes_from_id(stripslashes($_GET['id_prefixe'])); if (sizeof($prefs)>1){ $prefix1=$prefs["1"]; $prefix2=$prefs["2"]; if (!unused_numbers_is_updated($prefix1, $prefix2)){ update_database($prefix1, $prefix2); } $id_number_to_post="1"; $unused_num_pr=get_unused_numbers_with_prices($prefix1, $prefix2); echo "<form method='POST' name='validation'>"; display_unused_numbers_and_prices($unused_num_pr); echo "</form>"; } else { echo "Prefixe inconnu"; } } else { echo "préfixes saisis incorrects<br>"; if (isset($_POST['prefixes1_1'])){ echo " prefixes1_1 ".$_POST['prefixes1_1']."<br>"; } if (isset($_POST['prefixes1_2'])){ echo " prefixes1_2 ".$_POST['prefixes1_2']."<br>"; } if (isset($_POST['prefixes2_1'])){ echo " prefixes2_1 ".$_POST['prefixes2_1']."<br>"; } if (isset($_POST['prefixes2_2'])){ echo " prefixes2_2 ".$_POST['prefixes2_2']."<br>"; } }
$_SESSION['prefixes']['num'.$id_number_to_post][1]=$prefix1; $_SESSION['prefixes']['num'.$id_number_to_post][2]=$prefix2;
mysql_close($connection); mysql_close($connection2); ?>
|
Définition des variables locales tel que les variables de connections aux bases de données MySQL, les textes utilisés en fonction de la langue, les fonctions communes aux différentes pages. On récupère les variables passés en $_POST. Dans le cas où le client peut choisir deux numéros (ex : l’appareil est pap2t), on précise dans la variable $id_number_to_post quel est le numéro en question (numéro 1 ou numéro 2) afin de retourner le bon numéro à la page index.php quand on va soumettre le formulaire. Si le client n’a le droit qu’à un seul numéro, alors $id_number_to_post = 1. La page peut être directement appelée
depuis un lien externe au site, comme la carte cliquable de la Suisse. Une fois que les paramètres correspondants au préfixes sont enregistrés, on test si la liste de numéros libres du préfixe est à jour dans la base de donnée locale. S’il ne l’est pas, on la met à jour. Enfin on affiche la liste de numéros. On récupère les préfixes recherché que l’on sauvegarde en session pour plus tard. On n’oublie pas de fermer les connections aux bases de données MySQL. |
Code |
Commentaires |
function get_unused_numbers_with_prices($prefix1,$prefix2){ global $connection; $i_prefix=get_id_prefix($prefix1,$prefix2); $unused_numbers=array(); $price_numbers=array(); $unused=array();
// free $sql = "SELECT `number`, `price` FROM `unused_numbers` WHERE `i_prefix`=".$i_prefix." AND `price`='0' LIMIT ".get_max_free().";"; // ORDER BY RAND() $res = mysql_query($sql, $connection) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); while($numbers = mysql_fetch_assoc($res)){ array_push($unused_numbers, $numbers['number']); array_push($price_numbers, $numbers['price']); } // pay $sql = "SELECT `number`, `price` FROM `unused_numbers` WHERE `i_prefix`=".$i_prefix." AND `price`!='0' LIMIT ".get_max_pay().";"; // ORDER BY RAND() $res = mysql_query($sql, $connection) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); while($numbers = mysql_fetch_assoc($res)){ array_push($unused_numbers, $numbers['number']); array_push($price_numbers, $numbers['price']); } for ($i=0;$i<sizeof($unused_numbers);$i++){ $unused[$unused_numbers[$i]]=$price_numbers[$i]; } return $unused; }
|
On récupère une liste des numéros libres avec leur prix de la table ‘unused_numbers’ locale. Cette liste est limité en nombre par ‘get_max_free()’ et ‘get_max_pay()’ afin de limiter la taille des informations retournées par MySQL et l’affichage d’un trop grand nombre de numéros. Ces variables sont retournés dans une hash array. L’index est le numéro de téléphone et la valeur est le prix. Les premières valeurs sont les numéros payants, puis suivent les gratuits. |
function display_unused_numbers_and_prices($arr_un_pr){ echo "<form method='POST' name='validation'>\n"; echo "<INPUT TYPE=\"hidden\" name=\"privilege\" value=\"".$privilege."\">\n\n"; echo "<INPUT TYPE=\"hidden\" name=\"price1\" value=\"".$price1."\">\n\n"; echo "<INPUT TYPE=\"hidden\" name=\"price2\" value=\"".$price2."\">\n\n"; echo "<INPUT TYPE=\"hidden\" name=\"modele\" value=\"".stripslashes($_POST["modele"])."\">\n"; echo "<INPUT TYPE=\"hidden\" name=\"numero1\" value=\"".stripslashes(convert_to_0XX_XXX_XXXX($_POST["numero1"]))."\">\n"; echo "<INPUT TYPE=\"hidden\" name=\"old_numero1\" value=\"".stripslashes(convert_to_0XX_XXX_XXXX($_POST["numero1"]))."\">\n"; echo "<INPUT TYPE=\"hidden\" name=\"numero2\" value=\"".stripslashes(convert_to_0XX_XXX_XXXX($_POST["numero2"]))."\">\n"; echo "<INPUT TYPE=\"hidden\" name=\"old_numero2\" value=\"".stripslashes(convert_to_0XX_XXX_XXXX($_POST["numero2"]))."\">\n"; echo "<INPUT TYPE=\"hidden\" name=\"Type\" value=\"".stripslashes($_POST["Type"])."\">\n"; echo "<INPUT TYPE=\"hidden\" name=\"societe\" value=\"".stripslashes($_POST["societe"])."\">\n"; echo "<INPUT TYPE=\"hidden\" name=\"Titre\" value=\"".$_POST["Titre"]."\">\n"; echo "<INPUT TYPE=\"hidden\" name=\"type_facture\" value=\"".$_POST["type_facture"]."\">\n"; echo "<INPUT TYPE=\"hidden\" name=\"Nom\" value=\"".stripslashes($_POST["Nom"])."\">\n"; echo "<INPUT TYPE=\"hidden\" name=\"Prenom\" value=\"".stripslashes($_POST["Prenom"])."\">\n"; echo "<INPUT TYPE=\"hidden\" name=\"Adresse\" value=\"".stripslashes($_POST["Adresse"])."\">\n"; echo "<INPUT TYPE=\"hidden\" name=\"NPA\" value=\"".stripslashes($_POST["NPA"])."\">\n"; echo "<INPUT TYPE=\"hidden\" name=\"Ville\" value=\"".stripslashes($_POST["Ville"])."\">\n"; echo "<INPUT TYPE=\"hidden\" name=\"Pays\" value=\"".stripslashes($_POST["Pays"])."\">\n"; echo "<INPUT TYPE=\"hidden\" name=\"TelFixe\" value=\"".stripslashes($_POST["TelFixe"])."\">\n"; echo "<INPUT TYPE=\"hidden\" name=\"TelMobile\" value=\"".stripslashes($_POST["TelMobile"])."\">\n"; echo "<INPUT TYPE=\"hidden\" name=\"Fax\" value=\"".stripslashes($_POST["Fax"])."\">\n"; echo "<INPUT TYPE=\"hidden\" name=\"eMail\" value=\"".stripslashes($_POST["eMail"])."\">\n"; echo "<INPUT TYPE=\"hidden\" name=\"Parrain\" value=\"".$Parrain."\">\n"; echo "<INPUT TYPE=\"hidden\" name=\"Comment\" value=\"".stripslashes($_POST["Comment"])."\">\n\n";
global $id_number_to_post; echo " Numéros payants :<br>\n<center><table><tr>"; $NbreColonnes=5; $colonne=0; foreach ($arr_un_pr as $num => $price){ $num=convert_to_0XX_XXX_XXXX($num); if (($price!=0)&&($num!=$_POST["numero1"])&&($num!=$_POST["numero2"])){ echo "<td><input type='radio' name='numero".$id_number_to_post."' value='".$num."' onclick='complet(validation)'/>".$num." ".$price.".- chf </td>"; $colonne++; } if ($colonne==$NbreColonnes){ echo "</tr><tr>"; $colonne=0; } } echo "</tr></table></center>";
echo " Numéros gratuits :<br>\n<center><table><tr>"; $NbreColonnes=5; $colonne=0; foreach ($arr_un_pr as $num => $price){ $num=convert_to_0XX_XXX_XXXX($num); if (($price==0)&&($num!=$_POST["numero1"])&&($num!=$_POST["numero2"])){ echo "<td><input class='num_list' type='radio' name='numero".$id_number_to_post."' value='".$num."' onclick='complet(validation)'/>".$num." ".$price.".- chf </td>"; $colonne++; } if ($colonne==$NbreColonnes){ echo "</tr><tr>"; $colonne=0; } } echo "</tr></table></center>"; echo "</form>"; } |
On créer le formulaire qui sera posté vers index.php. Le site d’inscription ne possède pas toutes les variables du client en session. Tout passe par les informations postées d’une page à l’autre. On est donc obligé de récupérer ces variables postés et de recréer un formulaire caché pour pouvoir les reposter. $id_number_to_post permet de définir de quel numéro il s’agit comme expliqué plus haut (numéro 1 ou numéro 2). On affiche les input de type radio avec comme valeur (value=’’) le numéro et le nom numero1 ou numero2 (name='numero".$id_number_to_post."’). L’affichage se fait sur 5 colonnes. |
Code |
Commentaires |
function update_database($prefix1, $prefix2){ $prefix=$prefix1.$prefix2;
//--------Mise-a-jour-de-used-numbers--------// $to_insert_in_used=array(); $to_delete_in_used=array(); // On récupére les numéros de db2 $used_in_db2 = get_from_db2_used($prefix); // On récupère les numéros de la db locale $used_in_local = get_used_list_number($prefix);
// Puis, on creer une liste de tous les numéros de db2 qui n'existent pas en local foreach($used_in_db2 as $number => $v){ if (!array_key_exists($number,$used_in_local)) $to_insert_in_used[$number]=0; } // On insère cette liste dans la base locale SI cette liste contient des numéros if (!empty($to_insert_in_used)){ insert_in_local_used($to_insert_in_used); } else { write_in_log("Added in used_numbers : NO"); } // Puis, on creer une liste des numéros présents dans la db locale mais absent de db2 foreach($used_in_local as $number => $v){ if (!array_key_exists($number,$used_in_db2)) $to_delete_in_used[$number]=0; } // Et on les effaces de la db locale if (!empty($to_delete_in_used)){ delete_in_local_used($to_delete_in_used); } else { write_in_log("Deleted in used_numbers : NO"); } //--------Mise-a-jour-de-reserved-numbers--------//
$days_before_cancel=get_days_before_cancel(); $today=gregoriantojd(Date('m'),Date('d'),Date('Y'));
// On récupère la liste de numéros réservés et validé lors de l'inscription (une adresse email est présente). $reserved_numbers_subscribed=get_reserved_list_number_and_date_subscribed($prefix);
// Pour chacun d'eux, si ils sont plus anciens que $days_before_cancel jours, on les efface // Et si ils sont dans db2, on les effaces aussi de réservation. $modif=0; foreach ($reserved_numbers_subscribed as $number => $date){ if (array_key_exists($number,$used_in_db2)){ write_in_log("Found : ".$number." in reserved_numbers also present in used_numbers"); delete_from_reserved($number);
$modif=1; } if (($today-$date)>=$days_before_cancel){ write_in_log("Found : ".$number.". Subscription validation of ".$days_before_cancel." days exceeded"); $email=get_email_adresse($number); if ($email!="") send_cancelation_mail($number,$email); delete_from_reserved($number); $modif=1; } } $reserved_numbers=get_reserved_list_number_and_date($prefix); foreach ($reserved_numbers as $number => $date){ if (($today-$date)>=2){ write_in_log("Found : ".$number." temporary reservation of 2 days exceeded"); delete_from_reserved($number); $modif=1; } } if(!$modif) write_in_log("Deleted in reserved_numbers : NO");
//--------Mise-a-jour-de-unused-numbers--------// $to_insert_in_unused=array(); $to_delete_in_unused=array(); $id_pref = get_id_prefix($prefix1,$prefix2); $used = get_used_list_number($prefix); $reserved = get_reserved_list_number($prefix); $unused = get_unused_list_number($prefix);
$old_res = get_reserved_from_old_database($prefix1); // On récupère la liste des reservations de l'ancien site en fonction du prefixe //
// Pour chaque numero de unused, si il est dans la liste used ou si il est dans reserved ou si il est dans lancien reserved on le supprime de unused_numbers foreach ($unused as $un_num => $k){ if (array_key_exists($un_num,$used)||array_key_exists($un_num,$reserved)||array_key_exists($un_num,$old_res)) $to_delete_in_unused[$un_num]=1; }
// Si le prix d'un des élément à été changé, on supprime tous les numéros de la table unused if(price_to_update($id_pref)){ delete_all_unused_number($id_pref); $unused = get_unused_list_number($prefix); update_last_price_index($id_pref); }
// Pour chaque numero de 41XXXXX0000 à 41XXXXX9999, si il n'est pas dans la liste used et si il n'est pas dans reserved et si il n'est pas dans lancien reserved on l'ajoute dans unused_numbers for ($i=0; $i<10000; $i++) { $num=$prefix.sprintf("%04d",$i); if (!array_key_exists($num,$used)&&!array_key_exists($num,$reserved)&&!array_key_exists($num,$unused)&&!array_key_exists($num,$old_res)) $to_insert_in_unused[$num]=$id_pref; }
// Verifications et modification des BDD if ($to_insert_in_unused!=null){ insert_in_unused_numbers($to_insert_in_unused); } else { write_in_log("Added in unused_numbers : NO"); } if ($to_delete_in_unused!=null){ delete_in_unused_numbers($to_delete_in_unused); } else { write_in_log("Deleted in unused_numbers : NO"); } insert_last_update_date($prefix1,$prefix2); } |
Voici la fonction générale pour la mise à jour de la base de données locale. Elle est lancée une fois par jour pour chaque préfixe. //--------Mise-a-jour-de-used-numbers--------// On récupère la liste des numéros utilisés dans db2 dans l’array $used_in_db2 puis ceux déjà présents en local dans $used_in_local. On fait la différence entre ces deux listes pour connaître les listes de numéros à ajouter et à supprimer en local. On fait la mise à jour de la table used_numbers grâce aux fonctions insert_in_local_used(array) et delete_in_local_used(array). //--------Mise-a-jour-de-reserved-numbers--------// On récupère la valeur en jours du temps maximal de réservations. On récupère la liste des numéros réservés pour ce préfixe avec un email enregistré, c'est-à-dire ceux qui ont validé l’inscription sur le site. Pour chacun d’eux, s’ils sont présents dans db2 cela signifie que le client a signé son contrat, on peut donc effacer ce numéro des numéros réservés. Sinon on compare la date avec le temps maximum alloué pour réserver un numéro si l’inscription a été faite. Si cette date est dépassé (variable `days_before_cancel` de la table `number_config`), on supprime le numéro des numéros réservés et on envoie un email à la personne ayant faite l’inscription. On récupère la liste des numéros réservés pour ce préfixe SANS email enregistré, c'est-à-dire ceux qui n’ont pas validé l’inscription sur le site. On garde la réservation deux jours pour éviter certains problèmes si le client le réserve peu avant minuit et valide l’inscription après minuit. //--------Mise-a-jour-de-unused-numbers--------// On récupère les liste de numéro déjà utilises et des numéros réservés à jour. On récupère également les réservations effectuées selon l’ancienne méthode sur les anciennes bases de données. Pour chacun des numéros présent dans la table `unused_numbers`, si il est présent dans une autre table, on le supprime de `unused_numbers`. On regarde si le prix de tous les numéros du préfixe est à jour, sinon on supprime tous les numéros libres et on écrase la liste `$unused` avec la nouvelle liste des numéros libres qui doit être vide désormais. Ensuite, on liste tous les numéros du préfixe allant de 0000 à 9999 (ex : 41215500000 à 41215509999) et on soustrait les numéros présents dans used_numbers, reserved_numbers ou dans l’ancienne base de donnée. //------------------------------------------------------------// Les listes pour un préfixe des numéros utilisés, des numéros libres et des numéros réservés sont désormais à jour. La prochaine mise à jour se fera le lendemain. |
Code |
Commentaires |
function insert_in_unused_numbers($to_insert_in_unused){ global $connection; $i=0; $sql = "INSERT INTO unused_numbers (number, i_prefix, price) VALUES "; foreach ($to_insert_in_unused as $number => $id_pref){ write_in_log("Added in unused_numbers : ".$number); if ($i<1){ $sql = $sql."('".$number."','".$id_pref."','".calc_number_price($number)."')"; } else { $sql = $sql.",('".$number."','".$id_pref."','".calc_number_price($number)."')"; } $i++; } $sql = $sql.";"; $res = mysql_query($sql, $connection) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); } |
Insertion de numéros dans la table des numéros libres. |
function delete_in_unused_numbers($to_delete_in_unused){ global $connection; $sql = "DELETE FROM `unused_numbers` Where `number` in ("; $i=0; // this is for the coma foreach ($to_delete_in_unused as $number => $v){ write_in_log("Deleted in unused_numbers : ".$number);
if ($i<1) { $sql = $sql.$number; } else { $sql = $sql.",".$number; } $i++; } $sql = $sql.");"; $res = mysql_query($sql, $connection) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); } |
Suppression de numéros dans la table des numéros libres. |
function delete_all_unused_number($id_pref){ global $connection; $sql = "DELETE FROM `unused_numbers` Where `i_prefix`='".$id_pref."'"; $res = mysql_query($sql, $connection) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); } |
Suppression de tous les numéros libres (utilise seulement lorsqu’on recalcule le prix des numéros). |
function get_unused_list_number($prefix){ global $connection; $len=11-strlen($prefix); $unused_numbers=array(); $price_numbers=array(); $unused=array(); $sql = "SELECT `number`, `price` FROM `unused_numbers` WHERE `number` REGEXP '^".$prefix."[0-9]{".$len."}$';"; $res = mysql_query($sql, $connection) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); while($numbers = mysql_fetch_assoc($res)){ array_push($unused_numbers, $numbers['number']); array_push($price_numbers, $numbers['price']); } for ($i=0;$i<sizeof($unused_numbers);$i++){ $unused[$unused_numbers[$i]]=$price_numbers[$i]; } return $unused; } |
Récupération de la liste de numéros libres. |
function get_used_list_number($prefix){ global $connection; $len=11-strlen($prefix); $used_numbers=array(); $used=array(); $sql = "SELECT `number` FROM `used_numbers` WHERE `number` REGEXP '^".$prefix."[0-9]{".$len."}$';"; $res = mysql_query($sql, $connection) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); while($numbers = mysql_fetch_assoc($res)){ array_push($used_numbers, $numbers['number']); } for ($i=0;$i<sizeof($used_numbers);$i++){ $used[$used_numbers[$i]]=1; } return $used; } |
Récupération des numéros utilisés dans la table locale. |
function get_reserved_list_number($prefix){ global $connection; $len=11-strlen($prefix); $res_numbers=array(); $reserved=array(); $sql="SELECT `number` FROM `reserved_numbers` WHERE `number` REGEXP '^".$prefix."[0-9]{".$len."}$';"; $res = mysql_query($sql, $connection) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); while($numbers = mysql_fetch_assoc($res)){ array_push($res_numbers, $numbers['number']); } for ($i=0;$i<sizeof($res_numbers);$i++){ $reserved[$res_numbers[$i]]=1; } return $reserved; } |
Récupération des numéros réservés dans la table locale. |
function get_reserved_list_number_and_date($prefix){ global $connection; $len=11-strlen($prefix); $res_numbers=array(); $reserved=array(); $sql="SELECT `number`, `date` FROM `reserved_numbers` WHERE `number` REGEXP '^".$prefix."[0-9]{".$len."}$';"; $res = mysql_query($sql, $connection) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); while($numbers = mysql_fetch_assoc($res)){ $res_numbers[$numbers['number']]=$numbers['date']; } return $res_numbers; } |
Récupération des numéros réservés avec leur date. |
function get_reserved_list_number_and_date_subscribed($prefix){ global $connection; $len=11-strlen($prefix); $res_numbers=array(); $reserved=array(); $sql="SELECT `number`, `date` FROM `reserved_numbers` WHERE `email`!='' AND `number` REGEXP '^".$prefix."[0-9]{".$len."}$';"; $res = mysql_query($sql, $connection) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); while($numbers = mysql_fetch_assoc($res)){ $res_numbers[$numbers['number']]=$numbers['date']; } return $res_numbers; } |
Récupération des numéros réservés avec leur date si l’inscription a été terminée. |
function get_from_db2_used($prefix){ global $connection2; $used_numbers=array(); $used=array(); $len=11-strlen($prefix);
$sql = "SELECT id FROM Accounts A INNER JOIN Customers C ON A.i_customer = C.i_customer WHERE C.i_rep in (3,5,9,12,17) AND A.id REGEXP '^".$prefix."[0-9]{".$len."}$';"; $res = mysql_query($sql, $connection2) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); while($numbers = mysql_fetch_assoc($res)){ array_push($used_numbers, $numbers['id']); } for ($i=0;$i<sizeof($used_numbers);$i++){ $used[$used_numbers[$i]]=1; } return $used; } |
Récupération des numéros utilisés dans db2. |
function insert_in_local_used($used_to_insert){ global $connection; $i=0; $sql = "INSERT INTO used_numbers (number) VALUES "; foreach ($used_to_insert as $numb => $k){ write_in_log("Added in used_numbers : ".$numb); if ($i<1){ $sql = $sql."('".$numb."')"; } else { $sql = $sql.",('".$numb."')"; } $i++; } $sql = $sql.";"; $res = mysql_query($sql, $connection) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); } |
Insertion en local des numéros utilisés. |
function delete_in_local_used($used_to_delete){ global $connection; $sql = "DELETE FROM `used_numbers` Where `number` in ("; $i=0; // this is for the coma foreach ($used_to_delete as $numb => $v){ write_in_log("Deleted in used_numbers : ".$numb); if ($i<1) { $sql = $sql.$numb; } else { $sql = $sql.",".$numb; } $i++; } $sql = $sql.");"; $res = mysql_query($sql, $connection) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); } |
Suppression en local des numéros utilisés. |
function insert_last_update_date($prefix1,$prefix2){ global $connection; $date=gregoriantojd(Date('m'),Date('d'),Date('Y')); $sql="UPDATE prefixes SET last_update='".$date."' WHERE prefix1='".$prefix1."' AND prefix2='".$prefix2."';"; mysql_query($sql, $connection) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); } |
Insertion en local de la dernière mise à jour du préfixe passé en paramètres. |
function get_days_before_cancel(){ global $connection; $sql="SELECT value FROM number_config WHERE param='days_before_cancel';"; $res = mysql_query($sql, $connection) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); return mysql_result($res, 0); } |
Récupération du temps maximum avant l’annulation de la réservation pour les inscriptions validées sur le site internet. |
function delete_from_reserved($number){ global $connection; $sql = "DELETE FROM `reserved_numbers` Where `number`=".$number.";"; $res = mysql_query($sql, $connection) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); write_in_log("Deleted in reserved_numbers : ".$number); } |
Suppression de la table locale des numéros réservés |
function unused_numbers_is_updated($prefix1,$prefix2){ global $connection; $date=gregoriantojd(Date('m'),Date('d'),Date('Y'));
$sql="SELECT last_update FROM prefixes WHERE prefix1='".$prefix1."' AND prefix2='".$prefix2."';"; $res = mysql_query($sql, $connection) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); if (!mysql_result($res, 0)){ write_in_log("Prefix ".$prefix1.$prefix2." never updated"); return false; } else if (mysql_result($res, 0)<$date){ write_in_log("Prefix ".$prefix1.$prefix2." not up-to_date"); return false; } else{ write_in_log("Prefix ".$prefix1.$prefix2." up-to-date"); return true; } } |
Test de l’état de mise à jour de la BDD du site pour un préfixe. |
function get_id_prefix($prefix1,$prefix2){ global $connection; $sql="SELECT id_prefix FROM prefixes WHERE prefix1='".$prefix1."' AND prefix2='".$prefix2."';"; $res = mysql_query($sql, $connection) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); return mysql_result($res, 0); } |
Retourne l’identifiant d’un préfixe selon le préfixe. |
function get_prefixes_from_id($id_prefix){ global $connection; $prefs = array(); $sql="SELECT prefix1,prefix2 FROM prefixes WHERE id_prefix='".$id_prefix."';"; $res = mysql_query($sql, $connection) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); while($pref = mysql_fetch_assoc($res)){ $prefs["1"]=$pref['prefix1']; $prefs["2"]=$pref['prefix2']; } return $prefs; } |
Retourne le préfixe selon l’identifiant. |
function price_to_update($id_pref){ global $last_price_index; global $connection; $sql="SELECT `last_price_index` FROM `prefixes` WHERE id_prefix='".$id_pref."';"; $res = mysql_query($sql, $connection) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); if ($last_price_index==mysql_result($res, 0)){ return false; } else { return true; } } |
Test de l’état de la mise à jour de prix pour un préfixe. |
function update_last_price_index($id_pref){ global $last_price_index; global $connection; $sql="UPDATE `prefixes` SET `last_price_index`='".$last_price_index."' WHERE id_prefix='".$id_pref."';"; $res = mysql_query($sql, $connection) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); write_in_log("Updated price for prefixe id : ".$id_pref); } |
Mise à de l’index de la dernière mise à jour pour un préfixe. |
function get_max_free(){ global $connection; $sql="SELECT value FROM number_config WHERE param='max_free';"; $res = mysql_query($sql, $connection) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); return mysql_result($res, 0); } |
Retourne le nombre maximum de numéros gratuits à afficher. |
function get_max_pay(){ global $connection; $sql="SELECT value FROM number_config WHERE param='max_pay';"; $res = mysql_query($sql, $connection) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); return mysql_result($res, 0); } |
Retourne le nombre maximum de numéros payants à afficher. |
function get_reserved_from_old_database($prefixe1){ global $connection; $reserved_numbers=array(); $old_res=array(); //On convertit le prefixe 41XX en 0XX pour l'ancienne version de la BDD $prefixe1=ereg_replace("^41","0",$prefixe1); if (table_exists($prefixe1)){ $sql="SELECT `phone` FROM `".$prefixe1."` WHERE flag='1';"; $res = mysql_query($sql, $connection) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); while($numbers = mysql_fetch_assoc($res)){ array_push($reserved_numbers, $numbers['phone']); } // On insere le numéro en le convertissant dans le nouveau format 41XXXXXXXXX for ($i=0;$i<sizeof($reserved_numbers);$i++){ $old_res[convert_to_41XXXXXXXXX($reserved_numbers[$i])]=1; } } return $old_res; } function table_exists($table) { global $connection; $result = mysql_query("show tables like '".$table."'",$connection) or die ('error reading database'); if (mysql_num_rows ($result)>0) return true; else return false; } |
Récupération les numéros réservés de l’ancienne base de donnée (flag=1) |
Code |
Commentaires |
function send_cancelation_mail($cancelled_number,$email_to_contact){ $current_date=date("Y-m-d"); $emailSwitzernet="nicolas.bondier@switzernet.com"; //$emailSwitzernet="contracts@switzernet.com"; $mail=new PHPMailer(); $mail->From=$emailSwitzernet; $mail->FromName="Reservation Canceled ".$cancelled_number; $mail->AddAddress($email_to_contact); $mail->AddAddress($emailSwitzernet); $subject="[Cancel] VOIP ".convert_to_0XX_XXX_XXXX($cancelled_number)." on ".$current_date; $mail->Subject=$subject; $bodyMail=TRAITEMENT_MAIL_CLIENT_PAS_SIGNEE_CONTRAT_1.get_days_before_cancel().TRAITEMENT_MAIL_CLIENT_PAS_SIGNEE_CONTRAT_2; $mail->Body=$bodyMail; if(!$mail->Send()){ write_in_log("email non envoyé pour No ".$cancelled_number." a l'adresse ".$email_to_contact); } else { write_in_log("email envoyé pour No ".$cancelled_number." a l'adresse ".$email_to_contact); } } |
Envoie du mail d’annulation. |
function get_email_adresse($cancelled_number){ global $connection; $sql="SELECT `email` FROM `reserved_numbers` WHERE `number`='".$cancelled_number."';"; $res = mysql_query($sql, $connection) or die(write_in_log('Erreur SQL !<br>'.$sql.'<br>'.mysql_error())); if (mysql_num_rows($res)==0){ write_in_log("Pas de mail pour le num ".$cancelled_number); return ""; } else { write_in_log("email pour le num ".$cancelled_number." trouvé : ".mysql_result($res, 0)); return mysql_result($res, 0); } } |
Récupère l’adresse email d’un client dans la table des numéros réservés. |
Code |
Commentaires |
function convert_to_0XX_XXX_XXXX($number){ if (ereg('^41',$number)){ $number=substr_replace(substr_replace(ereg_replace("^41","0",$number),"-",3,0),"-",7,0); return $number; } else { return $number; } } |
Fonction de conversion au format de numéro 0XX-XXX-XXXX |
function convert_to_41XXXXXXXXX($number){ if (ereg('^0',$number)){ $number=ereg_replace("-","",ereg_replace("^0","41",$number)); return $number; } else { return $number; } } |
Fonction de conversion au format de numéro 41XXXXXXXXX |
function write_in_log($logtxt){ date_default_timezone_set('UTC+1'); $fp = fopen('log_numbers/'.date('Y-m-d').'.log','a+'); fseek($fp,SEEK_END); $nouvlog=date("y-m-d H:i:s")." | ".$logtxt."\r\n"; fputs($fp,$nouvlog); fclose($fp); } |
Fonction permettant d’écrire dans le fichier de log |
function delete_old_log(){ $exp_date=date("Y-m-d",strtotime('-1 month')); $rep = "log_numbers"; $dir = opendir($rep); while ($file=readdir($dir)){ $file_date=basename($file,".log"); if (strtotime($exp_date)>strtotime($file_date)){ unlink($rep."/".$file); } } closedir($dir); } |
Fonction pour la rotation des logs. Un nouveau log est créé par jour avec le format de date yyyy-mm-dd-log et il est supprimé au bout d’un mois. |
Code |
Commentaires |
<?php //-------------------PRICES---------------------// //
// price-update-activation // Si vous metter à jour le tarrif d'un des tarrifs si dessous, incrémentez la variable $last_price_index. // Le prix sera mis à jour lors de la prochaine mise à jour d'un préfixe, lors de l'affichage des numéros disponible pour ce préfixe. // Les mises à jour se font chaque jour.
$last_price_index=2;
function calc_number_price($number){ //formatage if (ereg('^0',$number)){ $number=ereg_replace("-","",ereg_replace("^0","41",$number)); return price($number); } else { return price($number); } } function price($number){
$price=0; $number=ltrim($number, "0"); $n1=substr($number,7,1); $n2=substr($number,8,1); $n3=substr($number,9,1); $n4=substr($number,10,1); $price=$price+xxxx($n1,$n2,$n3,$n4); $price=$price+xxxy($n1,$n2,$n3,$n4); $price=$price+xxyy($n1,$n2,$n3,$n4); $price=$price+xyxy($n1,$n2,$n3,$n4); $price=$price+xyyx($n1,$n2,$n3,$n4); $price=$price+two_digits($n1,$n2,$n3,$n4); $price=$price+sequence($n1,$n2,$n3,$n4); $price=$price+inv_seq($n1,$n2,$n3,$n4); $price=$price+double_sequence($n1,$n2,$n3,$n4); $price=$price+inv_double($n1,$n2,$n3,$n4); $price=$price+xyxz($n1,$n2,$n3,$n4); $price=$price+xyzy($n1,$n2,$n3,$n4); $price=$price+two_zeros($n1,$n2,$n3,$n4); $price=$price+three_zeros($n1,$n2,$n3,$n4); $price=$price+one_zero($n1,$n2,$n3,$n4); $price=$price+xyzz($n1,$n2,$n3,$n4); $price=$price+xxyz($n1,$n2,$n3,$n4); return $price; } function xxxx($n1,$n2,$n3,$n4){ if($n1==$n2&&$n1==$n3&&$n1==$n4){ return 5000; }else{ return 0; } } function xxxy($n1,$n2,$n3,$n4){ if($n1==$n2&&$n1==$n3){ return 2000; }else{ return 0; } } function xxyy($n1,$n2,$n3,$n4){ if($n1==$n2&&$n3==$n4){ return 1000; }else{ return 0; } } function xyxy($n1,$n2,$n3,$n4){ if($n1==$n3&&$n2==$n4){ return 1000; }else{ return 0; } } function xyyx($n1,$n2,$n3,$n4){ if($n1==$n4&&$n2==$n3){ return 500; }else{ return 0; } } function xyxz($n1,$n2,$n3,$n4){ if($n1==$n3){ return 100; }else{ return 0; } } function xyzy($n1,$n2,$n3,$n4){ if($n2==$n4){ return 100; }else{ return 0; } } function xyzz($n1,$n2,$n3,$n4){ if($n3==$n4){ return 75; }else{ return 0; } } function xxyz($n1,$n2,$n3,$n4){ if($n1==$n2){ return 15; }else{ return 0; } } function two_digits($n1,$n2,$n3,$n4){ $min=min($n1,$n2,$n3,$n4); $max=max($n1,$n2,$n3,$n4); $n_min=0; $n_max=0; foreach(array($n1, $n2, $n3, $n4) as $n){ if ($n==$min) $n_min=$n_min+1; if ($n==$max) $n_max=$n_max+1; } if(($n_min+$n_max)>=4){ return 300; }else{ return 0; } } function sequence($n1,$n2,$n3,$n4){ if($n2==$n1+1&&$n3==$n2+1&&$n4==$n3+1){ return 500; }else{ return 0; } } function inv_seq($n1,$n2,$n3,$n4){ if($n2==$n1-1&&$n3==$n2-1&&$n4==$n3-1){ return 250; }else{ return 0; } } function double_sequence($n1,$n2,$n3,$n4){ if(($n1*10+$n2+1)==($n3*10+$n4)){ return 300; }else{ return 0; } } function inv_double($n1,$n2,$n3,$n4){ if(($n1*10+$n2-1)==($n3*10+$n4)){ return 200; }else{ return 0; } } function one_zero($n1,$n2,$n3,$n4){ $n_zero=0; foreach(array($n1, $n2, $n3, $n4) as $n){ if ($n==0) $n_zero++; } if($n_zero>=1){ return 5; }else{ return 0; } } function two_zeros($n1,$n2,$n3,$n4){ $n_zero=0; foreach(array($n1, $n2, $n3, $n4) as $n){ if ($n==0) $n_zero++; } if($n_zero>=2){ return 50; }else{ return 0; } } function three_zeros($n1,$n2,$n3,$n4){ $n_zero=0; foreach(array($n1, $n2, $n3, $n4) as $n){ if ($n==0) $n_zero++; } if($n_zero>=3){ return 500; }else{ return 0; } }
?> |
La page calcul_price.php contient les fonctions permettant le calcul de prix des numéros en fonction des 4 derniers chiffres de ce numéro. Pour chacun des numéros, on test si il correspond à la combinaison donnée. Si oui on ajoute le prix correspondant qui est la valeur retournée d’une fonction. |
Code |
Commentaires |
<tr> <td align="right" style='padding-top:10pt'> <?= DATAS_NUM ?> </td> <td style='padding-top:10pt'> <INPUT TYPE="insert" name="numero_1" maxlength="30" value="<?= $numero_1 ?>" size='35' readonly> </td> <td style='padding-left:20pt; padding-top:10pt'> <?= DATAS_NUM_SEL ?>: <div> <div style='display:inline'> <select name="prefixes1_1" id="prefixe1_1" onchange="get_prefixe2_num1()"> <option value="-1" >Prefixe</option> <?php foreach ($prefixes1 as $key => $value){ echo "<option value='".$value."'"; if ($value==$_SESSION['prefixes']["num1"][1]) echo "selected='selected'"; echo ">".ereg_replace("^41","0",$value)."</option>\n"; } ?> </select> </div> <div id='prefixe2_1' style='display:inline'> <select name="prefixes2_1" id="prefixe_2_1" > <option value="-1" selected="selected"><= Choisir</option> </select> </div> <div style='display:inline'> <input type=submit id="search_numbers" disabled = 'disabled' value=Chercher onClick="numbers(formul)"/> </div> </div> <div style='margin-top:-2pt'> <a href="javascript: voir_carte(1,formul)"> Voir la carte</a> </div> </td> </tr>
<? if ($modele=='PAP2T') { echo "<tr> <td align='right' style='padding-top:10pt'>".DATAS_NUM." </td> <td style='padding-top:10pt'> <INPUT TYPE='insert' name='numero_2' maxlength='30' value='".$numero_2."' size='35' readonly> </td> <td style='padding-left:20pt; padding-top:10pt'>".DATAS_NUM_SEL." : <div> <div style='display:inline'> <select name='prefixes1_2' id='prefixe1_2' onchange='get_prefixe2_num2()'> <option value='-1' >Prefixe</option>"; foreach ($prefixes1 as $key => $value){ echo "<option value='".$value."'"; if ($value==$_SESSION['prefixes']["num2"][1]) echo "selected='selected'"; echo ">".ereg_replace("^41","0",$value)."</option>\n"; } echo "</select> </div> <div id='prefixe2_2' style='display:inline'> <select name='prefixes2_2' id='prefixe_2_2' > <option value='-1' selected='selected'><= Choisir</option> </select> </div> <div style='display:inline'> <input type=submit id='search_numbers2' disabled = 'disabled' value=Chercher onClick='numbers2(formul)'/> </div> </div> <div style='margin-top:-2pt'> <a href=\"javascript: voir_carte(2,formul)\" > Voir la carte</a> </div> </td> </tr>"; } ?>
|
#index.php Affichage des liste déroulantes. Lors du choix du premier préfixe par la liste déroulante, les fonctions JavaScript ‘get_prefixe2_num1()’ (ou bien ‘get_prefixe2_num2()’ si il s’agit du deuxième numéro dans le cas du pap2t) est lancé. Si la variable $_SESSION[‘prefixes’][‘num1’] est définie, on affiche la valeur du préfixe correspondante à la dernière recherche de préfixes faite par la liste déroulante dans cette liste déroulante. |
<script type='text/javascript'> function getXhr(){ var xhr = null; if(window.XMLHttpRequest) // Firefox et autres xhr = new XMLHttpRequest(); else if(window.ActiveXObject){ // Internet Explorer try { xhr = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { xhr = new ActiveXObject("Microsoft.XMLHTTP"); } } else { // XMLHttpRequest non supporté par le navigateur alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest..."); xhr = false; } return xhr; }
/** * Méthode qui sera appelée sur le click du bouton */ function get_prefixes2(){ get_prefixe2_num1(); get_prefixe2_num2();
}
function get_prefixe2_num1(){ var xhr = getXhr();
// On défini ce qu'on va faire quand on aura la réponse xhr.onreadystatechange = function(){ // On ne fait quelque chose que si on a tout reçu et que le serveur est ok if(xhr.readyState == 4 && xhr.status == 200){ leselect = xhr.responseText; // On se sert de innerHTML pour rajouter les options a la liste document.getElementById('prefixe2_1').innerHTML = leselect; } }
// Ici on va voir comment faire du post xhr.open("POST","getpref2.php",true); // ne pas oublier ça pour le post xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded'); // ne pas oublier de poster les arguments // ici, l'id 1 sel = document.getElementById('prefixe1_1'); prefixe1 = sel.options[sel.selectedIndex].value; xhr.send("prefixe1_1="+prefixe1); verify_select1_select2_num1();
}
function verify_select1_select2_num1(){ var i=1; //alert(i+" fois") sel1 = document.getElementById('prefixe1_1'); prefixe1 = sel1.options[sel1.selectedIndex].value;
if (prefixe1=='-1'){ document.getElementById('search_numbers').disabled = 'disabled'; } else { document.getElementById('search_numbers').disabled = ''; } }
function get_prefixe2_num2(){ var xhr = getXhr();
// On défini ce qu'on va faire quand on aura la réponse xhr.onreadystatechange = function(){ // On ne fait quelque chose que si on a tout reçu et que le serveur est ok if(xhr.readyState == 4 && xhr.status == 200){ leselect = xhr.responseText; // On se sert de innerHTML pour rajouter les options a la liste document.getElementById('prefixe2_2').innerHTML = leselect; } }
// Ici on va voir comment faire du post xhr.open("POST","getpref2.php",true); // ne pas oublier ça pour le post xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded'); // ne pas oublier de poster les arguments // ici, l'id 1 sel = document.getElementById('prefixe1_2'); prefixe1 = sel.options[sel.selectedIndex].value; xhr.send("prefixe1_2="+prefixe1); verify_select1_select2_num2(); }
function verify_select1_select2_num2(){ var i=1; //alert(i+" fois") sel1 = document.getElementById('prefixe1_2'); prefixe1 = sel1.options[sel1.selectedIndex].value;
if (prefixe1=='-1'){ document.getElementById('search_numbers2').disabled = 'disabled'; } else { document.getElementById('search_numbers2').disabled = ''; } }
</script>
|
#index.php La fonction JavaScript appelé ‘get_prefixe2_num1()’ va appeler la page getpref2.php (qui est une liste html généré par php) et remplacera la seconde liste déroulante par celle-ci. Au chargement de la page, ces deux fonctions sont lancées en même temps car elles vérifient qu’aucun préfixe n’est déjà sélectionné, si tel est le cas, elles mettent la variable -1 aux liste déroulantes pour n’afficher aucun préfixe.
|
<?php session_start();
include "include/configure.php"; include "include/dbconnect.php";
$block_exclu="999";
if (isset($_POST["prefixe1_1"])){ $post_prefixe1=$_POST["prefixe1_1"]; $id_select="1"; } else if (isset($_POST["prefixe1_2"])){ $post_prefixe1=$_POST["prefixe1_2"]; $id_select="2"; }
echo "<select name='prefixes2_".$id_select."' id='prefixe_2_".$id_select."' onchange='verify_select1_select2_num".$id_select."()' style='display:inline'>"; if($post_prefixe1!=""){ $prefixe1=$post_prefixe1; if ($prefixe1=='-1'){ echo "<option value='-1' selected='selected'><= Choisir</option>"; } else { $prefixe1=ereg_replace("^0","41",$prefixe1); $res = mysql_query("SELECT prefix2 FROM prefixes WHERE prefix1='".$prefixe1."' AND prefix2!='".$block_exclu."';"); $i=0; while($row = mysql_fetch_assoc($res)){ if (isset($_SESSION['prefixes']['num'.$id_select][2]) && $_SESSION['prefixes']['num'.$id_select][2]==$row["prefix2"] ){
echo "<option value='".$_SESSION['prefixes']['num'.$id_select][2]."' selected='selected'>".$row["prefix2"]."</option>"; $i++; } else if ($i<1 && !isset($_SESSION['prefixes']['num'.$id_select][2])){ echo "<option value='".$row["prefix2"]."' selected='selected'>".$row["prefix2"]."</option>"; $i++; } else { echo "<option value='".$row["prefix2"]."'>".$row["prefix2"]."</option>"; } } } } echo "</select>"; ?> |
#index.php getpref2.php Cette page récupère le premier block d’un préfixe grâce au $_post envoyé par la fonction ‘get_prefixe2_num1()’ de index.php et retourne une liste de tous les seconds blocks de préfixes correspondants. Cette recherche est faite dans la table ‘prefixes’. Si la valeur du $_post est ‘-1’ (lorsqu’on arrive sur la page, qu’elle est rechargée ou que le client a déjà choisi un numéro) alors seul une liste avec une option ‘Choisir block’ est créée. |
Code |
Commentaires |
<? function reserve_number($number){ global $connection; $number=convert_to_41XXXXXXXXX($number); // Pour etre sûr // Verification que le numéro n'est pas déja dans la table reserved_numbers. $sql = "SELECT `number` FROM `reserved_numbers` where `number`='".$number."';"; $req = mysql_query($sql) or die(write_in_log('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()));
if (mysql_num_rows($req) != 0){ write_in_log("Number : ".$number." already in reserved_numbers."); echo mysql_num_rows($req); } else if (ereg('^41[0-9]{9}',$number)) { // Petit check pour etre sûr de pas faire de betises // Suppression dans unused $sql = "DELETE FROM `unused_numbers` Where `number`=".$number.";"; $req = mysql_query($sql) or die(write_in_log('Erreur SQL !<br>'.$sql.'<br>'.mysql_error())); write_in_log("Deleted in unused_numbers : ".$number);
// Ajout dans la table reservation $date=gregoriantojd(Date('m'),Date('d'),Date('Y')); $sql = "INSERT INTO reserved_numbers (number, date) VALUES ('".$number."','".$date."');";
$req = mysql_query($sql) or die(write_in_log('Erreur SQL !<br>'.$sql.'<br>'.mysql_error())); write_in_log("Added in reserved_numbers : ".$number); } }
|
Lorsqu’un futur client choisit un numéro depuis la page numbers.php, le numéro est automatiquement enregistré dans les variables $_POST. Cependant, il faut tout de suite le réserver pour qu’il ne soit pas choisi par une autre personne. On l’efface donc des numéros libres et on le rajoute dans les numéros réservés. |
function unreserve_number($number){ global $connection; $number=convert_to_41XXXXXXXXX($number); // Pour etre sûr $sql = "SELECT `number` FROM `unused_numbers` where `number`='".$number."';"; $req = mysql_query($sql) or die(write_in_log('Erreur SQL !<br>'.$sql.'<br>'.mysql_error())); if (mysql_num_rows($req) != 0){ write_in_log("Number : ".$number." already in unused_numbers."); } else if (ereg('^41[0-9]{9}',$number)){ // Petit check pour etre sûr de pas faire de betises //Suppression dans reserved $sql = "DELETE FROM `reserved_numbers` Where `number`=".$number.";"; $req = mysql_query($sql) or die(write_in_log('Erreur SQL !<br>'.$sql.'<br>'.mysql_error())); write_in_log("Deleted in reserved_numbers : ".$number);
//Rajout dans unused $sql = "SELECT id_prefix FROM prefixes WHERE prefix1='".substr($number,0,4)."' AND prefix2='".substr($number,4,3)."';"; $res = mysql_query($sql, $connection) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); $id_prefix=mysql_result($res, 0);
$sql = "INSERT INTO `unused_numbers` (number,i_prefix,price) VALUES ('".$number."','".$id_prefix."','".calc_number_price($number)."');"; $req = mysql_query($sql) or die(write_in_log('Erreur SQL !<br>'.$sql.'<br>'.mysql_error())); write_in_log("Added in unused_numbers : ".$number); } } ?> |
Il faut également libérer l’ancien numéro choisit. |
Code |
Commentaires |
<html> <head> <link href="../style.css" rel="stylesheet" type="text/css">
</head> <body> <script language="javascript"> function validation_carte(formul,num){ my_form = eval(formul); my_form.action="../numbers.php?num="+num; my_form.submit(); } function getPopupObject(myId) { if (document.getElementById(myId)) { return document.getElementById(myId); } else { return window.document[myId]; } } function alterCursor(elementId, cursorType) { var myElement=getPopupObject(elementId); if (myElement) { myElement.style.cursor=cursorType; } }
function get_prefixe2(prefixe1,num) { var xhr = getXhr();
// On défini ce qu'on va faire quand on aura la réponse xhr.onreadystatechange = function(){ // On ne fait quelque chose que si on a tout reçu et que le serveur est ok if(xhr.readyState == 4 && xhr.status == 200){ leselect = xhr.responseText; // On se sert de innerHTML pour rajouter les options a la liste document.getElementById('prefixe2_1').innerHTML = leselect; } }
// Ici on va voir comment faire du post xhr.open("POST","getpref2.php",true); // ne pas oublier ça pour le post xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded'); // ne pas oublier de poster les arguments // ici, l'id 1
xhr.send("prefixe1_"+num+"="+prefixe1); } function getXhr(){ var xhr = null; if(window.XMLHttpRequest) // Firefox et autres xhr = new XMLHttpRequest(); else if(window.ActiveXObject){ // Internet Explorer try { xhr = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { xhr = new ActiveXObject("Microsoft.XMLHTTP"); } } else { // XMLHttpRequest non supporté par le navigateur alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest..."); xhr = false; } return xhr; }
</script> <br><br> <center><h2>Choisissez une région</h2></center> <br><br><br><br><br><br> <form name="map_form" method="post">
<center> |
#map/index.php Javascript qui permet d’afficher la partie des blocks de numéros correspondant au préfixe. Il remplace le contenu de "<div id='prefixe2_1'>" par la page map/getpref2.php. |
<?
include "../include/functions_communes.php";
if(isset($_GET['n'])&&($_GET['n']=="2"||$_GET['n']=="1")){ $n=$_GET['n']; }else{ $n="1"; }
echo ' <img id="coloredMap" src="http://switzernet.com/public/110426-indicatifs-044-043-041-055-056-052/map.png" width="587" height="392" border="0" usemap="#map" /> <map name="map" > <!-- #$-:Image map file created by GIMP Image Map plug-in --> <!-- #$-:GIMP Image Map plug-in by Maurits Rijk --> <!-- #$-:Please do not edit lines starting with "#$" --> <!-- #$VERSION:2.3 --> <!-- #$AUTHOR:Nicolas Bondier --> <area shape="poly" style="cursor:pointer" id="area'.$n.'" coords="174,62,148,59,129,88,151,90,103,148,70,165,74,187,106,173,112,184,143,161,166,163,202,136,225,131,239,110,216,105,217,89,193,96,167,77,170,66" onClick="get_prefixe2(\'032\','.$n.')" /> <area shape="poly" style="cursor:pointer" coords="172,71,179,75,197,72,203,62,216,43,235,41,234,54,240,63,242,85,233,81,217,89,192,94,170,79" onClick="get_prefixe2(\'061\','.$n.')" /> <area shape="poly" style="cursor:pointer" coords="289,47,263,54,261,49,250,46,241,53,238,84,226,83,215,94,215,106,233,106,241,113,232,119,225,128,238,139,246,150,257,150,258,129,268,127,275,123,276,117,281,112,302,119,303,107,300,98,298,92,303,80,291,80,286,78,283,74,288,68,293,60,291,53,288,48" onClick="get_prefixe2(\'062\','.$n.')" /> <area shape="poly" style="cursor:pointer" coords="290,47,292,55,292,61,290,61,285,78,303,78,299,93,301,98,300,109,307,105,314,121,320,121,322,105,326,102,318,88,319,51,307,43,298,42" onClick="get_prefixe2(\'056\','.$n.')" /> <area shape="poly" style="cursor:pointer" coords="254,149,265,158,262,173,257,177,257,184,264,184,266,182,266,194,270,203,262,211,256,206,249,201,239,192,234,187,228,173,222,164,215,160,212,157,213,148,213,140,215,132,221,127,239,138,241,148,252,150" onClick="get_prefixe2(\'034\','.$n.')" /> <area shape="poly" style="cursor:pointer" coords="214,139,204,136,190,148,184,156,164,162,171,183,183,186,183,198,181,207,188,215,202,214,205,202,229,193,235,191,222,164,211,161" onClick="get_prefixe2(\'031\','.$n.')" /> <area shape="poly" style="cursor:pointer" coords="197,214,184,215,179,201,183,191,176,181,169,182,164,172,163,161,146,162,112,187,116,192,115,206,123,206,128,219,123,223,128,233,128,245,142,247,140,266,166,280,167,267,171,267,171,261,181,242,183,226,189,228,189,224" onClick="get_prefixe2(\'026\','.$n.')" /> <area shape="poly" style="cursor:pointer" coords="114,207,107,212,102,208,97,212,92,214,81,219,72,220,68,219,68,201,75,187,106,174,117,194" onClick="get_prefixe2(\'024\','.$n.')" /> <area shape="poly" style="cursor:pointer" coords="69,202,27,233,36,248,47,246,48,266,57,257,69,258,79,248,86,250,98,252,133,267,131,276,129,276,146,269,141,263,142,246,129,244,129,230,122,224,126,216,122,207,114,207,108,211,102,208,86,218,67,221" onClick="get_prefixe2(\'021\','.$n.')" /> <area shape="poly" style="cursor:pointer" coords="30,244,17,263,32,275,22,297,4,303,4,320,35,319,52,297,44,297,44,289,32,305,33,294,50,266,45,247" onClick="get_prefixe2(\'022\','.$n.')" /> <area shape="poly" style="cursor:pointer" coords="128,277,117,275,112,280,119,297,112,311,113,324,127,324,134,315,153,311,163,298,168,288,166,280,143,268" onClick="get_prefixe2(\'024\','.$n.')" /> <area shape="poly" style="cursor:pointer" coords="171,290,178,279,182,286,196,277,211,278,209,272,237,272,249,262,265,256,270,245,299,254,319,245,323,234,320,222,327,220,327,207,317,203,305,208,287,205,274,201,261,210,236,190,201,204,202,215,195,217,181,237,168,273,169,291" onClick="get_prefixe2(\'033\','.$n.')" /> <area shape="poly" style="cursor:pointer" coords="169,289,150,313,132,319,121,337,128,340,140,351,151,380,176,368,190,371,213,357,236,369,253,369,253,355,266,353,272,342,271,337,284,329,292,318,280,300,288,294,311,281,308,272,319,267,318,258,332,251,318,245,302,257,273,245,255,262,227,274,195,281" onClick="get_prefixe2(\'027\','.$n.')" /> <area shape="poly" style="cursor:pointer" coords="332,249,317,269,329,267,328,295,325,295,331,312,336,311,355,337,375,337,372,356,389,379,386,387,400,388,409,374,398,360,402,342,437,293,428,268,419,257,406,263,401,252,400,238,388,236,378,244,365,243,355,241,350,246,347,242,333,244" onClick="get_prefixe2(\'091\','.$n.')" /> <area shape="poly" style="cursor:pointer" coords="355,241,351,231,355,219,370,212,380,197,388,200,399,200,402,187,411,192,426,181,425,158,415,157,415,152,423,135,440,134,455,109,464,112,456,126,462,145,454,151,482,150,508,159,508,175,536,193,550,188,551,174,560,174,568,161,582,174,582,191,569,228,578,229,581,252,557,250,551,245,553,236,550,233,531,238,529,259,530,273,540,270,542,278,537,289,546,307,534,311,516,283,490,289,490,296,469,298,454,282,455,259,451,265,443,258,434,258,432,269,421,256,407,262,400,237,388,234,381,243" onClick="get_prefixe2(\'081\','.$n.')" /> <area shape="poly" style="cursor:pointer" coords="464,110,481,89,477,75,465,67,454,69,431,44,415,35,403,32,405,41,397,53,397,63,385,76,420,136,440,133,456,108" onClick="get_prefixe2(\'071\','.$n.')" /> <area shape="poly" style="cursor:pointer" coords="391,91,384,94,373,116,370,130,358,135,361,142,357,158,368,157,373,162,383,161,389,182,381,183,381,197,391,200,400,199,402,187,414,189,425,178,424,161,413,159,414,154,418,134,397,104" onClick="get_prefixe2(\'055\','.$n.')" /> <area shape="poly" style="cursor:pointer" coords="359,137,347,124,318,123,305,107,303,122,281,114,278,119,278,125,258,129,255,150,266,161,258,177,259,183,266,181,268,202,284,201,307,208,316,202,328,204,328,221,321,223,324,240,320,246,332,252,333,246,347,243,351,244,355,242,351,230,365,210,369,212,373,203,380,196,377,186,386,179,380,164,357,159" onClick="get_prefixe2(\'041\','.$n.')" /> <area shape="poly" style="cursor:pointer" coords="322,93,380,93,380,108,372,112,370,128,356,135,350,124,320,122,326,100" onClick="get_prefixe2(\'044\','.$n.')" /> <area shape="poly" style="cursor:pointer" coords="322,92,319,74,320,51,335,50,331,47,339,42,354,80,360,86,373,83,378,92" onClick="get_prefixe2(\'043\','.$n.')" /> <area shape="poly" style="cursor:pointer" coords="347,47,352,34,348,30,340,32,337,37,329,39,323,32,325,22,330,16,344,6,350,9,350,12,353,8,360,15,366,15,362,21,366,29,373,30,370,24,373,22,382,28,380,31,384,39,402,32,405,41,398,53,398,67,385,73,388,92,379,91,373,81,361,86,354,79,356,76,347,49" onClick="get_prefixe2(\'052\','.$n.')" /> </map>';
echo "<div id='prefixe2_1'>"; echo "</div>";
echo "<INPUT TYPE=\"hidden\" name=\"privilege\" value=\"".$privilege."\">\n\n"; echo "<INPUT TYPE=\"hidden\" name=\"price1\" value=\"".$price1."\">\n\n"; echo "<INPUT TYPE=\"hidden\" name=\"price2\" value=\"".$price2."\">\n\n"; echo "<INPUT TYPE=\"hidden\" name=\"modele\" value=\"".stripslashes($_POST["modele"])."\">\n"; echo "<INPUT TYPE=\"hidden\" name=\"numero1\" value=\"".stripslashes(convert_to_0XX_XXX_XXXX($_POST["numero1"]))."\">\n"; echo "<INPUT TYPE=\"hidden\" name=\"old_numero1\" value=\"".stripslashes(convert_to_0XX_XXX_XXXX($_POST["numero1"]))."\">\n"; echo "<INPUT TYPE=\"hidden\" name=\"numero2\" value=\"".stripslashes(convert_to_0XX_XXX_XXXX($_POST["numero2"]))."\">\n"; echo "<INPUT TYPE=\"hidden\" name=\"old_numero2\" value=\"".stripslashes(convert_to_0XX_XXX_XXXX($_POST["numero2"]))."\">\n"; echo "<INPUT TYPE=\"hidden\" name=\"Type\" value=\"".stripslashes($_POST["Type"])."\">\n"; echo "<INPUT TYPE=\"hidden\" name=\"societe\" value=\"".stripslashes($_POST["societe"])."\">\n"; echo "<INPUT TYPE=\"hidden\" name=\"Titre\" value=\"".$_POST["Titre"]."\">\n"; echo "<INPUT TYPE=\"hidden\" name=\"type_facture\" value=\"".$_POST["type_facture"]."\">\n"; echo "<INPUT TYPE=\"hidden\" name=\"Nom\" value=\"".stripslashes($_POST["Nom"])."\">\n"; echo "<INPUT TYPE=\"hidden\" name=\"Prenom\" value=\"".stripslashes($_POST["Prenom"])."\">\n"; echo "<INPUT TYPE=\"hidden\" name=\"Adresse\" value=\"".stripslashes($_POST["Adresse"])."\">\n"; echo "<INPUT TYPE=\"hidden\" name=\"NPA\" value=\"".stripslashes($_POST["NPA"])."\">\n"; echo "<INPUT TYPE=\"hidden\" name=\"Ville\" value=\"".stripslashes($_POST["Ville"])."\">\n"; echo "<INPUT TYPE=\"hidden\" name=\"Pays\" value=\"".stripslashes($_POST["Pays"])."\">\n"; echo "<INPUT TYPE=\"hidden\" name=\"TelFixe\" value=\"".stripslashes($_POST["TelFixe"])."\">\n"; echo "<INPUT TYPE=\"hidden\" name=\"TelMobile\" value=\"".stripslashes($_POST["TelMobile"])."\">\n"; echo "<INPUT TYPE=\"hidden\" name=\"Fax\" value=\"".stripslashes($_POST["Fax"])."\">\n"; echo "<INPUT TYPE=\"hidden\" name=\"eMail\" value=\"".stripslashes($_POST["eMail"])."\">\n"; echo "<INPUT TYPE=\"hidden\" name=\"Parrain\" value=\"".$Parrain."\">\n"; echo "<INPUT TYPE=\"hidden\" name=\"Comment\" value=\"".stripslashes($_POST["Comment"])."\">\n\n";
?> </center> </form> </body> </html>
|
#map/index.php Définition des aires de la carte. |
<?php include "../include/configure.php"; include "../include/dbconnect.php";
$block_exclu="999";
function pref1_pref2(){ global $connection; $prefs=array(); $sql = "SELECT id_prefix, prefix1, prefix2 FROM prefixes"; $req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); while($prefix = mysql_fetch_assoc($req)){ $prefs[$prefix["id_prefix"]]=array(ereg_replace("^41","0",$prefix["prefix1"]),$prefix["prefix2"]); } mysql_close($connection); return $prefs; }
if (isset($_POST["prefixe1_1"])){ $post_prefixe1=$_POST["prefixe1_1"]; $id_select="1"; } else if (isset($_POST["prefixe1_2"])){ $post_prefixe1=$_POST["prefixe1_2"]; $id_select="2"; } echo "<br><center><h2>Choisissez un block de numero :</h2><table><tr>"; $pref1_pref2=pref1_pref2(); foreach ($pref1_pref2 as $id_pref => $prefixes){ if ($prefixes[0] == $post_prefixe1 && $prefixes[1] != $block_exclu) echo '<td><input type=\'radio\' name="id_prefixe" value="'.$id_pref.'" onclick="validation_carte(\'map_form\','.$id_select.')" />'.$prefixes[0].'-'.$prefixes[1].'</td>'; } echo "</tr></table></center>"; ?> |
#map/getpref2.php Récupère en $_POST le préfixe et affiche une liste de boutons avec blocks correspondant au préfixe. |
Le fichier zip de la page de payement modifiée est disponible ici : www.switzernet.com/3/company/110222-files/110928-payement-poste/070418-paymentPoste.zip
Ancien site d’inscription : http://switzernet.com/public/070608-110926-subscribe/
Nouveau site d’inscription : http://switzernet.com/public/070608-subscribe/
Zip du site d’inscription : http://switzernet.com/3/company/110222-files/110928-subscribe-save/070608-subscribe.zip
* * *