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

Eléphanteau du PHP | 15 Messages

16 mai 2006, 12:27

Salut,
voila j'ai commencé à coder une fonction Localiser et je veux qu'elle aille chercher dans une de mes tables la donnée d'un de mes champs (un numéro de téléphone).
Voila à quoi ressemble ma fonction :

Code : Tout sélectionner

function Localiser() { $socket=socket_create(AF_INET, SOCK_STREAM, SOL_TCP); if($socket < 0) { echo "Erreur de socket !\n";} else { echo "Socket créée\n";} $adresse = "198.122.1.50"; $service_port = 4001; $result = socket_connect($socket, $adresse, $service_port); if($result == false) { echo "Erreur de connection !\n";} else { echo "Connection effectuée\n";} //Envoie du numero de téléphone $send=mysql_query("SELECT * FROM `transporteur` WHERE 1`Numero de telephone`"); $num=socket_write($socket, $send, strlen($send)+1); if($num == 0) { echo "Erreur d'envoi\n";} else { echo "OK !\n";} //Fermeture de la socket socket_close($socket); }
Je l'ai testé, mais sa n'envoit que des caractéres bizarre et un 2...
Donc je voudrais savoir si j'utilise les bonnes fonctions. Au niveau de la création de la socket il n'y a pas de probleme c'est plutôt au niveau de la connection avec le PC distant il me met connection failed mais il arrive quand même à envoyer des trucs :?
Donc voila si quelqu'un pouvais m'éclairer se serait cool.

Merci

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

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 = ?.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphanteau du PHP | 15 Messages

16 mai 2006, 13:20

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

Peace

Eléphanteau du PHP | 15 Messages

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.

Invité
Invité n'ayant pas de compte PHPfrance

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

Eléphanteau du PHP | 15 Messages

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 :? ).

Eléphanteau du PHP | 15 Messages

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

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

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 ";}
} 

--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphanteau du PHP | 15 Messages

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.

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

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:
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphanteau du PHP | 15 Messages

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.

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

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'.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Invité
Invité n'ayant pas de compte PHPfrance

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.

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

29 mai 2006, 16:19

Remplace le 0. par 0_ pour voir!
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphanteau du PHP | 15 Messages

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)