Page 1 sur 1

Optimisation des requetes Sql

Posté : 28 mai 2015, 11:08
par Maarethyu
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();

Re: Optimisation des requetes Sql

Posté : 28 mai 2015, 15:33
par sadeq
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.

Re: Optimisation des requetes Sql

Posté : 28 mai 2015, 18:33
par Maarethyu
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 ?

Re: Optimisation des requetes Sql

Posté : 28 mai 2015, 19:03
par tof73
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.

Re: Optimisation des requetes Sql

Posté : 28 mai 2015, 21:22
par Maarethyu
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>

Re: Optimisation des requetes Sql

Posté : 28 mai 2015, 21:50
par tof73
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.

Re: Optimisation des requetes Sql

Posté : 28 mai 2015, 22:06
par Maarethyu
Tu me donne une petit example ?