Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP MYSQL] Czy ten skrypt jest dobry?
Forum PHP.pl > Forum > PHP
julek12
Napisałem taki o to skrypt:
  1. <?php
  2. try
  3. {
  4.  $pdo = new PDO('mysql:host=localhost;dbname=xxx', 'xxx', 'xxx'); // Inicjacja bazy bez parametrów kodowania
  5.  //$pdo = new PDO('mysql:host=hostBazyDanych;dbname=nazwaBazy', 'login', 'haslo', array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8')); // Inicjacja bazy z kodowaniem UTF-8
  6.  $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // Ustawienia parametrów wyjątków PDO
  7.  
  8.  $stmt = $pdo -> query('SELECT `uid`, `username`, `vip`, `group_vip`, `ile_vip` FROM `mybb_users` WHERE `group_vip` != 0');
  9.  
  10.  echo '<ol>';
  11.  foreach($stmt as $row)
  12.  {
  13.      $sql = $pdo->prepare('SELECT `username`, `vip`, `group_vip`, `ile_vip` FROM `mybb_users` WHERE `group_vip` != 0 AND `username` = :nick'); // Przygotowuanie zapytania
  14.      $sql->bindValue(':nick', $row['username'], PDO::PARAM_STR); // Podpinanie jest odporne na SQL Injection ;], a na dodatek szybsze
  15.      $sql->execute(); // Wykonanie
  16.      $data = $sql->fetch(PDO::FETCH_ASSOC); // Pobranie tablicy asocjacyjnej
  17.  
  18.      $czas = $data['vip'] - time();
  19.      $dni = floor($czas / 86400);
  20.      $godzin = floor(($czas - floor($dni) * 86400) / 3600);
  21.      $minut = floor(($czas - floor($dni) * 86400 - floor($godzin) * 3600) / 60);
  22.  
  23.      $d = 'dni';
  24.      $g = 'godzin';
  25.      $m = 'minut';
  26.  
  27.      if ($dni == 1)
  28.      {
  29.         $d = 'dzień';
  30.      }
  31.  
  32.      if ($godzin == 1)
  33.      {
  34.         $g = 'godzina';
  35.      }
  36.      else if ($godzin == 2 || $godzin == 3 || $godzin == 4)
  37.      {
  38.         $g = 'godziny';
  39.      }
  40.  
  41.      if ($minut == 1)
  42.      {
  43.         $m = 'minuta';
  44.      }
  45.      else if ($minut == 2 | $minut == 3 | $minut == 4)
  46.      {
  47.         $m = 'minuty';
  48.      }
  49.  
  50.      switch($data['ile_vip'])
  51.      {
  52.        case 1:
  53.           $ilosc = "raz";
  54.           break;
  55.        case !1:
  56.           $ilosc = "razy";
  57.           break;
  58.      }
  59.  
  60.      switch($data['group_vip'])
  61.      {
  62.        case 2:
  63.           echo '<li><a href="http://forum.tibiaserv.pl/'.$row['username'].'-u-'.$row['uid'].'.html"><span style="color: blue;"><strong>'.$row['username'].'</strong></span></a>: '.$row['ile_vip'].' '.$ilosc.' był VIPem. VIP skończy się za: '.$dni.' '.$d.', '.$godzin.' '.$g.', '.$minut.' '.$m.'.</li>';
  64.           break;
  65.      }
  66.  
  67.  }
  68.  $stmt -> closeCursor();
  69.  
  70.  echo '</ol>';
  71.  
  72. }
  73. catch(Exception $e) // łapiemy błędy
  74. {
  75.   echo $e->getMessage(); // Wyświetlamy treść błędu
  76. }
  77. ?>


Co o nim sądzicie??
zegarek84
przecierz widzę że tu:
Kod
$stmt = $pdo -> query('SELECT `uid`, `username`, `vip`, `group_vip`, `ile_vip` FROM `mybb_users` WHERE `group_vip` != 0');

pobrałeś już wszystkie potrzebne Ci elementy z bazy to po co pobierasz potem znowu w petli pojedyńczo??:
Kod
$sql = $pdo->prepare('SELECT `username`, `vip`, `group_vip`, `ile_vip` FROM `mybb_users` WHERE `group_vip` != 0 AND `username` = :nick'); // Przygotowuanie zapytania
     $sql->bindValue(':nick', $row['username'], PDO::PARAM_STR); // Podpinanie jest odporne na SQL Injection;], a na dodatek szybsze
     $sql->execute(); // Wykonanie
     $data = $sql->fetch(PDO::FETCH_ASSOC);

przecież jak patrzę na kod to nie odwołując się kolejny raz do bazy w petli to Twojemu $data['vip']<==>$row['vip']
Mephistofeles
Chyba możesz wywalić query, a zostawić samo drugie zapytanie.
julek12
no niestety nie moge usunąć ani pierwszego ani drugiego. Pierwszego poniewaz na jego podstawie jest wykonywana pętla foreach, a drugiego bo tam są informacje troche inne to znaczy ze jest dodany nick i musi być to w pętli foreach:P
a tak poza tym to dobrze??
zegarek84
Cytat(julek12 @ 13.03.2009, 13:45:58 ) *
no niestety nie moge usunąć ani pierwszego ani drugiego. Pierwszego poniewaz na jego podstawie jest wykonywana pętla foreach, a drugiego bo tam są informacje troche inne to znaczy ze jest dodany nick i musi być to w pętli foreach:P
a tak poza tym to dobrze??

