PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 Re : MySQL, PostgreSQL, etc... » Utilisation jointures » 10-01-2011 22:43:22

Salut,

Désolé pour mon post tardif.

Comme j'ai trouvé la solution, je tenais à la partager avec vous.

Le problème venait de mes tables. Chaque table de ma db a une colonne avec un identifiant. J'avais bêtement oublié d'indexer ces colonnes (Primaire ou Index).

Encore merci pour votre aide.

A bientôt.

#2 Re : MySQL, PostgreSQL, etc... » Utilisation jointures » 10-01-2011 22:43:22

Maljuna Kris,

Il existe bien une liaison entre chaque table et j'ai vérifié, aucune ne fait défaut. La table LOCALITY_ADDRESS a bien une colonne LOCALITY_ID.

Le problème vient donc de ma requête et des jointures qui sont dedans...

Pour Pierrot: je préfèrerai que tu sois plus constructif. Heureusement que je n'ai indiqué que 4 tables sur 40, car tu sembles déjà complètement perdu wink

Salutations

#3 Re : MySQL, PostgreSQL, etc... » Utilisation jointures » 10-01-2011 22:43:22

Voilà comment ça se passe:

Lorsque que je souhaite ajouter une annonce, il enregistre une nouvelle entrée dans la table AD.

Je récupère l'identifiant qui est généré automatiquement dans la colonne AD.AD_ID

Cet identifiant je le récupère sous forme d'une valeur ($ad_id) et l'utilise pour créer un nouvel enregistrement dans le table LOCATION_ADDRESS qui correspondant à l'adresse de mon annonce. L'identifiant AD_ID est ajouté à la colonne LOCATION_ADDRESS.AD_ID pour permettre de faire le lien entre les deux tables.

Les tables LOCATION_LOCALITY et LOCATION_COUNTRY sont 2 tables qui contiennent la ville et le pays de l'annonce. Je n'effectue aucun enregistrement sur ces 2 tables mais récupère les valeurs pré enregistrées des colonnes LOCATION_LOCALITY.LOCATION_LOCALITY_ID et LOCATION_COUNTRY.LOCATION_COUNTRY_ID pour lier la table LOCATION_ADDRESSE à LOCATION_LOCALITY et lier la LOCATION_LOCALITY à LOCATION_COUNTRY.

Finalement, je souhaite afficher les données qui sont liées au dernier enregistrement effectué dans la table AD en utilisant la valeur $AD_ID

Pour ce faire, j'utilise le code suivant (désolé pour le SELECT * et autres caractères indésirables smile ):

"SELECT * FROM ad"
"INNER JOIN location_address ON (ad.ad_id=location_address.ad_id)"
"INNER JOIN location_locality ON (location_address.location_locality_id=location_locality.location_locality_id)"
"INNER JOIN location_country ON (location_locality.location_country_id=location_country.location_country_id)"
"WHERE AD.AD_ID="'.$ad_id.'""

#4 Re : MySQL, PostgreSQL, etc... » Utilisation jointures » 10-01-2011 22:43:22

Bonjour Maljuna Kris,

Merci pour tes remarques.

Concernant la colonne location_address.location_locality_id2 s'est une erreur de ma part. Il s'agit en fait de location_address.location_locality_id qui est lié à location_locality.location_locality_id

Pour ce qui est de la table LOCATION_COUNTRY, elle contient les colonnes LOCATION_COUNTRY_ID, LOCATION_COUNTRY, LOCATION_COUNTRY_ACTIVE

Donc en bref:

ad.ad_id est lié à location_address.ad_id

location_address.location_locality_id est lié à location_locality.location_locality_id

location_locality.location_country_id est lié à location_country.location_country_id

Maintenant ma question est quelle jointure dois-je utiliser dans ce cas de figure ?

Salutations

#5 MySQL, PostgreSQL, etc... » Utilisation jointures » 10-01-2011 22:43:22

