Une seule requete PDO avec 2 bases de donnees MySQL

Mammouth du PHP | 725 Messages

18 juil. 2011, 14:53

Bonjout,

J'ai une requete que je dois faire le join de 2 tables, les 2 appartiennent a de bases de donnees differentes, comment faire pour le prepare, execute et l'affichage des resultats, sachant que la premiere connexion est $connexion1 et la 2eme est $connexion2, et la preparation se fait par exemple:
$connexion1 = new PDO ...
$connexion2 = new PDO ...

$query = 'SELECT * FROM db1.table1 JOIN db2.table2 ... WHERE ... id = ?;';
$prep = $connexion1->prepare($query);
merci a vous

ViPHP
ViPHP | 5462 Messages

18 juil. 2011, 18:14

avec 2 instances c'est pas possible, les bases sont sur le même serveur ?

Mammouth du PHP | 725 Messages

19 juil. 2011, 01:58

avec 2 instances c'est pas possible, les bases sont sur le même serveur ?
oui les 2 bases sont sur le meme serveur, c'est comme en MySQL normal, on fait:
mysql_select_db($db1);
mysql_select_db($db2);

SELECT * FROM db1.table1, db2.table2 ....

Mammouth du PHP | 725 Messages

19 juil. 2011, 14:58

est ce qu'il n y a pas une methode d'utiliser 2 bases de donnees en PDO?

devlop78
Invité n'ayant pas de compte PHPfrance

19 juil. 2011, 16:41

Je ne vois pas l'intêret de sélectionner les deux bases de données. Si tu précises à PDO ou Mysql que tu vas utiliser la base de données x, c'est pour éviter d'aller écrire le nom de la base de données à chaque fois. Il faut juste que MySQL sache de quoi tu parles.

Je n'ai jamais utilisé cela, mais je ne vois pas pourquoi ça poserait problème de faire une jointure entre deux bases de données, à partir du moment où il s'agit du même serveur, et du même utilisateur avec les bons droits.

Active les erreurs pour PDO, et dis-nous quel erreur il rapporte;

ViPHP
ViPHP | 5462 Messages

19 juil. 2011, 20:59

pas besion d'ouvrir 2 connexions, ca na jamais été obligatoire de devoir selectionné un base pour se connecter non plus

dans tes requete fait
SELECT blabla FROM base1.truc, base2.machin

Mammouth du PHP | 725 Messages

23 juil. 2011, 09:17

voila j'ai tests ce code, je me trouve dans un bug:
le premier code commente marche bien, j'assigne les valeurs, le 2eme nom, en utilisant bindValue, c'est quoi l'erreur exactement?
//$query = 'SELECT * FROM '.$PARAM_nom_bd.'.admin, '.$PARAM_nom_bd1.'.users WHERE '.$PARAM_nom_bd.'.admin.id = '.$PARAM_nom_bd1.'.users.id1';
$query = 'SELECT * FROM '.$PARAM_nom_bd.'.admin, '.$PARAM_nom_bd1.'.users WHERE '.$PARAM_nom_bd.'.admin.id = :id';

echo $query.'<br />';

$prep = $connexion->prepare($query);

$prep->bindParam('id', $PARAM_nom_bd1.'.users.id1', PDO::PARAM_INT);
je recois cette erreur: Fatal error: Cannot pass parameter 2 by reference in pdo2databases.php on line 38

ligne 38: $prep->bindParam('id', $PARAM_nom_bd1.'.users.id1', PDO::PARAM_INT);

et meme si j'utilise bindValue, ca marche pas, aucune erreur mais elle n'affiche aucun resultat
merci

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

23 juil. 2011, 12:25

salut,

A tu essayé de le passer "en dur", ça devrais fonctionner ?
a tu essayer la concaténation avant le bindvalue ? ( $truc = $PARAM_nom_bd1.'.users.id1'; $prep->bindParam('id', $truc, PDO::PARAM_INT);

Le message d'erreur c'est un message php ?
a tu utiliser un try / catch ? (on pourrait peut être avoir un message plus explicite).

@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 725 Messages

23 juil. 2011, 14:20

j'ai essaye avec catch, et voila le code entier, ca ne donne aucune erreur:
<?php
try
{
	$connexion = new PDO('mysql:host='.$PARAM_hote.';dbname='.$PARAM_nom_bd, $PARAM_utilisateur, $PARAM_mot_passe
	, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
}
 
catch(Exception $e)
{
        echo 'Erreur : '.$e->getMessage().'<br />';
        echo 'N° : '.$e->getCode();
}

try
{
$query = 'SELECT * FROM '.$PARAM_nom_bd.'.admin, '.$PARAM_nom_bd1.'.users WHERE '.$PARAM_nom_bd.'.admin.id = ?';        
echo $query.'<br />';
$prep = $connexion->prepare($query);
$prep->bindValue(1, $PARAM_nom_bd1.'.users.id1', PDO::PARAM_INT);

$prep->execute();

$arrAll = $prep->fetchAll();

var_dump($arrAll);

if(!empty($arrAll))
{
	foreach($arrAll as $arr)
	{
		$id = $arr['id'];
                echo $id;
			
		
	}
}

$prep->closeCursor();
$prep = NULL;

}
 
catch(Exception $er)
{
        echo 'Erreur : '.$er->getMessage().'<br />';
        echo 'N° : '.$er->getCode();
}
?>

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

23 juil. 2011, 14:30

tu peux ajouter le $er->getTraceAsString(); pour debugger c'est parfois pratique.

a tu essayer en créant la chaine avant ?

je vais essayer

@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 725 Messages

23 juil. 2011, 14:42

aucun message d'erreur n'est retourne, alors ce bout de code je le mets ou exactement?
( $truc = $PARAM_nom_bd1.'.users.id1'; $prep->bindParam('id', $truc, PDO::PARAM_INT); 

devlop78
Invité n'ayant pas de compte PHPfrance

23 juil. 2011, 20:05

aucun message d'erreur n'est retourne, alors ce bout de code je le mets ou exactement?
( $truc = $PARAM_nom_bd1.'.users.id1'; $prep->bindParam('id', $truc, PDO::PARAM_INT); 

PDO::PARAM_INT pour un String ?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

24 juil. 2011, 00:12

Raaaaa vouii j'suis mirro :/

Le message d'erreur est pas vraiment explicite pour le coup

@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 725 Messages

24 juil. 2011, 14:22

PDO::PARAM_INT pour un String ?
je pense que ca doit etre un INT pas un STR pace que c'est un id

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

24 juil. 2011, 16:09

oui mais non, tu passe une chaine de caractère à la fonction : $PARAM_nom_bd1.'.users.id1' <= ça c'est une chaine de caractère.

Tu devrais passer un entier provenant d'un formulaire, session ou je ne sais quoi.

sinon fixe le !


@+
Il en faut peu pour être heureux ......