Page 1 sur 3

Projet localisation géographique

Posté : 29 mai 2007, 13:51
par supernony
Bonjour à tous je suis actuellement en 1ere année de bts ig et également en stage de fin d'année.

Je dois créer un site qui permet de localiser ceux qui se connectent en récupérant leur adresses ip.
Je suis donc allé sur maxmind pour récupérer la base de données qui m'interesse, elle est au format .csv et fait environ 6Mo.

Je suis donc la procédure pour importer cette base de données sous mysql. Le probleme c'est qu'elle est trop volumineuse et j'arrive pas à la diviser car c'est un fichier csv.
Je suis donc bloqué si quelqu'un pouvait m'aider ce serait sympa :)
de + mon prof voudrait que après j'importe le csv dans la base de données mais en programmant moi meme l'importation (avec des explode aparement) mais faut avouer que je suis pas une élite en php lol
j'attends vos réponses
merci à tous.

[Modération de Zeus : pfiou, si tu sautes aucune lignes, on a l'impression que tu reprends pas ton souffle :lol:]

Posté : 29 mai 2007, 15:21
par @rthur
Bonjour,

Pour l'importation, effectue là en local sur ton PC et coche la case "CSV via LOAD DATA" dans phpmyadmin, normalement ça devrait passer tout seul.
Si tu n'a pas cette option sur la page d'import, met à jour mysql et phpmyadmin.

Concernant ta 2ème question, lit ton fichier ligne par ligne, fait un explode sur le caractère séparateur du CSV (point-virgule normalement) et pour chaque ligne, effectue un INSERT pour l'insertion dans MySQL...

http://fr.php.net/fgets (regarde l'exemple)
http://fr.php.net/explode
http://fr.php.net/mysql_query

A toi de bosser maintenant! ;)

re

Posté : 29 mai 2007, 15:58
par supernony
Bon j'ai essayé de bidouiller un peu ça me sort plein d'erreurs puis pour phpmyadmin je trouve pas pour faire ce que tu m'as conseillé, et je peux pas le mettre à jour vu que je suis au bahut :/

Je copie colle les erreurs au cas où :

Warning: Unknown: failed to open stream: No such file or directory in Unknown on line 0

Warning: Unknown: Failed opening 'C:\wamp\www\bdd ip\données.php' for inclusion (include_path='.;C:\php5\pear') in Unknown on line 0

voila... je pense que je me repencherais dessus sur ma bécane chez moi ce sera plus simple :)

PS : désolé de pas avoir sauté de ligne avant :oops:

Posté : 29 mai 2007, 16:13
par Sékiltoyai
Pour l'importation, effectue là en local sur ton PC et coche la case "CSV via LOAD DATA" dans phpmyadmin, normalement ça devrait passer tout seul.
Le problème, c'est que PHPmyAdmin tient mal les gros volumes de données. Ok, 6MO, ca reste modéré, mais ca commence à être gros pour du PHP...
Il vaut mieux passer par l'utilitaire en ligne de commande.

souci again

Posté : 29 mai 2007, 16:20
par supernony
Bon alors j'ai fais comme tu m'as dis avec le load data MAIS mysql me pond encore une erreur et je comprends vraiment pas pourquoi :

Erreur
Il n'y a rien à importer!

Alors que j'ai bien sélectioné le csv et tout...

J'ai l'impression que j'y arriverais jamais serieux... bon j'y retourne :)

Posté : 29 mai 2007, 17:20
par @rthur
Pour l'importation, effectue là en local sur ton PC et coche la case "CSV via LOAD DATA" dans phpmyadmin, normalement ça devrait passer tout seul.
Le problème, c'est que PHPmyAdmin tient mal les gros volumes de données. Ok, 6MO, ca reste modéré, mais ca commence à être gros pour du PHP...
Il vaut mieux passer par l'utilitaire en ligne de commande.
Justement, l'intérêt d'utiliser l'option LOAD DATA est que ce n'est pas PHP qui va faire des insertions, PHP va simplement passer le chemin du fichier à MySQL qui va gérer l'import comme un grand:
http://dev.mysql.com/doc/refman/5.0/fr/load-data.html
C:\wamp\www\bdd ip\données.php
Appeler un fichier avec des accents et mettre des espaces dans le nom de ses répertoires, c'est quand même assez risqué je trouve...