Maximeus
Réponses : 15

Bonjour,

J'ai un petit souci avec l'utilisation des jointures.

Lorsque je fais une requête pour afficher les données de ma db, la page n'affiche pas toujours le résultat en fonction des jointures que je place dans ma requête.

Voici comment est composée une partie de ma db:

La table AD avec les colonnes AD_ID, AD_CREATED, AD_UPDATED, AD_DELETED, AD_ACTICE

La table LOCATION_ADDRESS avec les colonnes LOCATION_ADDRESS_ID, AD_ID, LOCATION_ADDRESS_NUMBER, LOCATION_ADDRESS_STREET, LOCATION_LOCALITY_ID2, LOCATION_LOCALITY_ACTIVE

La table LOCATION_LOCALITY avec les colonnes LOCATION_LOCALITY_ID, LOCATION_LOCALITY, LOCATION_COUNTRY_ID, LOCATION_LOCALITY_ACTIVE

La table AD est la table de référence dont la colonne AD_ID est utilisée pour lier les autres tables (par exemple la table LOCATION_ADDRESS)

La table LOCATION_ADDRESS est liée à la table LOCATION_LOCALITY par la colonne LOCATION_LOCALITY_ID.

La table LOCATION_LOCALITY est liée à la table LOCATION_COUNTRY par la colonne LOCATION_COUNTRY_ID.

J'ai structuré ma requête comme suit:

SELECT * FROM ad
INNER JOIN location_address ON (ad.ad_id=location_address.ad_id)
INNER JOIN location_locality ON (location_address.location_locality_id=location_locality.location_locality_id)
INNER JOIN location_country ON (location_locality.location_country_id=location_country.location_country_id)
WHERE AD.AD_ID="'.$ad_id.'"

Malheureusement, il ne m'affiche pas toujours les résultats.

Je soupçonne les tables LOCATION_LOCALITY et LOCATION_COUNTRY de poser problème car elle ne sont pas liées directement à la table AD...

Avez-vous une idée comment je peux optimiser ma requête? Dois-je utiliser un RIGHT JOINT pour le table LOCATION_LOCALITY et LOCATION_COUNTRY?

Merci d'avance

#6 Re : Forum Général PHP » Garder les valeurs de login dans une session » 28-05-2010 09:45:16

Salut Alnoss,

Merci pour ton conseil sur les JOIN. Je reverrai ma requête.

Concernant mon code

$_SESSION['username'] = $data['email']; /* /!\ T'es sûr là ?????? */

$data['']; correspond à la valeur dans ma table member_info. C'est vrai que cela peut porter à confusion, mais c'est la même valeur que $_POST['username'];.

J'ai quand même essayé à ta façon, mais le résultat est identique.

J'ai fait un autre test:

1) J'ai créé une nouvelle page index.php avec mon code session ci-dessus et le formulaire de connexion (sans <?php include(''); ?>)
2) Ensuite j'ai créé une page test_session.php indépendante (pas incluse dans index.php)

Lorsque je clique sur le lien qui m'amène à la page test_session.php , les valeurs de ma session sont bien transmises à cette page.

Donc, du moment que j'appelle une page en <?php include(''); ?> dans ma page index.php, cela pose problème...

#7 Re : Forum Général PHP » Garder les valeurs de login dans une session » 28-05-2010 09:45:16

J'ajoute la page php que j'ai mis en tête de index.php. Ce sera peut-être plus simple smile

