Comment envoyer des données d'une table à un PC distant ???

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Comment envoyer des données d'une table à un PC distant ???

par sadeq » 29 mai 2006, 16:39

C'est ton serveur qui ajoute ce caractère ASCII qui souvent est la marque de fin de ligne, tranquerait-il ta données à la reception? question subcidiaire!
Tu dois mettre la main sur le truc si tu vois du côté du programme de ton serveur :!:

par oOTHCOo » 29 mai 2006, 16:24

j'ai essayé en mettant un underscore mais le résultat est le même j'obtient toujours un caractère bizarre (une sorte de rectangle)

par sadeq » 29 mai 2006, 16:19

Remplace le 0. par 0_ pour voir!

par Invité » 29 mai 2006, 14:02

Normalement ya pas de probleme dans ma table le numéro de téléphone est définie en varchar et du coté serveur en char.
Par contre j'envoie bien le numéro de téléphone entier (oublier de mettre les 2 derniers chiffres tout à l'heure) suivi à la fin du caractère bizarre.
Pour l'histoire du 0. devant le numéro c'est pour sortir du réseau téléphonique du lycée.

par sadeq » 29 mai 2006, 12:40

Je pense qu'il ya un problème dans le format numérique du n° de téléphone :
tu envois le n° : 0.0684941020
et tu reçois le n° : 0.06849410+ton code bizard (je pense qu'il s'agit d'un code float (f) car ton serveur pgm C++ considère ton n° comme un nombre réél flottant )
Ma question : pourquoi tu commence ton n° par 0.99999... car cette forme est celle d'un décimal.

Ton n° doit être transmis comme une chaîne de caractère pour passer ce problème style '0684941020'.

par oOTHCOo » 29 mai 2006, 12:10

J'ai testé ton programme (merci d'ailleur pour le temps que tu passes à m'aider) donc je me suis servi que de la page envoi.php, me suis pas servi de la partie serveur, ma partie serveur est en C++(fonctionne parfaitement) . Le serveur est dans un module DK40 (je travaille sur la localisation GPS). Donc jarrive bien à envoyer les données quand je clique sur localiser :

Code : Tout sélectionner

Choisir un camion à localiser : » 2 enregistrement(s) dans cette liste. ACTIONS PLAQUE D'IMMATRICULATION IDENTIFIANT NUMERO DE TELEPHONE [Localiser] 111DD49 12023 0.0684941020 [Localiser] 222DD49 08256 0.0610203025
Et j'obtient bien le numéro mais il y a toujours se caractère qui me gène :

Code : Tout sélectionner

A:\> Erreur Acceptation: 0 Essai 1 Erreur Reception: 0 Numero: 0.06849410 <-- le caractère s'affiche ici (non affichable) Erreur FermetureDialogue: 0 Erreur Ecoute: 0 Erreur AttachementSocket: 0 Erreur AttenteConnexion: 0
Donc si tu aurais une idée pour résoudre mon problème sa le ferait.

Peace.

par sadeq » 23 mai 2006, 11:57

Voici ma solution détaillée :

Un programme d'envoi de données et un serveur de test qui les reçoit et les enregistre dans un fichier "reception.txt"

Envoi.php
<?php
//Envoi au transporteur n°1
echo nl2br(transmettre(1));
//Envoi au transporteur n°2
echo nl2br(transmettre(2));
//Envoi à tous les transporteurs
echo nl2br(transmettre());

//Fonction de transmission
function transmettre($transporteur=0) 
{ 
//paramètres du serveur de destination
$adresse = "127.0.0.1"; 
$service_port = 8000;
$date = date("d/m/Y");
$rapport = "Transmission de données à $adresse:$service_port (le $date)\r\n";

//Création du socket de communication TCP
$socket = @socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
//Connexion au serveur de destination via le socket
$conn = @socket_connect($socket, $adresse, $service_port);
if (!$conn) $rapport .= "Connexion non effectuée\r\n"; 
else {
	$rapport .= "Connexion effectuée\r\n"; 
	//Requête SQL : tous les n° de téléphones seront extraits si $transporteur est null 
	$req = @mysql_db_query("test", "SELECT * FROM `transporteur` WHERE id=$transporteur or $transporteur=0", mysql_connect("localhost", "root", ""));
	if (!$req) $rapport .= "Echec de connexion à la base de données!\r\n"; 
	else
		//Boucle d'envoi des N° de téléphones 1 par 1 
		while ($ligne = @mysql_fetch_array($req) )
  		 	//envoi du N° lu 
   			if ($ligne){
   				$resultat = $ligne["id"].";".$ligne["nom"].";".$ligne["Numero de telephone"]."\r\n";    
   				if (@socket_write($socket, $resultat, strlen($resultat))) 
					$rapport .= "OK pour $resultat\r\n"; 
				else $rapport .= "$resultat n'est pas envoyé\r\n"; 
			}
}

//Fermeture de la socket 
$rapport .= "Fin de la transmission.\r\n";
@socket_close($socket);

//Retourner le rapport
return $rapport;
}
?>
Le serveur de test : server.php
<?php
// SERVEUR écoutant sur le port 8000 du hôte 127.0.0.1
// Sert de test pour recevoir des données et les stocker dans un fichier reception.txt
//
// Pour exécuter ce serveur en arrière plan taper : c:\wamp\php\php.exe c:\wamp\www\socket\server.php
//
//Démarrage du serveur écoutant sur le port TCP 8000 de l'ordinateur local
$socket = stream_socket_server("tcp://127.0.0.1:8000", $errno, $errstr);
if (!$socket) {
  //Echec
  echo "$errstr ($errno)\r\n";
} 
else {
	//Serveur démarré
	$date = date("d/m/Y H:i:s");
	$démarrage = "Démarrage le $date ....\r\n";
	//Ouvrir le fichier de réception en mode ajout (historique tenu)
	$fsortie = fopen ("c:/wamp/www/socket/reception.txt", "a");
	//Notification de la date de démarrage
	echo "$démarrage";
	fputs($fsortie, $démarrage);
	//Détection d'un client  	
	while ($conn = stream_socket_accept($socket)) {
		//un client est détecté 
		while (!feof($conn)){	
			//Lecture des données envoyées par le client
			$data =  fgets($conn);
			if ($data) {
				//Notification
				echo "Reception: $data";
				fputs($fsortie, "$data");
			}
		}
		//Libérer le client en cours
		fclose($conn);
  	}
	//Arrêt du serveur : Fermer les ressources
	fclose($fsortie);
	fclose($socket);
}
?>

Usage :

1. Démarrer d'abord le serveur de test sur le poste local, taper : c:\wamp\php\php.exe c:\wamp\www\socket\server.php
où :
  • php.exe se trouve dans c:\wamp\php
    et
    server.php dans c:\wamp\www\socket
2. Sur un navigateur, charger la page "Envoi.php" en tapant : http://localhost/socket/Envoi.php
où : Envoi.php se trouve dans c:\wamp\www\socket

ps: Hé oui, j'utilise wamp 5 :wink:

par oOTHCOo » 22 mai 2006, 12:24

En faite l'utilisateur doit cliquer sur un lien pour envoyer le numéro de téléphone du transporteur.

Mais le problème est , je pense, au niveau de l'initialisation de $resultat en effet pour l'instant j'effectue des tests avec une table contenant juste un enregistrement.

Si j'envois par exemple "test" pas de probleme mais si j'envoie un numéro de téléphone je me retrouve avec un caractére bizard en plus.

De plus, si je modifie l'enregistrement et que je renvoi "test" à la place du numéro il envoie bien "test" mais il rajoute le reste du numéro de téléphone qu'il avait envoyer précédemment : "061020test" avec en plus à la fin le caractère bizard comme si la variable $resultat n'était pas vraiment réinitialisée.

par sadeq » 18 mai 2006, 12:53

Et pourquoi ne pas envoyer tous les enregistrements 1 par 1 en exploitant la boucle While et en y intégrant le socket_write:

Regarde comment :
//Requête SQL : tous les n° de téléphones seront extraits
$req = mysql_query("SELECT `Numero de telephone` FROM `transporteur`"); 
//Boucle d'envoi des N° de téléphones 1 par 1
while ($ligne = mysql_fetch_array($req) ){ 
   //envoi du N° lu 
   $resultat = $ligne["Numero de telephone"]; 
   $num = socket_write($socket, $resultat, strlen($resultat)); 
   if($num == 0) { echo "<p>$resultat n'est pas envoyé";}  
      else { echo "<p>OK pour $resultat ";}
} 

par oOTHCOo » 17 mai 2006, 15:52

Nouveau probléme :( , le code marche parfaitement lorsque j'ai un seul enregistrement dans ma table aprés avoir fait d'autres enregistrements je n'arrive qu'a envoyer le numéro de télephone du 1er enregistrement. J'ai essayé par exemple de choisir le numéro de téléphone du 2eme enregistrement et là sa marche pas, j'ai repris la requête que tu m'avais passé pour sélectionner un numéro de téléphone précis :

Code : Tout sélectionner

$req = mysql_query("SELECT `Numero de telephone` FROM `Transporteur` WHERE 'id'=2");
Ici, je voudrait sélectionner le numéro de téléphone du 2eme enregistrement, le champ id est contenu dans ma table Transporteur , il correspond à un entier auto-incrémenté.
Donc voila si quelqu'un à une solution à ce problème sa serait cool.

Peace

par oOTHCOo » 17 mai 2006, 15:01

En faite la requête que tu m'as proposé fonctionne parfaitement (ce matin sa fonctionnais pas c'est pas pourquoi :? ).

par Invité » 17 mai 2006, 12:08

J'ai réussi à trouver le problème :lol: sa venait de ma requête qui était mauvaise, voici la requête exact :

Code : Tout sélectionner

$req = mysql_query("SELECT * FROM `Transporteur` WHERE `Numero de telephone`");
Encore merci pour ton aide sadeq :D
peace

par oOTHCOo » 17 mai 2006, 11:32

J'ai tester ton code mais je n'arrive toujours pas à envoyer les données contenues dans ma table sa envoie 2 caractéres bizarre et un v. J'ai testé d'envoyer un message simple et la pas de problème :

Code : Tout sélectionner

/Envoi de $resultat $resultat="test"."\n\r"; $num=socket_write($socket, $resultat, strlen($resultat)); if($num == 0) { echo "Erreur d'envoi\n";} else { echo "OK !\n";}
Par contre je vois vraiment pas pourquoi sa marche pas avec les données contenus dans une table :? , voici le code :

Code : Tout sélectionner

/Requête SQL $req = mysql_query("SELECT `Numero de telephone` FROM `transporteur` WHERE 'id'=1"); //Boucle d'extraction des données de résultat de SQL $resultat = ""; while ($ligne = mysql_fetch_array($req) ){ //remplir un résultat de données (sous forme de chaine) $resultat .= $ligne["Numero de telephone"]."\n\r"; } //Envoi de $resultat $num=socket_write($socket, $resultat, strlen($resultat)); if($num == 0) { echo "Erreur d'envoi\n";} else { echo "OK !\n";}
J'ai juste rajouté à ton code "WHERE 'id'=1" pour qu'il prenne le numéro de la première ligne de la table.

par oOTHCOo » 16 mai 2006, 13:20

Merci, je vais tester ton code (pourrais test que demain), je te tiens au courant.

Peace

par sadeq » 16 mai 2006, 12:44

T'as une erreur dans SQL et dans la manière de récupèrer les données
ce qui n'a rien à voir avec la connexion socket.
Dans ton état actuel, tu n'envois pas les données mais simplement la référence du résultat de SQL (il est formulé généralement "RESSOURCE#x" telque x est le n° de la ressource dans ton cas il sera RESSOURCE#2 puisque la connexion mysql prend #1)

Tout d'abord il faut corriger ça en envoyant les données contenu dans la ressorce créée par mysql_query. Pour celà voici une proposition :
//Envoie du numero de téléphone  
//Requête SQL
$req = mysql_query("SELECT `Numero de telephone` FROM `transporteur`"); 
//Boucle d'extraction des données de résultat de SQL
$resultat = "";
while ($ligne = mysql_fetch_array($req) ){
   //remplir un résultat de données (sous forme de chaine)
   $resultat .= $ligne["Numero de telephone"]."\n\r"; 
}
//Envoi de $resultat
$num=socket_write($socket, $resultat, strlen($resultat)+1);
Ici, on a extrait les données de la ressource mysql_query par mysql_fetch_array puis déposé ces données dans une chaine $resultat avec des sauts de lignes (\n\r) puisque SQL extrait tous les n° de téléphones enregistrés dans la table "transporteur"
Pour ne sélectionner qu'un n° de téléphone d'un transporteur il faut ajouter un WHERE id_transporteur = ?.