PIERWSZE:
  1. $stmt = $pdo -> query('SELECT `uid`, `username`, `vip`, `group_vip`, `ile_vip` FROM `mybb_users` WHERE `group_vip` != 0');

DRUGIE:
  1. $sql = $pdo->prepare('SELECT `username`, `vip`, `group_vip`, `ile_vip` FROM `mybb_users` WHERE `group_vip` != 0 AND `username` = :nick');

GDZIE :nick <==> $row['username'] GDZIE $row['username'] to `username` z pierwszego zapytania, pierwsze i drugie operuje na tej samej tablicy więc w koło macieju poruwnujesz `username`=`username`

w pierwszym zapytaniu pobierasz nawet więcej kolumn i wszystkie z drugiego zapytania są w pierwszym, nawet warunek WHERE widzę ten sam - czyli jednym słowem jak pisałem wcześniej nie potrzebne jest to drugie zapytanie - w pierwszym dodatkowo masz więcej o 'uid'

całego kodu nie analizuję gdyż nie mam czasu ;/
julek12
To jak ma to wyglądać bo mi nie chce działać;/ Napiszcie prosze.
Spawnm
co ci nie chce działać, pokaż co masz teraz.
julek12
Na guże jest to co mam i to działa ale to co proponują inni to nie moge dać bo nie chce działać;/
Mephistofeles
Mniej więcej tak:
  1. <?php
  2. $stmt = $pdo -> query('SELECT `uid`, `username`, `vip`, `group_vip`, `ile_vip` FROM `mybb_users` WHERE `group_vip` != 0');
  3. $table = $stmt -> fetch(PDO::FETCH_ASSOC);
  4. foreach ($table as $row)
  5. {
  6.   np. $data = $row['vip'];
  7.   itd.
  8. }
  9. ?>

Po prostu niepotrzebnie wykonujesz drugie zapytanie, bo i tak w pierwszym pobrałeś to samo.
julek12
Teraz skrypt wygląda tak:
  1. <?php
  2. try
  3. {
  4.  $pdo = new PDO('mysql:host=localhost;dbname=xx', 'xx', 'xx'); // Inicjacja bazy bez parametrów kodowania
  5.  //$pdo = new PDO('mysql:host=hostBazyDanych;dbname=nazwaBazy', 'login', 'haslo', array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8')); // Inicjacja bazy z kodowaniem UTF-8
  6.  $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // Ustawienia parametrów wyjątków PDO
  7.  
  8.  $stmt = $pdo->query('SELECT `uid`, `username`, `vip`, `ile_vip` FROM `xx` WHERE `group_vip` = 2 ORDER BY `vip` ASC');
  9.  $count = $stmt->rowCount();
  10.  if ($count == 0)
  11.  {
  12.  throw new Exception('<b>Brak!</b><br />');
  13.  $stmt->closeCursor();
  14.  }
  15.  
  16.  echo '<ol>';
  17.  foreach($stmt as $row)
  18.  {
  19.      $czas = $row['vip'] - time();
  20.      $dni = floor($czas / 86400);
  21.      $godzin = floor(($czas - floor($dni) * 86400) / 3600);
  22.      $minut = floor(($czas - floor($dni) * 86400 - floor($godzin) * 3600) / 60);
  23.  
  24.      $d = 'dni';
  25.      $g = 'godzin';
  26.      $m = 'minut';
  27.  
  28.      if ($dni == 1)
  29.      {
  30.         $d = 'dzień';
  31.      }
  32.  
  33.      if ($godzin == 1)
  34.      {
  35.         $g = 'godzina';
  36.      }
  37.      else if ($godzin == 2 || $godzin == 3 || $godzin == 4)
  38.      {
  39.         $g = 'godziny';
  40.      }
  41.  
  42.      if ($minut == 1)
  43.      {
  44.         $m = 'minuta';
  45.      }
  46.      else if ($minut == 2 || $minut == 3 || $minut == 4)
  47.      {
  48.         $m = 'minuty';
  49.      }
  50.  
  51.      switch($row['ile_vip'])
  52.      {
  53.        case 1:
  54.           $ilosc = "raz";
  55.           break;
  56.        case !1:
  57.           $ilosc = "razy";
  58.           break;
  59.      }
  60.  
  61.      echo '<li><a href="http://forum.tibiaserv.pl/'.$row['username'].'-u-'.$row['uid'].'.html"><span style="color: blue;"><strong>'.$row['username'].'</strong></span></a>: '.$row['ile_vip'].' '.$ilosc.' jest VIPem. VIP skończy się za: '.$dni.' '.$d.', '.$godzin.' '.$g.' i '.$minut.' '.$m.'.</li>';
  62.  }
  63.  $stmt -> closeCursor();
  64.  
  65.  echo '</ol>';
  66.  
  67. }
  68. catch(Exception $e) // łapiemy błędy
  69. {
  70.   echo $e->getMessage(); // Wyświetlamy treść błędu
  71. }
  72. ?>

Lepiej??
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.