<?php
/* ON DEMARRE UNE SESSION */
session_start();
/* ON PART DE L'IDEE QUE LE LOGIN NE FONCTIONNE PAS */
$login_ok = false;
/* ON VERIFIE SI LES INFORMATIONS ONT ETE POSTEES */
if (isset($_POST) && (!EMPTY($_POST['username'])) && (!EMPTY($_POST['password'])))
{extract($_POST);
/* CONNEXION AU SERVEUR */
$db = mysql_connect('localhost', 'utilisateur', 'motdepasse');
/* CONNEXION A LA BASE DE DONNEES */
mysql_select_db('membre',$db);
/* REQUETE SQL */
$request_member = 'SELECT ';
$request_member .= 'member_info.info_id, member_info.email, member_password.password_id, member_password.password ';
$request_member .= 'FROM ';
$request_member .= 'member ';
$request_member .= 'JOIN member_info ON (member_info.info_id=member.info_id) ';
$request_member .= 'JOIN member_password ON (member_password.password_id=member.password_id) ';
$request_member .= 'WHERE member_info.email="'.$username.'"';
$result_member = mysql_query($request_member);
if (mysql_num_rows($result_member) > 0)
{
$data = mysql_fetch_assoc($result_member);
if ($password == $data['password'])
{$login_ok = true;}
}
/* ON LIBERE L'ESPACE MEMOIRE ALLOUE POUR CETTE REQUETE */
mysql_free_result ($result_member);
/* ON FERME LA CONNEXION A LA BASE DE DONNEES */
mysql_close ();
}
/* SI LE LOGIN EST OK ON AFFICHE LES DONNEES */
if ($login_ok)
{
$_SESSION['username'] = $data['email'];
$_SESSION['password'] = $data['password'];
}
else {echo 'Merci de vous loguer svp';}
?>

Pour résumer, si je me logue pas de problème. Par contre, dès que je clique sur un lien qui va recharger la page index.php, les données de la session sont perdues.

Petite question supplémentaire...Suis-je obligé de mettre les valeurs de la session dans chacun de mes lien?

Merci

NdM Alnoss : J'ai édité ton post pour rajouter la balise php (couleur) et virer les ////// qui rendent le code presque invisible tellement tu en mets ^^

#8 Re : Forum Général PHP » Garder les valeurs de login dans une session » 28-05-2010 09:45:16

Salut xTG,
Concernant mes liens et mes formulaires, ils font toujours appel à la page index.php (les liens sont toujours en format index.php?p=xyz).
Comme j'ai des includes dans ma page index.php, je n'ai mis session_start() uniquement dans au début cette page (les autres pages n'en ont pas besoin car elles sont incluses dans la page principale).
Comme tu le soulignes, il est possible qu'à chaque chargement de ma page index.php, il efface mes valeurs. Le formulaire de login est en permanence visible sur mon site. Donc à chaque chargement de la page, les champs du formulaire se vident.
Mais franchement, je ne vois pas comment remédier à celle-là...
Une petite idée?
Merci

#9 Forum Général PHP » Garder les valeurs de login dans une session » 28-05-2010 09:45:16

Maximeus
Réponses : 7

Bonjour,

Je vous contacte concernant votre article sur les sessions.

Comme mon site a un espace membre, j'ai suivi cet article (pratiquement à l'identique) pour créer un système de sessions.

Toutefois, je rencontre un souci quant au maintient des valeurs durant la navigation sur le site.

Mon site contient une page index.php.

Cette page contient d'autres pages php en  <?php include(''); ?> (par exemple <?php include('member_login.php'); ?>).

Comme c'est uniquement ma page index.php qui est appelée lorsque je clique sur une lien (par exemple index.php?page=xyz), j'ai mis le code session_start(); en tête de la page

Si j'utilise mon formulaire de login et que je clique sur le bouton Connexion, les valeurs sont bien transmises et la page m'affiche que je suis bien logué en tant que membre.

Or, si je clique sur un lien appelant un des articles du site, la session saute (ce qui veut dire que les valeurs ne sont pas gardées dans ma session)

Comment puis-je pallier à ce problème? La fonction session_start() n'est-elle pas censée garder en mémoire les valeurs sans devoir les envoyés via une GET ou un POST ou encore un COOKIE?

Merci d'avance

