JeuWeb - Crée ton jeu par navigateur
Conseil pour optimisation ? - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Conseil pour optimisation ? (/showthread.php?tid=894)

Pages : 1 2


Conseil pour optimisation ? - Archange - 02-03-2007

Hello,

Je viens vers vous pour vous demandez des conseils d'optimisation sur un bout de code que jai fait. j'ai deja fait celle que j'ai remarquer grâce à un des topic dans la section tutos, mais sa me parait encore vraiment lourd, sachant que le code que je vait mettre ce repeteras pour chaque ressource qui seras definit .

Code PHP :
<?php 
if (isset($_SESSION['logged']) && $_SESSION['logged'] === true)
{
$postprixble = $_POST['prix_ble'] ;
$postprixa = $_POST['prix_avoine'] ;
$postprixo = $_POST['prix_oignon'] ;
//vente//
//-------------------------- Recupe nombre denré ET requete vente id------------------
$recup_denre = mysql_query ('SELECT id, ble, oignon, avoine FROM membres WHERE pseudo="'.$pseudo.'"');
$denre_recup = mysql_fetch_array ($recup_denre) or die (mysql_error() );
$sql = 'SELECT id_objet, prix_denree, nombre_denree FROM commerce
WHERE (id_objet=1 AND prix_denree="'
.$postprixble.'")
OR (id_objet=2 AND prix_denree="'
.$postprixo.'")
OR (id_objet=3 AND prix_denree="'
.$postprixa.'")';

$query_commerce = mysql_query ($sql);
while (
$vm = mysql_fetch_array ($query_commerce))
{
switch(
$vm['id_objet'])
{
case
1 :
$vmprix = $vm['prix_denree'];
$vmnomb = $vm['nombre_denree'];
break;
case
2 :
$voprix = $vm['prix_denree'];
$vonomb = $vm['nombre_denree'];
break;
case
3 :
$vaprix = $vm['prix_denree'];
$vanomb = $vm['nombre_denree'];
break;
}
}
//---------------Fin ------------------------------------------------
//Necessaire à la vente du ble
if (isset($_POST['ble']))
{
if (
$denre_recup['ble'] < $_POST['ble'] ) // Si denrée possédé inferieur aux denrée postée
{
echo
'Mise sur le marché impossible';
}
elseif (
$_POST['ble'] > 0 && $_POST['prix_ble'] > 0 ) //Sinon si denrée postée plus grande que 0 et prix plus grand que 0
{
$total = $denre_recup['ble'] - $_POST['ble'];
$id=$denre_recup['id'];
mysql_query('UPDATE membres SET ble="'.$total.'" WHERE id="'.$id.'"');
$nombreentree = mysql_query('SELECT COUNT(*) AS entrerok FROM commerce_user WHERE id_objet="1"'); //Count pour determiner si table vide
$entree = mysql_fetch_array($nombreentree);
if(
$entree['entrerok']==0) // Si table vide on fait un insert avec id_vente egal 0
{
$id_objet_vente1=0;
mysql_query('INSERT INTO commerce_user VALUES ("'.$id_objet_vente1.'", "'.$id.'", "'.$_POST['ble'].'", "'.$_POST['prix_ble'].'", "1")');
}
elseif(
$entree['entrerok']!=0) // Si table non vide
{
$recuperation = mysql_query('SELECT MAX(id_vente)FROM commerce_user WHERE id_objet="1"'); // Selectione le max id_vente
$max= mysql_result($recuperation, 0);
$max++;
mysql_query('INSERT INTO commerce_user VALUES ("'.$max.'", "'.$id.'", "'.$_POST['ble'].'", "'.$_POST['prix_ble'].'", "1")');
}
if(
$vmprix == $_POST['prix_ble'])
{
$denree_ble = ($vmnomb + $_POST['ble']);
mysql_query('UPDATE commerce SET nombre_denree="'.$denree_ble.'" WHERE id_objet="1" AND prix_denree="'.$postprixble.'"');
}
else
{
mysql_query('INSERT INTO commerce VALUES ("", "'.$_POST['ble'].'", "'.$_POST['prix_ble'].'", "1")');
}
}
}

Qu'en pensez vous, quel conseil avez vous à me donner pour optimiser au mieux ?

Merci


RE: Conseil pour optimisation ? - icien - 02-03-2007

pour faciliter les chose il faudrait que tu nous donnes tout ce qui est passé en '$_POST', mais a vu de nez je ferais une fonction avec yout ce qu'il y a la dedans:
Code PHP :
<?php 
//Necessaire à la vente du ble
if (isset($_POST['ble']))
{
...
... else
{
mysql_query('INSERT INTO commerce VALUES ("", "'.$_POST['ble'].'", "'.$_POST['prix_ble'].'", "1")');
}
}
}



RE: Conseil pour optimisation ? - Archange - 03-03-2007

Merci pour ta réponse,
Donc dans $_POST['ble'] c'est une valeur numerique ainsi que dans $_POST['prix_ble'].
Par contre pour la fonction je ne vois pas trop comment l'utiliser dans mon cas.


RE: Conseil pour optimisation ? - icien - 03-03-2007

un exemple valant plus que de longs discours, ca donnerait un truc dans le genre:
Code PHP :
<?
//la fonction:
function ajoutmarche($id,$nbdenre,$prixdenre,$isprix)
{
if (
$nbdenre > 0 AND $prixdenre > 0)
{
mysql_query('UPDATE membres SET ble=ble-'.$nbdenre.' WHERE id="'.$id.'"');
$nombreentree = mysql_query('SELECT COUNT(*) AS entrerok FROM commerce_user WHERE id_objet="'.$id.'"'); //Count pour determiner si table vide !!! j'ai supposé que id_objet de ta requete etait l'id de la denre
$entree = mysql_fetch_array($nombreentree);
if(
$entree['entrerok']==0) // Si table vide on fait un insert avec id_vente egal 0
{
mysql_query('INSERT INTO commerce_user VALUES ("0", "'.$id.'", "'.$nbdenre.'", "'.$prixdenre.'", "1")');
}
else
// Si table non vide !!!! Pas besoin de elseif vu que c'est soit =0 soit !=0 le else suffit donc.
{
$recuperation = mysql_query('SELECT MAX(id_vente)FROM commerce_user WHERE id_objet="'.$id.'"'); // Selectione le max id_vente !!! j'ai supposé que id_objet de ta requete etait l'id de la denre
$max= mysql_result($recuperation, 0);
$max++;
mysql_query('INSERT INTO commerce_user VALUES ("'.$max.'", "'.$id.'", "'.$nbdenre.'", "'.$prixdenre.'", "1")');
}
if(
$isprix)
{
mysql_query('UPDATE commerce SET nombre_denree=nombre_denree+'.$nbdenre.' WHERE id_objet="'.$id.'" AND prix_denree="'.$prixdenre.'"'); //!!! j'ai supposé que id_objet de ta requete etait l'id de la denre
}
else
{
mysql_query('INSERT INTO commerce VALUES ("", "'.$nbdenre.'", "'.$prixdenre.'", "'.$id.'")');
}
return
true;
}
else
{
return
false;
}
}

if (isset(
$_SESSION['logged']) && $_SESSION['logged'] === true)
{
$postprixble = $_POST['prix_ble'] ;
$postprixa = $_POST['prix_avoine'] ;
$postprixo = $_POST['prix_oignon'] ;

//on initialise les variable d'existance du prix
$isprixble=false; //le prix proposé pour le ble existe deja dans le commerce
$isprixoignon=false; //le prix proposé pour l'oignon existe deja dans le commerce
$isprixavoine=false; //le prix proposé pour l' avoine existe deja dans le commerce
//fin init

//vente//
//-------------------------- Recupe nombre denré ET requete vente id------------------
$recup_denre = mysql_query ('SELECT id, ble, oignon, avoine FROM membres WHERE pseudo="'.$pseudo.'"');
$denre_recup = mysql_fetch_array ($recup_denre) or die (mysql_error() );
$sql = 'SELECT id_objet FROM commerce
WHERE (id_objet=1 AND prix_denree="'
.$postprixble.'")
OR (id_objet=2 AND prix_denree="'
.$postprixo.'")
OR (id_objet=3 AND prix_denree="'
.$postprixa.'")';

$query_commerce = mysql_query ($sql);
while (
$vm = mysql_fetch_array ($query_commerce))
{
switch(
$vm['id_objet'])
{
case
1 :
$isprixble=True; //le prix proposé pour le ble existe deja dans le commerce
break;
case
2 :
$isprixoignon=True; //le prix proposé pour l'oignon existe deja dans le commerce
break;
case
3 :
$isprixavoine=True; //le prix proposé pour le ble existe deja dans le commerce
break;
}
}
//---------------Fin ------------------------------------------------
//Necessaire à la vente du ble
if (isset($_POST['ble']) AND is_numeric($_POST['ble']))
{
if (
$denre_recup['ble'] < $_POST['ble'] ) // Si denrée possédé inferieur aux denrée postée
{
echo
'Mise sur le marché impossible';
}
elseif (
ajoutmarche(1,$_POST['ble'],$postprixble,$isprixble))
{
echo
'Denrée mise sur le marché';
}
else
{
echo
'Mise sur le marché impossible: pas de prix ou pas de denrée';
}
}

?>

comme ça tu peux utiliser la fonction pour chaque produit a mettre sur le marché. J'ai pas commenté mais je n'ai pas fait tant de modifications que ça. N'hésite pas à poser des questions...


RE: Conseil pour optimisation ? - Archange - 03-03-2007

Merci Icien pour ton aide, sa me permet de mieux comprendre l'utilisation d'une fonction.
Sinon j'ai une petite question.
Je vois cette variable $isprixble ( avoine ou oignon ), et que tu t'en sert pour retourner true ou false, mais je ne vois pas enfaite a quoi elle sert et ce quelle représente, $postprixble ne serait pas mieux ?


RE: Conseil pour optimisation ? - icien - 03-03-2007

$postprixble, si j'ai bien compris, est l'argent que veut obtenir le joueur pour le blé. Or $isprixble sert a savoir si l'argent que veut obtenir le joueur pour le blé est déja existant dans le commerce ca remplace :
Code PHP :
<?php 
$vmprix
== $_POST['prix_ble']



RE: Conseil pour optimisation ? - Archange - 03-03-2007

D'accord je comprend mieux ,
J'ai fait quelques modifs et sa fonctionne bien maintenant
Code PHP :
<?php 
//la fonction:
function ajoutmarche($id,$id_objet,$nbdenre,$prixdenre,$isprix)
{
if (
$nbdenre > 0 AND $prixdenre > 0)
{
mysql_query('UPDATE membres SET ble=ble-'.$nbdenre.' WHERE id="'.$id.'"');
$nombreentree = mysql_query('SELECT COUNT(*) AS entrerok FROM commerce_user WHERE id_objet="'.$id_objet.'"'); //Count pour determiner si table vide !!! j'ai supposé que id_objet de ta requete etait l'id de la denre
$entree = mysql_fetch_array($nombreentree);
if(
$entree['entrerok']==0) // Si table vide on fait un insert avec id_vente egal 0
{
mysql_query('INSERT INTO commerce_user VALUES ("0", "'.$id.'", "'.$nbdenre.'", "'.$prixdenre.'", "'.$id_objet.'")');
}
else
// Si table non vide !!!! Pas besoin de elseif vu que c'est soit =0 soit !=0 le else suffit donc.
{
$recuperation = mysql_query('SELECT MAX(id_vente)FROM commerce_user WHERE id_objet="'.$id_objet.'"'); // Selectione le max id_vente !!! j'ai supposé que id_objet de ta requete etait l'id de la denre
$max= mysql_result($recuperation, 0);
$max++;
mysql_query('INSERT INTO commerce_user VALUES ("'.$max.'", "'.$id.'", "'.$nbdenre.'", "'.$prixdenre.'", "'.$id_objet.'")');
}
if(
$isprix)
{
mysql_query('UPDATE commerce SET nombre_denree=nombre_denree+'.$nbdenre.' WHERE id_objet="'.$id_objet.'" AND prix_denree="'.$prixdenre.'"'); //!!! j'ai supposé que id_objet de ta requete etait l'id de la denre
}
else
{
mysql_query('INSERT INTO commerce VALUES ("", "'.$nbdenre.'", "'.$prixdenre.'", "'.$id_objet.'")');
}
return
true;
}
else
{
return
false;
}
}

if (isset(
$_SESSION['logged']) && $_SESSION['logged'] === true)
{
$postprixble = $_POST['prix_ble'] ;
$postprixa = $_POST['prix_avoine'] ;
$postprixo = $_POST['prix_oignon'] ;

//on initialise les variable d'existance du prix
$isprixble=false; //le prix proposé pour le ble existe deja dans le commerce
$isprixoignon=false; //le prix proposé pour l'oignon existe deja dans le commerce
$isprixavoine=false; //le prix proposé pour l' avoine existe deja dans le commerce
//fin init

//vente//
//-------------------------- Recupe nombre denré ET requete vente id------------------
$recup_denre = mysql_query ('SELECT id, ble, oignon, avoine FROM membres WHERE pseudo="'.$pseudo.'"');
$denre_recup = mysql_fetch_array ($recup_denre) or die (mysql_error() );
$id=$denre_recup['id'];
$sql = 'SELECT id_objet FROM commerce
WHERE (id_objet=1 AND prix_denree="'
.$postprixble.'")
OR (id_objet=2 AND prix_denree="'
.$postprixo.'")
OR (id_objet=3 AND prix_denree="'
.$postprixa.'")';

$query_commerce = mysql_query ($sql);
while (
$vm = mysql_fetch_array ($query_commerce))
{
switch(
$vm['id_objet'])
{
case
1 :
$isprixble=True; //le prix proposé pour le ble existe deja dans le commerce
break;
case
2 :
$isprixoignon=True; //le prix proposé pour l'oignon existe deja dans le commerce
break;
case
3 :
$isprixavoine=True; //le prix proposé pour le ble existe deja dans le commerce
break;
}
}
//---------------Fin ------------------------------------------------
//Necessaire à la vente du ble
if (isset($_POST['ble']) AND is_numeric($_POST['ble']) OR isset($_POST['oignon']) AND is_numeric($_POST['oignon']))
{
if (
$denre_recup['ble'] < $_POST['ble'] OR $denre_recup['oignon'] < $_POST['oignon'] ) // Si denrée possédé inferieur aux denrée postée
{
echo
'Mise sur le marché impossible';
}
elseif (
ajoutmarche($id,1,$_POST['ble'],$postprixble,$isprixble))
{
echo
'Denrée mise sur le marché';
}
elseif (
ajoutmarche($id,2,$_POST['oignon'],$postprixo,$isprixoignon))
{
echo
'Denrée mise sur le marché';
}
else
{
echo
'Mise sur le marché impossible: pas de prix ou pas de denrée';
}
}
}

Je pense que la fin poura etre optimiser nan ? Je vais essayer en attendant, en tous cas merci de ton aide !


RE: Conseil pour optimisation ? - denisc - 03-03-2007

Je suis petu-etre chiant, mais AND et OR s'écrivent respectivement && et || en PHP, non?


RE: Conseil pour optimisation ? - icien - 03-03-2007

Non, les deux sont valides. Et je cite LE manuel PHP :"La raison pour laquelle il existe deux types de "ET" et de "OU" est qu'ils ont des priorités différentes." en gros si j'ecris ca :
X<1 AND Y<1 || Z<1 ce sera lu comme ca : X<1 AND (Y<1 OR Z<1)
alors que si j'ecris ca :
X<1 && Y<1 OR Z<1 ce sera lu comme ca : (X<1 AND Y<1) OR Z<1

Voilou...


RE: Conseil pour optimisation ? - denisc - 03-03-2007

Ah bon...
Perso, je préfère continuer avec une seule notation et ajouter les parenthèses qui vont bien quand il risque d'y avoir confusion... Ce qui simplifie également la relecture du code!
Mais si c'est correct, je retire.

Sinon, tu as 2 fois la ligne
Code PHP :
<?php 
echo'Denrée mise sur le marché';
peut-être faut-il regrouper tes tests pour n'en avoir plus qu'une.