Optimisation des requetes Sql

Petit nouveau ! | 8 Messages

28 mai 2015, 11:08

Salut ^^

J'ai une base de données qui contient certaine information importante sur des utilisateurs, étant debutant en php, j'ai fait un .php qui est include partout et qui fait un requête MySqli a chaque refresh de page.
Je me suis rendu compte que ce n'était pas optimisé du tout.
Quelqu'un aurait une alternative pour le rafraichissement des données de ce type la : sql -> session ?

Code : Tout sélectionner

$_mailQuery = "SELECT email FROM Users WHERE steamID64=?"; $_select = $link->prepare($_mailQuery); $_select->bind_param('s', $ID64); if($_select->execute()) { $_select->store_result(); $_select->bind_result($col1); while ($_select->fetch()) { $col1 = stripcslashes($col1); $_SESSION['userEmail'] = $col1; } } $_select->free_result();

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

28 mai 2015, 15:33

Bonjour, l'optimisation consiste à restaurer la valeur userEmail de la session si elle existe déjà. Comme ça:
<?php 
//Au début de la page
session_start();

//Si la valeur userEmail n'existe pas dans la session en cours, alors relancer la requête SQL pour la trouver
if ( ! isset($_SESSION['userEmail']) )
 {
       $_mailQuery = "SELECT email FROM Users WHERE steamID64=?";
       $_select = $link->prepare($_mailQuery);
       $_select->bind_param('s', $ID64);

      if($_select->execute())
      {
            $_select->store_result();
            $_select->bind_result($col1);
            while ($_select->fetch())
             {
                   $col1 = stripcslashes($col1);
                   $_SESSION['userEmail'] = $col1;
             }
       }
      $_select->free_result();
}
//Fin de la préparation de la valeur  $_SESSION['userEmail']
voila.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Petit nouveau ! | 8 Messages

28 mai 2015, 18:33

Le probleme n'est pas la ^^
En fait j'ai besoin que ces informations soit mise a jour dans la session quand elles sont modifié, sachant qu'elles peuvent étre modifié par quelqu'un d'autre.
Les solutions serait :
- Faire des requêtes sans arrêt.
- Un cookie avec une expiration de 5min qui permet au programme de savoir si les informations ont été rafraichies depuis 5min.
- Le serveur qui envoie les nouvelles informations seulement quand elles sont modifié.

Mon problème est clair ou Il faut plus d'explication ?

Mammouth du PHP | 688 Messages

28 mai 2015, 19:03

sur un forum phpbb, tu as une dizaine de requetes sql à chaque demande de page, cela ne pose pas de problème tant que les requetes sont optimisées.
dans ton cas, si tu as bien un index sur steamID64, alors la requete est peu couteuse.
après il faut voir la fréquence de changement par d'autres personnes de l'email, et dans quel cas, cette adresse email doit vraiment être à jour, pour savoir si le code donné par sadeq ne convient pas.

Petit nouveau ! | 8 Messages

28 mai 2015, 21:22

En fait j'ai pris l'adresse email en example mais j'ai plusieurs requête a la suite exactement comme l'email mais pour d'autre chose, une url, le theme, l'option "remember me", les points et j'en ajouterais surement au fur et a mesure.

Mais tu me dit que pour l'instant je doit pas trop m'inquieter pour l'opti de ce coté la ?

Je vous met le code complet au cas ou, et si vous voyez des choses que je peut améliorer, j'ai tout appris tout seul donc je me dit qu'il y a surement des choses améliorable.

db_get.php :

Code : Tout sélectionner

