Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 18/11/2011, 00h02   #1
Invité de passage
 
Homme
Étudiant
Inscription : octobre 2011
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : octobre 2011
Messages : 4
Points : 1
Points : 1
Par défaut Requête SELECT WHERE IN ensemble

Bonjour,

J'essaie de faire une requête sur une table de la manière suivante:

J'ai une table 'usersmovies' avec en colonne 'username' et 'movie_title'.

Je veux sélectionner les 'username' qui ont au moins un 'movie_title' en commun, j'utilise donc une requête du type:

SELECT username FROM usersmovies WHERE movie_title IN ?

Le point d'interrogation est censé être un ensemble dans lequel chercher, un ensemble du type ('élément 1', 'élément 2') sauf que dans mon cas je veux qu'il soit variable et qu'il soit donc un tableau/une liste.

Le problème c'est que je n'arrive pas à sélectionner les 'username' en utilisant le code source suivant:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php
session_start();
 
//Connexion à la BDD:
try
{
$bdd = new PDO('mysql:host=localhost;dbname=test', 'root', 'root');
}
catch(Exception $e)
{
die('Erreur : '.$e->getMessage());
}
 
//Requête pour sélectionner tous les films de l'utilisateur de la session:
$usermovies = $bdd->prepare('SELECT movie_title FROM usersmovies WHERE username = ?');
$usermovies->execute(array($_SESSION['username']));
 
while($donnees = $usermovies->fetch())
{
    echo $donnees['movie_title'];
    $movies[]=$donnees['movie_title'];
}
 
//Requête pour sélectionner les utilisateurs ayant au moins un film en commun avec l'utilisateur de la session:
$test = $bdd->prepare('SELECT username FROM usersmovies WHERE movie_title IN ?');
$test->execute(array($movies));
 
while($commonmovies = $test->fetch())
{  
echo $commonmovies['username'];
}
 
?>
Il me renvoie: "Notice: Array to string conversion in /Users/ganeshmamodaly/Sites/entourage.php on line 26"

Et si je remplace (en ligne 26)
Code :
$test->execute(array($movies));
par (crochets en plus)
Code :
$test->execute(array($movies[]));
il me renvoie:

"Fatal error: Cannot use [] for reading in /Users/ganeshmamodaly/Sites/entourage.php on line 27"

Du coup je n'arrive pas à sélectionner tous les utilisateurs ayant au moins un film en commun avec l'utilisateur de la session

Quelqu'un aurait-il une idée pour pouvoir faire cette manip?

Je ne sais pas si j'ai été assez clair

Merci beaucoup de votre aide!
UnknownMan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2011, 00h20   #2
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 552
Points : 2 552
Envoyer un message via Skype™ à rawsrc
Bonsoir,

Quelque chose comme ça :
Code :
SELECT username FROM usersmovies WHERE movie_title IN (SELECT movie_title FROM usermovies WHERE username = :currentuser)"
Dans tous les cas il serait préférable de faire une auto-jointure car le IN est séquentiel donc très lent.
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2011, 00h38   #3
Invité de passage
 
Homme
Étudiant
Inscription : octobre 2011
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : octobre 2011
Messages : 4
Points : 1
Points : 1
Du génie!!

Je n'avais pas pensé à faire comme ça, on voit bien que je débute!

J'ai remplacé mon code par:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php
session_start();
 
//Connexion à la BDD:
try
{
$bdd = new PDO('mysql:host=localhost;dbname=test', 'root', 'root');
}
catch(Exception $e)
{
die('Erreur : '.$e->getMessage());
}
 
//Requête pour sélectionner tous les films de l'utilisateur de la session:
$usermovies = $bdd->prepare('SELECT movie_title FROM usersmovies WHERE username = ?');
$usermovies->execute(array($_SESSION['username']));
 
while($donnees = $usermovies->fetch())
{
    echo $donnees['movie_title'];
}
 
//Requête pour sélectionner les utilisateurs ayant au moins un film en commun avec l'utilisateur de la session:
$test = $bdd->prepare('SELECT username FROM usersmovies WHERE movie_title IN (SELECT movie_title FROM usersmovies WHERE username = ?)');
$test->execute(array($_SESSION['username']));
 
while($commonmovies = $test->fetch())
{  
echo $commonmovies['username'];
}
 
?>
Et ça marche

Merci beaucoup rawsrc!!!
UnknownMan est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h54.


 
 
 
 
Partenaires

Hébergement Web