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

Signaler
Messages postés
46
Date d'inscription
lundi 25 juillet 2005
Statut
Membre
Dernière intervention
15 novembre 2007
-
Messages postés
46
Date d'inscription
lundi 25 juillet 2005
Statut
Membre
Dernière intervention
15 novembre 2007
-
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

Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
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
Messages postés
46
Date d'inscription
lundi 25 juillet 2005
Statut
Membre
Dernière intervention
15 novembre 2007

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 (..) ?!!
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
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
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
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.
Messages postés
46
Date d'inscription
lundi 25 juillet 2005
Statut
Membre
Dernière intervention
15 novembre 2007

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 ?
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
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
Messages postés
46
Date d'inscription
lundi 25 juillet 2005
Statut
Membre
Dernière intervention
15 novembre 2007

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