<?php date_default_timezone_set('Europe/Paris'); if(isset($_SESSION['steamid'])) { include ($ROOTPATH.'/steamauth/userInfo.php'); $ID64 = $steamprofile['steamid']; $link = mysqli_connect('localhost', 'xxxxxxx', 'xxxxxxxxx', 'xxxxxxxxx');//oups j'espere que personne a vu les infos de connexion $tradeOfferID = $steamprofile['steamid'] - 76561197960265728; $tradeOfferID = 'https://steamcommunity.com/tradeoffer/new/?partner='.$tradeOfferID; $_selectQuery = "SELECT steamID64 FROM Users WHERE steamID64=?"; $_select = $link->prepare($_selectQuery); $_select->bind_param('s', $ID64); if($_select->execute()) { $_select->store_result(); $rowcount = $_select->num_rows; $_select->free_result(); if($rowcount == 0) { $_insertQuery = "INSERT INTO Users (steamID64) VALUES (?)"; $_insert = $link->prepare($_insertQuery); $_insert->bind_param('s', $ID64); $_insert->execute(); $_insert->free_result(); $_insertQuery = "UPDATE Users SET tradeOfferLink=? WHERE steamID64 =?"; $_insert = $link->prepare($_insertQuery); $_insert->bind_param('ss', $tradeOfferID, $ID64); $_insert->execute(); $_insert->free_result(); } } $_mailQuery = "SELECT email FROM Users WHERE steamID64=?"; $_select = $link->prepare($_mailQuery); $_select->bind_param('s', $ID64); if($_select->execute()) { $_select->store_result(); $_select->bind_result($col1); while ($_select->fetch()) { $col1 = stripcslashes($col1); $_SESSION['userEmail'] = $col1; } } $_select->free_result(); $_linkQuery = "SELECT tradeOfferLink FROM Users WHERE steamID64=?"; $_select = $link->prepare($_linkQuery); $_select->bind_param('s', $ID64); if($_select->execute()) { $_select->store_result(); $_select->bind_result($col1); while ($_select->fetch()) { $col1 = stripcslashes($col1); $_SESSION['userTradeOfferLink'] = $col1; } } $_select->free_result(); $_aboutmeQuery = "SELECT aboutMe FROM Users WHERE steamID64=?"; $_select = $link->prepare($_aboutmeQuery); $_select->bind_param('s', $ID64); if($_select->execute()) { $_select->store_result(); $_select->bind_result($col1); while ($_select->fetch()) { $col1 = stripcslashes($col1); $_SESSION['userAboutMe'] = $col1; } } $_select->free_result(); $_themeQuery = "SELECT theme FROM Users WHERE steamID64=?"; $_select = $link->prepare($_themeQuery); $_select->bind_param('s', $ID64); if($_select->execute()) { $_select->store_result(); $_select->bind_result($col1); while ($_select->fetch()) { if($col1 == 0) {$_SESSION['userTheme'] = 1;} elseif($col1 == 1) {$_SESSION['userTheme'] = 2;} } } $_select->free_result(); $_rememberMeQuery = "SELECT rememberMe FROM Users WHERE steamID64=?"; $_select = $link->prepare($_rememberMeQuery); $_select->bind_param('s', $ID64); if($_select->execute()) { $_select->store_result(); $_select->bind_result($col1); while ($_select->fetch()) { if($col1 == 1) {$_SESSION['userRememberMe'] = 1;} elseif($col1 == 0) {$_SESSION['userRememberMe'] = 0;} } } $_select->free_result(); $_pointQuery = "SELECT points FROM Users WHERE steamID64=?"; $_select = $link->prepare($_pointQuery); $_select->bind_param('s', $ID64); if($_select->execute()) { $_select->store_result(); $_select->bind_result($col1); while ($_select->fetch()) { $_SESSION['userPoints'] = $col1; } } $_select->free_result(); $_repQuery = "SELECT REP FROM Users WHERE steamID64=?"; $_select = $link->prepare($_repQuery); $_select->bind_param('s', $ID64); if($_select->execute()) { $_select->store_result(); $_select->bind_result($col1); while ($_select->fetch()) { $_SESSION['userREP'] = $col1; } } $_select->free_result(); if($_SESSION['userRememberMe'] == 1) { setcookie('PHPSESSID', $_COOKIE['PHPSESSID'], time()+7*24*60*60, '/'); } elseif($_SESSION['userRememberMe'] == 0) { setcookie('PHPSESSID', $_COOKIE['PHPSESSID'], -1, '/'); } setcookie('refresh', 'false', time()+300, '/'); } $_banQuery = "SELECT steamID64 FROM Bans WHERE steamID64=?"; $_select = $link->prepare($_banQuery); $_select->bind_param('s', $ID64); if($_select->execute()) { $_select->store_result(); $rowcount = $_select->num_rows; $_select->free_result(); if($rowcount > 0) { session_start(); unset($_SESSION['steamid']); unset($_SESSION['steam_uptodate']); header('Location: /banned.php?id='.$ID64); } } $_select->free_result(); $link->close(); ?> //redirection au cas ou l'user n'a pas les cookies activé <script type="text/javascript"> var x = navigator.cookieEnabled; if(!(window.location.href.indexOf("cookies") > -1)) { if(x == false) { location.replace('/cookies.php'); } } </script>

Mammouth du PHP | 688 Messages

28 mai 2015, 21:50

là c'est clairement une consommation excessive de ressources.
tu peux très bien faire SELECT REP, points, ..... FROM Users WHERE steamID64=?
et récupérer tous les champs de la table Users en 1 requête.

Petit nouveau ! | 8 Messages

28 mai 2015, 22:06

Tu me donne une petit example ?