[Résolu] [php] Comparer les valeurs de trois (ou+) champs dans une bdd

Bonjour,

Je suis en train d’essayer de faire un morceau de code en php qui me permettrait d’afficher dans un tableau quel champ a la valeur numérique la plus élevée.

Je m’explique :

Le but est de mettre en ligne une liste d’objet à donner, et les copains  peuvent venir voir et dire ce qui les interesse et attribuer un certain nombre de point à chaque objet.

J’ai donc une table avec la structure suivante :

ID   objet   description     valeur interesse1 propose1 interesse2 propose2 interesse3 propose3
1     vase   vase souflé    0         jojo            25          dédé          32         toto           27

Maintenant sur le site il y a donc un tableau avec toutes les infos ci-dessus et une colonne qui doit indiquer la proposition la plus élevée, et c’est la que je bloque :

Je n’arrive pas a comparer les trois champs propose1, 2 ou 3 pour qu’il n’affiche que le plus grand.

Pour l’instant je fais ça [code]:

<?php if ($propose1>$propose2 OR $propose3) : ?>
<?php echo  ''.$propose1.' par '.$interesse1.'' ;?>
<?php elseif ($propose2>$propose1 OR $propose3) : ?>
<?php echo ''.$propose2.' par '.$interesse2.'' ;?>
<?php elseif ($propose3>$propose1 OR $propose2) : ?>
<?php echo ''.$propose3.' par '.$interesse3.'' ;?>
<?php
endif; // fin du if qui permet ou non d'executer les commandes html
?>

Toutes les variables sont bien définies en amont.

Ca fonctionne tant qu’il n’y a que deux valeurs, dès que la troisième est définie il affiche d’office la première…

Je pense que la solution est toute bète mais je n’ai pas du partir dans le bon schéma au départ et du coup j’y arrive pas…

Merci de votre aide

PS : Je suis débutant en PHP, merci de votre indulgence et je suis désolé je n’arrive pas a « colorer » le code si dessus :-(edit : a ben si en fait :slight_smile: )

Le design de ta bdd n’est pas bon, que se passe t’il si on a 4 ou 5 ou n intéressé ?

Il faudrait faire une table pour les objets et une table pour les propositions (et même une pour les utilisateurs mais on va rester sur 2 pour l’instant)

On aurait donc une table objets avec id, nom, description, valeur
et une table propositions avec id, id_objet (foreign key de la table objets), interesse, propose

Avec ce design tu peux remonter directement la proposition la plus importante en faisant un LEFT JOIN

SELECT * FROM objets AS o LEFT JOIN propositions AS p ON o.id = p.id_objet 
ORDER BY p.propose DESC LIMIT 0,1

Tu es sur de la syntaxe du If ??

if ($propose1>$propose2 OR $propose3)

Ca parait curieux comme syntaxe, mais je connais pas trop le php.
Et même si la syntaxe est correcte, c’est pas OR qu’il faut mettre mais AND.

Si prop1 est supérieure à prop2 ET à prop3. 

[quote=“zepostman, post:3, topic: 55176”][/quote]

J’imagine que la syntaxe correcte doit plus ressembler à ça (cf. la doc) :

if ($propose1>$propose2 && $propose1>$propose3)

Et sinon, +1 pour ludwig et la remarque sur le design de la bdd

la remarque est judicieuse mais une table n:m serait encore plus clean :wink:

objets [id, name]

objet_has_proposition [objet_id,user_id, proposition]

users [id, name]

SELECT o.name, u.name, op.proposition FROM objets AS o
JOIN objet_has_proposition AS op ON o.id = op.objet_id
JOIN users AS u ON u.id = op.user_id
ORDER BY op.propose DESC LIMIT 0,1

Ou si tu ne veux pas toucher a la base de données et t’amuser uniquement en php, tant que tu construit correctement ton tableau de base qui va contenir les valeurs, ça va être facile. 
Exemple : 

$values = array('foo' => 5, 'bar' => 10, 'baz' => 2);
echo  max($values) . ' - ' . array_search(max($values), $values);
// Affiche 10 - bar

Et ca marche avec 3 entrées ou 300 :slight_smile:

Merci pour vos réponses, je vais essayer de voir ce que j’arrive à faire avec toutes vos idées et je vous tiens au courant !

edit :

Merci à tous, j’ai essayé la solution de Haza, qui me permet de ne pas modifier ma base et ça fonctionne Nickel !
par contre je n’ai pas bien compris ce qui ce passe !

Pour commencer on fait une variable « values » dans laquelle on fait une sorte de tableau avec les noms et les propositions, par contre pourquoi faut il mettre strictement supérieur ( => ) entre les deux ?

Ensuite on affiche la valeur numérique max puis un tiret, mais a quoi correspond le : array_search(max($values), $values) ?

En tout cas merci beaucoup Haza !

@plouff : Ta solution marche aussi, sans modifier la base mais par contre il faut  coder toutes les possibilités et c’est vrai que si il commence a y avoir une dizaine de personnes interessés sa risque d’être compliqué :innocent:

[quote=« Haza, post:6, topic: 55176 »][/quote]

Array programming :smiley:

[quote=“qentinium, post:7, topic: 55176”][/quote]
Il créé un tableau de tes valeurs
array[‘foo’] = 5
array[‘bar’] = 10
array[‘baz’] = 2

le “=>” n’est pas supérieur et égal, c’est la manière d’assigner des valeurs aux index dans un tableau.


Ensuite on affiche la valeur numérique max puis un tiret, mais a quoi correspond le : array_search(max($values), $values) ?
on demande la valeur max au tableau (grave à max()) pour l'afficher, mais il faut le nom de l'objet qui correspond à cette valeur array_search ramene l'index pour la valeur demandé (ici max($values)) dans le tableau $values

[quote=« fser, post:8, topic: 55176 »][/quote]
Ben c’est surtout plus simple (selon moi) pour une personne qui débute :slight_smile:

[quote=« fser, post:8, topic: 55176 »][/quote]

fixed. :stuck_out_tongue:

Ok, merci beaucoup pour toutes ces explications !

[quote=« Anaethelion, post:11, topic: 55176 »][/quote]
C’est pas faux :stuck_out_tongue: