Mysql_fetch_array(): supplied argument is not a valid MySQL - INNER JOIN

cs_foux44 Messages postés 46 Date d'inscription lundi 25 juillet 2005 Statut Membre Dernière intervention 15 novembre 2007 - 14 nov. 2007 à 18:33
cs_foux44 Messages postés 46 Date d'inscription lundi 25 juillet 2005 Statut Membre Dernière intervention 15 novembre 2007 - 15 nov. 2007 à 16:18
Bonjour,

Apres un changement d'hebergeur, je rencontre un petit souci de compatibilité sur quelques script. Je suis passé d'un hebergeur avec SQL : 3.23.27-beta, PHP : 4.2.3 sur SQL : 5.0.22, PHP = 4.4.7.

Voici notament un script qui me pose souci, l'oroginal (qui fonctionne chez l'ancien hebergeur) :
CAS N°1
-------------------------------------------------------------------------------------------------
$link=mysql_connect($host,$user,$pass);
mysql_select_db('materiatech-carmanet3',$link);$req_secteur "select s.libelle AS libelle, sn.id AS id_secteur from materiatech-carmanet3. table_secteur_news sn inner join materiatech-carmanet2.secteur_activite s on sn.id_secteur s.id WHERE sn.id_news = '".$id."' ORDER BY s.libelle";