#10 Re : Forum Général PHP » Soucis d'affichage de données d'une db mysql » 30-04-2010 08:31:20

Je prends note, merci.

Voici mon post modifié

Voici le select:

$request_ad = 'SELECT ';
$request_ad .= 'table_annonces.annonces_id, table_annonces.type_id, table_annonces.transaction_id, ';
$request_ad .= 'table_type.type_id, table_type.type_fr, table_type.type_en, table_type.type_de, ';
$request_ad .= 'table_caract_details.caract_alias, table_caract_details.caract_fr, table_caract_details.caract_en, table_caract_details.caract_de, ';
$request_ad .= 'table_caract.annonces_id, table_caract.caract_alias, table_caract.caract_rec, ';
$request_ad .= 'table_transaction.transaction_id, table_transaction.transaction_fr, table_transaction.transaction_en, table_transaction.transaction_de ';
$request_ad .= 'FROM ';
$request_ad .= 'table_annonces ';
$request_ad .= 'JOIN table_transaction ON table_annonces.transaction_id=table_transaction.transaction_id ';
$request_ad .= 'JOIN table_type ON table_type.type_id=table_annonces.type_id ';
$request_ad .= 'JOIN table_caract ON table_caract.annonces_id=table_annonces.annonces_id ';
$request_ad .= 'JOIN table_caract_details ON table_caract_details.caract_alias=table_caract.caract_alias';

Je viens également de remarquer que j'ai commis des erreurs de frappe:


TABLE_ANNONCES
/// annonces_id /// type_id /// transaction_id (et non pas caract_id)


Et revoici une exemple de while:

// On scanne la base de données
while ($data = mysql_fetch_array($result_ad))
{
// On affiche les données
echo '<div id="content">';
echo ''.htmlentities(trim($data['transaction_'.$lang.''])).'<br clear="all" />';
echo ''.htmlentities(trim($data['type_'.$lang.''])).'<br clear="all" />';
echo ''.htmlentities(trim($data['caract_'.$lang.''])).'<br clear="all" />';
echo '</div>';
}

Ce qui m'affiche:

Achat
Appartements
Nombre de pièces

Achat
Appartements
Cuisine équipée

et non pas:

Achat
Appartements
Nombre de pièces
Cuisine équipée

Je dois modifier mon while de sorte qu'il m'affiche les données de la table table_caract_details avec les autres données (Achat, Appartements) sans qu'il réaffiche à chaque fois celle-ci.

Merci

#11 Re : Forum Général PHP » Soucis d'affichage de données d'une db mysql » 30-04-2010 08:31:20

Voici le select:

$request_ad = 'SELECT ';
$request_ad .= 'table_annonces.annonces_id, table_annonces.type_id, table_annonces.transaction_id, ';
$request_ad .= 'table_type.type_id, table_type.type_fr, table_type.type_en, table_type.type_de, ';
$request_ad .= 'table_caract_details.caract_alias, table_caract_details.caract_fr, table_caract_details.caract_en, table_caract_details.caract_de, ';
$request_ad .= 'table_caract.annonces_id, table_caract.caract_alias, table_caract.caract_rec, ';
$request_ad .= 'table_transaction.transaction_id, table_transaction.transaction_fr, table_transaction.transaction_en, table_transaction.transaction_de ';
$request_ad .= 'FROM ';
$request_ad .= 'table_annonces ';
$request_ad .= 'JOIN table_transaction ON table_annonces.transaction_id=table_transaction.transaction_id ';
$request_ad .= 'JOIN table_type ON table_type.type_id=table_annonces.type_id ';
$request_ad .= 'JOIN table_caract ON table_caract.annonces_id=table_annonces.annonces_id ';
$request_ad .= 'JOIN table_caract_details ON table_caract_details.caract_alias=table_caract.caract_alias';


Je viens également de remarquer que j'ai commis des erreurs de frappe:


