Page 1 sur 3

Connexion à une autre base de donnée

Posté : 19 nov. 2012, 00:53
par Fre3z69
Salutation à tous

Voici mon soucis.

J'ai un serveur Minecraft, sur le quel j'aimerais incorporé une boutique en ligne depuis mon site web.

J'ai trouvé un pluggin Minecraft qui permet de copier l’inventaire des joueurs en base de donnée, mais voila...

Je dois me connecté à ma base de donnée Minecraft depuis mon site web, qui lui à une base différente.

J'aurais aimer savoir comment envoyer les informations d'une base à une autre:

Explication:
Pour commencer, je vais renommer les bases:
BDD1 = La base sur mon site web.
BDD2 = La base distante à mon site web.

J'utilise un script de panier sur BDD1, et j'ai sur BDD2 une table qui permet d'ajouter des items à une personne sur le serveur, depuis mon site web.

Voici la structure de mon panier.php
	<form method="post" action="">
		<table class="membres" cellspacing="0" cellpadding="3">
			<tr class="hlistemembres">
				<th style="width:50%;">Nom du produit</th>
				<th style="width:10%;">Prix par article</th>
				<th style="width:10%;">Prix total</th>
				<th colspan="2" style="width:10%;">Quantité</th>
				<th style="width:10%;">Supprimer</th>
			</tr>
			<?php
			$query = $cnx->prepare('SELECT 
			 products.id,
			 products.name,
			 products.price,
			 products.image,
			 panier.nombre
			FROM panier
			LEFT JOIN products ON products.id = panier.articles_id
			WHERE panier.users_id = :users_id');
			$query->bindValue(':users_id', USERS_ID, PDO::PARAM_INT);
			$query->execute();
			if($query->rowCount()<1){
			echo '<tr class="listeforum">
				<td class="infomp" style="text-align:center" colspan="6">Votre panier est vide!</td>
			</tr>';
				$total = '0';
			}else{
				$paire = true;
				$total = '0';
			while ($data=$query->fetch(PDO::FETCH_OBJ)){
				if ($data->nombre == 1){
					$moins='<a>
						<button class="btn btn-mini btn-inverse" name="moins" type="button">
							<span class="icon-large">&#10134;</span>
						</button>
					</a>';
				}else {
					$moins='<a href="panier-moins-'.$data->id.'" class="blanc">
						<button class="btn btn-mini btn-info" name="moins" type="button">
							<span class="icon-large">&#10134;</span>
						</button>
					</a>';
				}
			
				$price = ($data->price>1)?'Ecus':'Ecu';
				$couleur=($paire)?'listeforum':'listeforump';
?>
			<tr class="<?php echo $couleur; ?>">
				<td style="padding:8px 0 0 8px"><span class="item"><img src="./images/items/<?php echo $data->image; ?>.png"></span> <span class="pdesc"><?php echo $data->name; ?></span></td>
				<td style="text-align:center;padding-top:16px;">		
					<span class="pprice"><?php echo number_format($data->price,2,',',' ').' '.$price; ?></span>
				</td>
				<td style="text-align:center;padding-top:16px;">
					<?php $prix=$data->price*$data->nombre; ?>				
					<span class="pprice"><?php echo number_format($prix,2,',',' ').' '.$price; ?></span>
				</td>
				<td style="padding-top:13px;">
					<input class="span1" type="text" name="quantity[]" value="<?php echo $data->nombre; ?>">
				</td>
				<td style="padding-top:5px;">
					<a href="panier-plus-<?php echo $data->id; ?>" class="blanc">
						<button class="btn btn-mini btn-info" name="plus" type="button">
							<span class="icon-large">&#10133;</span>
						</button>
					</a>
					<div style="padding-top:2px;"></div>
					<?php echo $moins; ?>
				</td>
				<td style="text-align:center;padding-top:16px;">
					<a href="panier-del-<?php echo $data->id; ?>" class="del"><i class="icon-trash"></i>
				</td>
			</tr>
			<input type="hidden" name="itesm_id[]" value="<?php echo $data->id; ?>" />
<?php
				$paire = !$paire;
				$total=$total+$prix;
				$totalpionte=number_format($total,2,',',' ');
			}
				}
?>
	</table>
			<div style="width:100%;height:21px;">
				<div style="width:20%;float:right;padding-top:2px;text-align:right;padding-right:3px;" colspan="2"><b>Grand Total :</b> <?php echo $totalpionte; ?> Ecus </div>
			</div>
			<div style="width:100%;height:21px;">
				<div style="width:20%;float:right;padding-top:2px;text-align:right;" colspan="2">
					<input type="hidden" name="mnt" value="<?php echo $total; ?>" />
					<input class="btn btn-success" type="submit" title="Valider" name="valider" value="Valider" />
				</div>
			</div>
	</form>
Voici comment je récupère les information que je dois transmettre à l'autre base de donnée:
		$itid = $_POST['itesm_id'];
		$qnt = $_POST['quantity'];
		$table = array_combine ($itid, $qnt);
		foreach ($table as $v => $q){
			echo USERS_NAME.' '.$v.' '.$q;
		}
Me reste à savoir comment les transmettre à ma BDD2, afin de les ajouter à l'inventaire de l'utilisateur.

Je précise que pour les connexions, j'utilise PDO.

Voila, j’espère que ma question est assez explicite.

Merci de votre aide

Cordialement

Re: Connexion à une autre base de donnée

Posté : 19 nov. 2012, 01:08
par Saian
Si le serveur de base de données du deuxième serveur autorise les accès à distance, fait comme d'hab avec une deuxième connexion dont le host est ton deuxième serveur.
S'il n'est pas accessible tu peux faire un système de web service, des pages sur le deuxième serveur qui sont appelées par le premier serveur avec tous les paramètres qu'il faut.
Ou alors tu peux faire un système d'échange de données à base de fichier csv, xml, json, ... avec transfert FTP des fichiers d'échanges et tâches CRON pour automatiser le tout.

A toi de voir, bon taf ! ^^

Re: Connexion à une autre base de donnée

Posté : 19 nov. 2012, 01:17
par Fre3z69
Je suis désolé, mais j'ai absolument rien compris de ce que tu m'as expliquer.

Peux tu expliquer correctement stp

Merci beaucoup

Cordialement

Re: Connexion à une autre base de donnée

Posté : 19 nov. 2012, 01:24
par Fre3z69
Pour info, je pense que la base distante n’accepte pas les connexion à distance.

Code : Tout sélectionner

Warning: PDO::__construct(): MySQL server has gone away in /homepages/23/d438409960/htdocs/conf/conf.php on line 44 Warning: PDO::__construct(): Error while reading greeting packet. PID=2186 in /homepages/23/d438409960/htdocs/conf/conf.php on line 44 Ce service est momentanément indisponible. Veuillez nous excuser pour la gêne occasionnée.

Re: Connexion à une autre base de donnée

Posté : 19 nov. 2012, 01:28
par Saian
Tu as 3 possibilités (on peut peut être en imaginer d'autre) :
1. Accès direct au serveur de base de données du 2ème serveur depuis le premier. Tu fais comme d'habitude, des requêtes SQL d'insert.
2. Un web service. Une appli (en php par exemple) sur le deuxième serveur avec toutes les pages qu'il faut pour que tu puisses les appeler depuis le premier serveur en leurs transmettant tous les paramètres qu'il faut (pour mettre à jour la base de données du deuxième serveur).
3. Système d'échange des données sous forme de fichiers csv ou xml ou json ou autre.

Je vais pas tout t'expliquer en détail. En revanche si tu as des questions, j'essaierai d'y répondre.

Re: Connexion à une autre base de donnée

Posté : 19 nov. 2012, 01:32
par Fre3z69
Le concept de web service m'intéresse.

Du fait que je dois transmettre les infos au serveur 2, je pense que c'est le plus approprié.

faut juste que je lui disse, voici le nom de la personne, l'id de l'item, et la quantité souhaité.

Je sais que des api existe, mais n'étant pas fan des api balancé comme ça, qui risque de pas passer les mise à jours de minecraft, j'ai décider de créer mon système.

Merci de ton aide

Cordialement

Re: Connexion à une autre base de donnée

Posté : 19 nov. 2012, 01:39
par Saian
C'est une bonne solution pour avoir des données à jour en temps réel.

Par contre fait très attention à la sécurité du web service.
Un internaute malveillant pourrait appeler les scripts du web service avec les paramètres qu'il lui chante.
Tu peux par exemple limiter les accès au web service à l'ip du premier serveur via fichier .htaccess.

Re: Connexion à une autre base de donnée

Posté : 19 nov. 2012, 20:55
par Fre3z69
Oui, je pense aussi, mais vu mon niveau en php, pourrais tu me montrer le fonctionnement globale de se genre d'application?

Juste pour me montrer comment récupérer les infos sur le site de la BDD1, par exemple.

Merci pour votre aide

Cordialement

Re: Connexion à une autre base de donnée

Posté : 19 nov. 2012, 21:11
par Saian
Trop compliqué à détailler mais en gros sur le serveur BDD2 (la ou tu veux récupérer les données de la BDD1) tu as des scripts classiques (fait comme si c'est un utilisateur qui consulte les pages) qui récupèrent les paramètres en GET ou POST et font ce qu'ils doivent faire (insert, update, delete).
Et sur le serveur de la BDD1 quand nécessaire tu appelles les scripts du serveur de la BDD2 en transmettant les paramètres nécessaires. Tu peux de manière basique le faire avec un file_get_contents (si le serveur l'autorise) en mettant les paramètres en GET dans l'URL. Mais pour un truc plus pro avec requêtes en POST il faut que tu utilises la lib cURL.

Re: Connexion à une autre base de donnée

Posté : 19 nov. 2012, 21:19
par Fre3z69
Pour bien comprendre, sur le site BDD2 je met les fichier de traitement finaux, qui insert dans les base les infos fournis par le site BDD1, et grâce à la librairie, je peux lui passer les information?

Tu connaitrais pas un tuto sur ce fonctionnement?

Merci en tout cas.

Cordialement

Re: Connexion à une autre base de donnée

Posté : 19 nov. 2012, 21:23
par Saian
Je pense que tu as bien compris.
Pour la lib cURL cherche "php cURL post request" (un truc dans le genre) dans google tu vas trouver pleins de ressources, je n'ai pas de tutoriel en particulier à te proposer. ;)

Re: Connexion à une autre base de donnée

Posté : 19 nov. 2012, 21:25
par Fre3z69
J'ai touver ceci, pour le moment c'est du chinois (sans offense), qu'en pense tu?

Re: Connexion à une autre base de donnée

Posté : 19 nov. 2012, 21:27
par Saian
La partie "Envoyer une requête POST" explique bien comment tu peux t'y prendre oui. :)

Re: Connexion à une autre base de donnée

Posté : 22 nov. 2012, 09:44
par Fre3z69
Salut, je reprend après plusieurs essaies et une bonne dosse de lecture.

J'ai réussit à créer ma connexion entre mes deux pages, mais je n'arrive pas à envoyer les informations via CURL.

Pouvez vous m'aider à envoyer les infos, afin de les récupérer et les traiter sur le site distant svp?

Voici ce que j'ai fait (j'ai ommis de sauvegarder, j'ai perdu le meilleur que j'avais fait Oo, mais c'était dans l'idée)

Sur pannier.php sur site "Local"
// on défini le tableau de données à envoyer
	$lien = 'http://monsitelocal.org/panier.php';
	$postfields = array(
		'users_name' => USERS_NAME,
		'mnt' => $_POST['mnt'],
		'itesm_id' => $_POST['itesm_id'],
		'qnt' => $_POST['quantity']
	);
// on initialise et paramettre curl
	$curl = curl_init();
	curl_setopt($curl, CURLOPT_URL, $lien);
	curl_setopt($curl, CURLOPT_COOKIESESSION, true);
	curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($curl, CURLOPT_POST, true);
	curl_setopt($curl, CURLOPT_POSTFIELDS, $postfields);
// on retourne le résultat (pas nessaisére, le traitement est distant)
	// $return = curl_exec($curl);
// on ferme curl
	curl_close($curl);
//on affiche le résultat de la page distante, peux importe le résultat de l'envoie
	echo file_get_contents("http://monsitedistant.org/panier.php"); 

Sur pannier.php sur site "distant"
	if (isset($users_name)) { print_r($users_name); }
	if (isset($mnt)){
// on vérifie qu'on affiche bien les données et leur format pour mieux les traiter
		echo ('résultat sans foreach: '.$users_name.' '.$itesm_id.' '.$quantity);
	}else{
		echo ('Séléctionnez des produits avant de valider votre panier!'); 
	}
Je pense que je suis sur la voie, mais j'ai mal paramétré.

Merci beaucoup de votre aide

Cordialement

Re: Connexion à une autre base de donnée

Posté : 22 nov. 2012, 12:27
par Saian
Oui en fait décommente le curl_exec, c'est lui qui fait la reuqête et retourne le résultat.
Le file_get_contents c'était pour une solution sans cURL (mais le choix de cURL même si moins simple au premier abord est bien meilleur).