$resultat_secteur = mysql_query($req_secteur);
    while($a_secteur=mysql_fetch_array($resultat_secteur)){
    $id_secteur=$a_secteur[id_secteur];
    $libelle_secteur=$a_secteur[libelle];
    mysql_close();$link=mysql_connect($host,$user,$pass);   
    mysql_select_db('materiatech-carmanet3',$link);
-------------------------------------------------------------------------------------------------
Et voici le nouveau script que j'ai modifié :
CAS N°2
-------------------------------------------------------------------------------------------------
$link=mysql_connect($host,$user,$pass);
mysql_select_db('materiatech-carmanet3',$link);
 $req_secteur = "SELECT s.libelle AS libelle, sn.id AS id_secteur";
 $req_secteur .="INNER FROM `table_secteur_news` sn";
    mysql_close();$link=mysql_connect($host,$user,$pass);   
    mysql_select_db('materiatech-carmanet2',$link);
 $req_secteur .="INNER JOIN `secteur_activite` s ";
      mysql_close();$link=mysql_connect($host,$user,$pass);   
    mysql_select_db('materiatech-carmanet3',$link);
 $req_secteur .="ON sn.id_secteur = s.id";
 $req_secteur .="WHERE sn.id_news = '".$id."' ";
 $req_secteur .="ORDER BY s.libelle";
   
$resultat_secteur = mysql_query($req_secteur);
    while($a_secteur=mysql_fetch_array($resultat_secteur)){
    $id_secteur=$a_secteur[id_secteur];
    $libelle_secteur=$a_secteur[libelle];
    mysql_close();$link=mysql_connect($host,$user,$pass);   
    mysql_select_db('materiatech-carmanet3',$link);
-------------------------------------------------------------------------------------------------
Je pense que le problème vient du fait que je charge des données de 2 bases différentes (Dans le CAS N°1 ceci ne semble pas poser de problème) mais ensuite OUI. J'ai bien essayé de charger alternativement les 2 bases que j'utilise mais ceci ne fonctionne pas.

En fait je ne connais pas grand chose sur MySQL, et je doit faire plein de faute de syntaxe ... Aidez moi SVP car je patoge là !

Merci

7 réponses

malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
14 nov. 2007 à 19:26
Hello,

tu fermes ta connection entre les deux requête, ça n'est pas comme ça que l'on fait!
Tu dois déjà avoir une connexion ayant les droits de lecture sur tes différentes bases.
Ensuite, pour appeler la table d'une base spécifique : nom_base..nom_table
0
cs_foux44 Messages postés 46 Date d'inscription lundi 25 juillet 2005 Statut Membre Dernière intervention 15 novembre 2007
14 nov. 2007 à 19:30
D'une part il faudrait que j'enlève le mysql_close(); et ensuire que j'appelle mes tables du genre materiatech-carmanet3..table_secteur_news avec les 2 points (..) ?!!
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
14 nov. 2007 à 19:53
T'as une connexion capable de lire tes bases, ok ?
mettons que tu sélectione db1, ta requête devient :

SELECT usr.nom, cmd.ref
 FROM users AS usr
LEFT JOIN db2..commandes as cmd ON cmd.usr_id = usr.usr_id
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
14 nov. 2007 à 19:54
Donc oui, pour répondre à ta question.
Sauf que tu ne dois pas leur donner le nom de db2..commandes hein. Ta table s'appelle commandes, et se trouve dans la base db2.
l'opérateur ".." est un opérateur de réssolution de portée dans ce cas. Là il veut dire : va dans la table commandes qui se trouve dans la base db2.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_foux44 Messages postés 46 Date d'inscription lundi 25 juillet 2005 Statut Membre Dernière intervention 15 novembre 2007
14 nov. 2007 à 20:02
ok je vais tester des demain, par contre un autre truc que j'ai pas compris, c'est l'utilisation des lettres s ou sn utiliser ds le script (s.libelle ou sn.id) à quoi servent ces s. et sn. (sachant que ce ne sont pas des tables !!). Ensuite oui j'ai le droit en lecture et écriture aussi !!
Du coup est-il nécessaire de sélectionner une bases des le début avec mysql_select_db ?
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
14 nov. 2007 à 20:12
Ce sont des alias, c'est vital quand tu as des jointures.
SELECT ... FROM commandes cmd
veut dire qu'on utilisera l'alias cmd pour préfixer le nom de champs que l'on doit aller chercher dans commandes. Pourquoi ?
Imagine que tu aies une table users et une table commandes, avec un champ "ref" dans les deux. L'un pour la référence de ton utilisateur, et l'autre pour la référence d'une commande. Si tu veux faire une jointure dans tes 2 tables, et aller chercher la ref des deux tables, tu fais comment, vu que le nom du champ est le même? D'où les alias :
SELECT usr.ref, cmd.ref FROM users usr LEFT JOIN commandes cmd ON cmd.usr_id = usr.usr_id
0
cs_foux44 Messages postés 46 Date d'inscription lundi 25 juillet 2005 Statut Membre Dernière intervention 15 novembre 2007
15 nov. 2007 à 16:18
J'ai essayé de faire t'es changements :

$link= mysql_connect($host,$user,$pass);
mysql_select_db('materiatech-carmanet3',$link);
mysql_select_db('materiatech-carmanet2',$link);$req_secteur "SELECT A. libelle AS libelle, B. id AS id_secteur FROM materiatech-carmanet3..table_secteur_news B INNER JOIN materiatech-carmanet2..secteur_activite A ON (B. id_secteur A. id) WHERE (B. id_news = '".$id."') ORDER BY A. libelle";

mais j'obtiens l'erreur suivante :

You have an error in your SQL syntax; check the manual that corresponds
to your MySQL server version for the right syntax to use near
'-carmanet3..table_secteur_news B INNER JOIN
materiatech-carmanet2..secteur_activ' at line 1

Ensuite j'ai changé en ça (j'ai supprimé le nom des bdd et intégré des ` entre le nom des tables) :
$req_secteur "SELECT A. libelle AS libelle, B. id AS id_secteur FROM `table_secteur_news` B INNER JOIN `secteur_activite` A ON (B. id_secteur A. id) WHERE (B. id_news = '".$id."') ORDER BY A. libelle";

Et j'obtiens cette erreur

,

Table 'materiatech-carmanet2.table_secteur_news' doesn't exist
 
Pourtant cette table existe belle et bien !!

Donc je rame , je rame
0
Rejoignez-nous