Posté : 29 mai 2007, 17:46
par Sékiltoyai
Pour l'importation, effectue là en local sur ton PC et coche la case "CSV via LOAD DATA" dans phpmyadmin, normalement ça devrait passer tout seul.
Le problème, c'est que PHPmyAdmin tient mal les gros volumes de données. Ok, 6MO, ca reste modéré, mais ca commence à être gros pour du PHP...
Il vaut mieux passer par l'utilitaire en ligne de commande.
Justement, l'intérêt d'utiliser l'option LOAD DATA est que ce n'est pas PHP qui va faire des insertions, PHP va simplement passer le chemin du fichier à MySQL qui va gérer l'import comme un grand:
http://dev.mysql.com/doc/refman/5.0/fr/load-data.html
Ah ok.
Mais il reste encore le up, qui est par défaut limité à 2MO, ce qui laisse tout de même un avantage à la méthode ftp + commande mysql (éventuellement par ssh).

Posté : 30 mai 2007, 11:09
par supernony
Bon j'ai trafiqué un code lol mais comme d'habitude ça fonctionne pas...

Cela m'affiche la quasi-totalité du code en dur comme si j'avais mis un echo avec une chaine de caracteres :s

Je copie le code (assez long désolé d'avance) au cas où il y aurait une erreur dans la syntaxe ou autre :

<?

$fichier = @fopen("csv.csv", "r")

//Mise à zéro des compteurs
$i = 0;
$compteur_erreur = 0;
//Mise à zéro des compteurs

//BOUCLE DE LECTURE FICHIER
while (!feof($fichier)) { //Lecteur ligne aprés ligne jusqu'à la fin du fichier (tant que "not" eof - eof = end of file)

$ligne = fgets($fichier, 4096); //4096 c'est le nombre
$valeur = explode(",",$ligne); //La variable valeur est un tableau - Chaque case est une partie de la chaine de caractère séparée par une virgule (La virgule n'existe plus bien sur)

//$valeur[0] -- > Premiere valeur dans la ligne
//$valeur[1] -- > Deuxième valeur dans la ligne
// Et ainsi de suite (Il y a 6 valeurs par ligne) donc on va de $i = 0 à $i = 5

@mysql_connect($host,$user,$pass) or die("Impossible de se connecter à la base de données");
@mysql_select_db('csv');

$requete = "INSERT INTRO 'csv' ('start_ip','end_ip','start','end','cc','cn') VALUES .$valeur[0].", ".$valeur[1].",".$valeur[2].",".$valeur[3].",".$valeur[4]",".$valeur[5]";
// IMPORTANT - Laisser la concaténation ($chaine = "texte normam".$variable."texte";)
//parce que je suis pas sur que ça marche pour les tableaux s'ils sont entre les guillements (à tester)


$result = mysql_query($requete); //Execution de la requete


if($result) echo "Ligne $i : enregistrée avec succés<br>"; //Succés d'enregistrement de la ligne

//Problème d'enregistrement de la ligne
else{
echo "Ligne $i : Problème<br><font color='gray'>".mysql_error()."</font><br>";
$compteur_erreur++;//Incrémentation du compteur d'erreur
}
//Problème d'enregistrement de la ligne



$i++;//Incrémentation du compteur de ligne

}
//BOUCLE DE LECTURE FICHIER

fclose($fichier);

echo "<br><br><br><hr>$compteur_erreur erreurs sont survenues";

?>


Je vous remercie d(avance de votre patience :)

Posté : 30 mai 2007, 12:54
par Mingain
Il manque un ; à la première ligne.

Il faut que tu te connecte à la bdd avant le while sinon ça ralenti trop.

Posté : 30 mai 2007, 13:03
par Mingain
<?php


//Connexion Bdd
$host = 'localhost';
$user = 'root';
$pass ='';
@mysql_connect($host,$user,$pass) or die("Impossible de se connecter à la base de données");
@mysql_select_db('csv');


$fichier = @fopen("csv.csv", "r");

//Mise à zéro des compteurs
$i = 0;
$compteur_erreur = 0;
//Mise à zéro des compteurs

    //BOUCLE DE LECTURE FICHIER
   while (!feof($fichier)) { //Lecteur ligne aprés ligne jusqu'à la fin du fichier (tant que "not" eof - eof = end of file)
   
      $ligne = fgets($fichier, 4096); //4096 c'est le nombre
      $valeur = explode(",",$ligne); //La variable valeur est un tableau - Chaque case est une partie de la chaine de caractère séparée par une virgule (La virgule n'existe plus bien sur)
      
            //$valeur[0] -- > Premiere valeur dans la ligne
            //$valeur[1] -- > Deuxième valeur dans la ligne
            // Et ainsi de suite (Il y a 6 valeurs par ligne) donc on va de $i = 0 à $i = 5
        
                   
        
        $requete = "INSERT INTRO 'csv' ('start_ip','end_ip','start','end','cc','cn') VALUES .$valeur[0].", ".$valeur[1].",".$valeur[2].",".$valeur[3].",".$valeur[4]",".$valeur[5]";
                // IMPORTANT - Laisser la concaténation ($chaine = "texte normam".$variable."texte";)
                //parce que je suis pas sur que ça marche pour les tableaux s'ils sont entre les guillements (à tester)

        
        $result = mysql_query($requete); //Execution de la requete
        
        
        if($result) echo "Ligne $i : enregistrée avec succés<br>"; //Succés d'enregistrement de la ligne
        
        //Problème d'enregistrement de la ligne
        else{
            echo "Ligne $i : Problème<br><font color='gray'>".mysql_error()."</font><br>";
            $compteur_erreur++;//Incrémentation du compteur d'erreur
        }
         //Problème d'enregistrement de la ligne

         
         
        $i++;//Incrémentation du compteur de ligne
        
   }
   //BOUCLE DE LECTURE FICHIER
   
fclose($fichier);

echo "<br><br><br><hr>$compteur_erreur erreurs sont survenues";   
  
?> 


on touche au but ^^

Posté : 30 mai 2007, 13:34
par supernony
Merci mingain ça marche maintenant le souci c'est que la requete est trop longue à exécuter, j'ai modifié pourtant le php.ini de apache pour metre le timer d'exécution de requete mais quelle que soit la valeur que je mets il s'arrete au bout de 30 secondes (oui oui j'ai bien enregistré le .ini apres modification).

Du coup c'est vraiment bizarre comme erreur :(

Si qqun avait une solution merci :)

c'est bon

Posté : 30 mai 2007, 13:44
par supernony
désolé du post en fait fallait juste redémarrer le serveur pour qu'il prenne en compte les modifications du php.ini ^^ merci à tous de votre aide

Posté : 30 mai 2007, 15:01
par Mingain
exact ^^ J'avais oublié de le préciser :lol: :lol: :lol: :lol:

c'est encore moi

Posté : 31 mai 2007, 09:13
par supernony
Bon eh bien maintenant j'ai un nouveau probleme : actuellement je peux localiser quelqu'un à l'échelle d'un pays grâce à son adresse ip mais maintenant, il faudrait que je sois en mesure de localiser à l'échelle régionale, mais ceci pour la France seulement.

Apres quelques recherches sur le net j'ai pu trouver une base de données avec ces régions mais elle est payante :/

Si quelqu'un avait une piste afin de m'aider ce serait sympa merci :)

Posté : 31 mai 2007, 11:07
par Mingain
Moi je dis "lopette" va devoir raquer un peu quoi :lol: :lol: :lol:
Sinon tente de mater sur la mule si tu peux pas trouver ça (on sait jamais).
Je vais jeter un oeil si je trouve pas une piste