TABLE_ANNONCES
/// annonces_id /// type_id /// transaction_id (et non pas caract_id)


Et revoici une exemple de while:


// On scanne la base de données
while ($data = mysql_fetch_array($result_ad))
{
// On affiche les données
echo '<div id="content">';
echo ''.htmlentities(trim($data['transaction_'.$lang.''])).'<br clear="all" />';
echo ''.htmlentities(trim($data['type_'.$lang.''])).'<br clear="all" />';
echo ''.htmlentities(trim($data['caract_'.$lang.''])).'<br clear="all" />';
echo '</div>';
}

Ce qui m'affiche:

Achat
Appartements
Nombre de pièces

Achat
Appartements
Cuisine équipée

et non pas:

Achat
Appartements
Nombre de pièces
Cuisine équipée


Je dois modifier mon while de sorte qu'il m'affiche les données de la table table_caract_details avec les autres données (Achat, Appartements) sans qu'il réaffiche à chaque fois celle-ci.

Merci

#12 Forum Général PHP » Soucis d'affichage de données d'une db mysql » 30-04-2010 08:31:20

Maximeus
Réponses : 7

Bonsoir,

Je sollicite votre aide pour un petit souci d'affichage de données d'un bd mysql.

Ma page doit afficher les données d'une annonce. Par exemple:

Appartement
Prix
Nombre de pieces
Cuisine équipée
...

Les données s'affichent bien, mais en plusieurs parties. Par exemple:

Appartement
Prix
Nombre de pièces
...

Appartement
Prix
Cuisine équipée
...

Pour chaque caractéristique de mon annonces, il affiche un record supplémentaire, au lieu des les afficher un au dessous de l'autre.

Voici mon code de mon while:

////////////////////////////////////////////////////////////////////////////////
// On scanne la base de données
while ($data = mysql_fetch_array($result_ad))
{
// On affiche les données
echo '<div id="content">';
echo ''.htmlentities(trim($data['type_'.$lang.''])).'<br clear="all" />';
echo ''.htmlentities(trim($data['prix_'.$lang.''])).'<br clear="all" />';
echo ''.htmlentities(trim($data['caract_'.$lang.''])).'<br clear="all" />';
echo '</div>';
}
////////////////////////////////////////////////////////////////////////////////


Pour information, les données "caractéristiques" se trouvent dans une table séparée jointe à ma table principale.

Voici comment mes tables sont +/- configurées:


TABLE_ANNONCES
/// annonces_id /// type_id /// caract_id

TABLE_TYPE
/// type_id /// type_fr /// type_en /// type_de

TABLE_CARACT
/// annonces_id /// caract_alias /// caract_rec

TABLE_CARACT_DETAILS
/// caract_alias /// caract_fr /// caract_en /// caract_de


Ma table TABLE_ANNONCES est liée à la table TABLE_TYPE et à la table TABLE_CARACT.

Ma table TABLE_CARACT est liée à la table TABLE_CARACT_DETAILS.


De quelle manière dois-je modifier mon code ci-dessus pour éviter les affichages en double?

Merci d'avance.

#14 Re : Forum Général PHP » [Résolu] Affichage des données de plusieurs tables d'une bdd mysql » 27-04-2010 20:05:41

Merci Moogli pour ta réponse.

J'ai toutefois un petit doute concernant l'affichage des données...

Admettons que je veuille afficher le champ ID de ma table TAB_1 et le champ ID de ma table TAB_2 (les deux champs on le même titre et sont liés) et que j'applique le code suivant:

...
$requete = 'SELECT * FROM tab_01, tab_02 WHERE tab_01.id=tab_02.id';
$resultat = mysql_query($requete) or die('Erreur SQL !<br />'.$requete.'<br />'.mysql_error());
...
while ($donnees = mysql_fetch_array($resultat ))
{

echo '<div>'.$donnees['id'].'<div/>';
...

Dans ce cas, il y conflit, puisque les deux champs se nomment pareil... N'est-ce pas?

Merci.

#15 Forum Général PHP » [Résolu] Affichage des données de plusieurs tables d'une bdd mysql » 27-04-2010 20:05:41

Maximeus
Réponses : 5

Bonjour,

Est-ce que qn pourrait svp me rafraîchir la mémoire concernant l'affichage des données de plusieurs tables d'une base de données mysql?

Pour l'affichage de données d'une seul table, je mets ceci:

...
while ($donnees = mysql_fetch_array($retour)) // On fait une boucle pour lister les résultats
{

echo '<div>'.$donnees['yx'].'<div/>';
...

Comment fait-on si on veut afficher les données de plusieurs table liées entre-elles? Par exemple, je souhaite afficher la données xy de la table tab_1 et la données xyz de la table tab_2.

Merci d'avance

#16 Re : Forum Général PHP » Editer une page php avec php » 21-04-2010 21:59:07

Merci pour vos réponses.

J'utilisais déjà des Cms, mais j'avais envie de faire qch à ma sauce (en beaucoup plus light bien sûr wink), car le point noir des Cms est la sécurité.

Leur succès attire les pirates, ce qui implique des mises à jour permanente du produit hmm.

A +++

#17 Re : Forum Général PHP » Souci avec la condition != » 22-04-2010 19:30:44

Merci pour votre réponse. Testé et approuvé smile

Toutefois, j'ai encore une question:

Dans mon exemple, le site est en français et en anglais.
Comment modifier le code if ($l<>"en"){$l="fr";} pour qu'il accepte aussi une 3ème langue (par exemple "sp") ?

J'ai essayé ceci:

if (($l<>"en") OR ($l<>"sp"))
{$l="fr";}

mais cela ne fonctionne pas.

Merci.

#18 Re : Forum Général PHP » Editer une page php avec php » 21-04-2010 21:59:07

N'y a-t-il pas de contre-indication à tout faire passer par une db mysql, càd tout le contenu du site (textes, liens, class css)? Un peu comme le très connu Joomla?

#19 Forum Général PHP » Souci avec la condition != » 22-04-2010 19:30:44

Maximeus
Réponses : 13

Bonjour,

Appel à l'aide avec l'utilisation de la condition != .

J'explique:

Ma page récupère la valeur de la langue du site se trouvant dans le lien (exemple: monsite.com/index.php?l=fr) avec le code suivant:

$l = $_GET['l'];

Ensuite, je place des conditions qui contrôlent la valeur:

if (empty($l) OR ($l != 'fr') OR ($l != 'en'))  // Si la valeur est null ou si la valeur est différente que fr ou en...
{
$l = 'fr';  // ... le site est fr
}
else
{
$l = $_GET['l']; // Sinon le site est dans la langue choisie (fr ou en)
}

Malheureusement, cela ne fonctionne pas super.

Avec la langue française pas de problème, mais si je clique sur la langue anglaise le site reste en français.

Une petite idée?

Merci

#20 Forum Général PHP » Editer une page php avec php » 21-04-2010 21:59:07

Maximeus
Réponses : 8

Bonjour,

J'ai une petite question concernant l'édition de pages php.

Voila mon projet:

Je souhaiterais créer un site dit "dynamique" dans lequel je pourrais faire les modifications de mes pages php à partir d'une page admin.

Au départ, je voulais tout mettre dans une db mysql et modifier son contenu via une page admin. Mais si tout le site fonctionne à partir d'un db, cela va générer beaucoup de connexion / déconnexion à celle-ci.

D'où l'idée de modifier directement la page php concernée. Par exemple: Ma page menu.php contient les liens de mon site. Je souhaiterais pouvoir ajouter / modifier /supprimer les liens de cette page à partir de ma page admin.

Pourriez-vous svp m'aiguiller?

Merci d'avance

Pied de page des forums

Propulsé par FluxBB