Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Powtórzenia kodu
Forum PHP.pl > Forum > Przedszkole
julek12
Witam,
chciałbym się spytać czy da się jakoś zminimalizować ten kod, bo wydaje mi się on trochę za długi

  1. <?php
  2. try
  3. {
  4. $pdo = new PDO('mysql:host=localhost;dbname=xxxx', 'xxxx', 'xxx', array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));
  5. $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  6.  
  7. function showPoll()
  8. {
  9. global $pdo;
  10.  
  11. // Losowanie rekordu
  12. $sql = $pdo->query('SELECT * FROM `questions` WHERE `status` = 0');
  13. $row = $sql->fetchAll(PDO::FETCH_COLUMN);
  14. $rand_keys = array_rand($row);
  15.  
  16. $sql = $pdo->prepare('SELECT * FROM `questions` q JOIN `answers` a USING(qid) WHERE a.`qid` = :qid'); //SELECT
  17.  
  18. if ($_SERVER['REQUEST_METHOD'] == 'POST')
  19. {
  20. $stmt = $pdo->prepare('UPDATE `questions` q JOIN `answers` a USING(qid) SET q.`votes` = q.`votes` + 1, a.`vote` = a.`vote` + 1 WHERE q.`qid` = :qid AND a.`aid` = :aid'); //UPDATE
  21. $stmt->bindValue(':qid', $_POST['qid'], PDO::PARAM_INT); //UPDATE
  22. $stmt->bindValue(':aid', $_POST['answer'], PDO::PARAM_INT); //UPDATE
  23. $stmt->execute(); //UPDATE
  24.  
  25. $sql->bindValue(':qid', $_POST['qid'], PDO::PARAM_INT); //SELECT
  26. $sql->execute(); //SELECT
  27. $data = $sql->fetchAll();
  28. $question = $data[0];
  29.  
  30. echo '<ul><div style="max-width: 120px;">
  31. <li class="first"><b>'.$question['question'];
  32. echo '<br />Głos został oddany!</li>';
  33. foreach($data as $answer)
  34. {
  35. $percent = round(($answer['vote'] / $answer['votes']) * 100);
  36. echo '<li>'.$answer['answer'].'<br />
  37. głosów: '.$answer['vote'].', '.$percent.'%<br />
  38. <div style="border: 1px solid rgb(158, 152, 131); background: rgb(74, 8, 5); height: 10px; width: '.$percent.'%;"></div></li>';
  39. }
  40. $sql->closeCursor();
  41. }
  42. else
  43. {
  44. $sql->bindValue(':qid', $row[$rand_keys], PDO::PARAM_INT);
  45. $sql->execute();
  46. $data = $sql->fetchAll();
  47. $question = $data[0];
  48.  
  49. echo '<ul><div style="max-width: 120px;">
  50. <li class="first"><b>'.$question['question'];
  51.  
  52. if (2==3)
  53. {
  54. echo '<br />Głosowałeś już!</li>';
  55. foreach($data as $answer)
  56. {
  57. $percent = round(($answer['vote'] / $answer['votes']) * 100);
  58. echo '<li>'.$answer['answer'].'<br />
  59. głosów: '.$answer['vote'].', '.$percent.'%<br />
  60. <div style="border: 1px solid rgb(158, 152, 131); background: rgb(74, 8, 5); height: 10px; width: '.$percent.'%;"></div></li>';
  61. }
  62. $sql->closeCursor();
  63. }
  64. else
  65. {
  66. echo '</li><form id="poll" method="post" action="">';
  67. foreach($data as $answer)
  68. {
  69. echo '<li><input type="radio" name="answer" value='.$answer['aid'].' /> '.$answer['answer'].'</li>';
  70. }
  71. $sql->closeCursor();
  72. echo '<li><input type="text" name="qid" value='.$row[$rand_keys].' style="display: none;" /><div align="center"><input class="button" type="submit" value="Oddaj głos!" /></div></li></form>';
  73. }
  74. }
  75. echo '</b></div></ul>';
  76. }
  77. echo showPoll();
  78. }
  79. catch(PDOException $e)
  80. {
  81. echo $e->getMessage();
  82. }
  83. ?>
nospor
if ($_SERVER['REQUEST_METHOD'] == 'POST')
na:
if (!empty($_POST))

  1. if (2==3)
  2. {
  3. echo '<br />Głosowałeś już!</li>';
  4. foreach($data as $answer)
  5. {
  6. $percent = round(($answer['vote'] / $answer['votes']) * 100);
  7. echo '<li>'.$answer['answer'].'<br />
  8. głosów: '.$answer['vote'].', '.$percent.'%<br />
  9. <div style="border: 1px solid rgb(158, 152, 131); background: rgb(74, 8, 5); height: 10px; width: '.$percent.'%;"></div></li>';
  10. }
  11. $sql->closeCursor();
  12. }
  13. else
  14. {
  15. echo '</li><form id="poll" method="post" action="">';
  16. foreach($data as $answer)
  17. {
  18. echo '<li><input type="radio" name="answer" value='.$answer['aid'].' /> '.$answer['answer'].'</li>';
  19. }
  20. $sql->closeCursor();
  21. echo '<li><input type="text" name="qid" value='.$row[$rand_keys].' style="display: none;" /><div align="center"><input class="button" type="submit" value="Oddaj głos!" /></div></li></form>';
  22. }


2==3 questionmark.gif Co to ma byc? Po co dajesz warunek, który nigdy nie będzie spelniony a w tym warunku masa kodu. A potem sie dziwisz ze masz za duzo kodu winksmiley.jpg
julek12
warunek zostanie napisany potem wiem ze daje taki warunek zeby sprawdzić else a jak dam 2==2 to wtedy warunek smile.gif a reszta kodu ok czy coś jeszcze?
nospor
kod do wyswietlania procentow moglbys dac w funkcje. przeciez dwa razy generujesz to samo.
julek12
ok a jak wygląda to:
  1. $sql = $pdo->prepare('SELECT * FROM `questions` q JOIN `answers` a USING(qid) WHERE a.`qid` = :qid'); //SELECT
  2.  
  3. if ($_SERVER['REQUEST_METHOD'] == 'POST')
  4. {
  5. $stmt = $pdo->prepare('UPDATE `questions` q JOIN `answers` a USING(qid) SET q.`votes` = q.`votes` + 1, a.`vote` = a.`vote` + 1 WHERE q.`qid` = :qid AND a.`aid` = :aid'); //UPDATE
  6. $stmt->bindValue(':qid', $_POST['qid'], PDO::PARAM_INT); //UPDATE
  7. $stmt->bindValue(':aid', $_POST['answer'], PDO::PARAM_INT); //UPDATE
  8. $stmt->execute(); //UPDATE
  9.  
  10. $sql->bindValue(':qid', $_POST['qid'], PDO::PARAM_INT); //SELECT
  11. $sql->execute(); //SELECT


I do tego chciałbym dać jeszcze inserta da się to jakoś krócej zapisać?
phpion
Losowanie rekordu również jest nieco popaćkane. Po co pobierać wszystko (prawie) z tabeli tylko po to aby (jak zakładam) docelowo wylosować z niej 1 rekord. Możesz przecież skorzystać z:
  1. SELECT * FROM tabela ORDER BY RAND() LIMIT 1;

Możesz również pobrawić się w optymalizację tego zapytania poprzez pobranie liczby rekordów w jednym zapytaniu, a potem wykonanie drugiego z odpowiednim offsetem i limitem.
julek12
Jak te procenty w funkcje dać skoro one potrzebują zapytania?
wookieb
Potrzebuje wyniku zapytania.
julek12
teraz skrypt wygląda tak:
  1. <?php
  2. try
  3. {
  4. $pdo = new PDO('mysql:host=localhost;dbname=xxxx', 'xxxx', 'xxxx', array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));
  5. $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  6.  
  7. function showPoll()
  8. {
  9. global $pdo;
  10.  
  11. // Losowanie rekordu
  12. $sql = $pdo->query('SELECT `qid` FROM `questions` WHERE `status` = 0 ORDER BY RAND() LIMIT 1');
  13. $row = $sql->fetch();
  14.  
  15. $sql = $pdo->prepare('SELECT * FROM `questions` q JOIN `answers` a USING(qid) WHERE a.`qid` = :qid'); //SELECT
  16.  
  17. if (!empty($_POST))
  18. {
  19. $stmt = $pdo->prepare('UPDATE `questions` q JOIN `answers` a USING(qid) SET q.`votes` = q.`votes` + 1, a.`vote` = a.`vote` + 1 WHERE q.`qid` = :qid AND a.`aid` = :aid'); //UPDATE
  20. $stmt->bindValue(':qid', $_POST['qid'], PDO::PARAM_INT); //UPDATE
  21. $stmt->bindValue(':aid', $_POST['answer'], PDO::PARAM_INT); //UPDATE
  22. $stmt->execute(); //UPDATE
  23.  
  24. $sql->bindValue(':qid', $_POST['qid'], PDO::PARAM_INT); //SELECT
  25. $sql->execute(); //SELECT
  26. $data = $sql->fetchAll();
  27. $question = $data[0];
  28.  
  29. echo '<ul><div style="max-width: 120px;">
  30. <li class="first"><b>'.$question['question'];
  31. echo '<br />Głos został oddany!</li>';
  32. foreach($data as $answer)
  33. {
  34. $percent = round(($answer['vote'] / $answer['votes']) * 100);
  35. echo '<li>'.$answer['answer'].'<br />
  36. głosów: '.$answer['vote'].', '.$percent.'%<br />
  37. <div style="border: 1px solid rgb(158, 152, 131); background: rgb(74, 8, 5); height: 10px; width: '.$percent.'%;"></div></li>';
  38. }
  39. $sql->closeCursor();
  40. }
  41. else
  42. {
  43. $sql->bindValue(':qid', $row['qid'], PDO::PARAM_INT);
  44. $sql->execute();
  45. $data = $sql->fetchAll();
  46. $question = $data[0];
  47.  
  48. echo '<ul><div style="max-width: 120px;">
  49. <li class="first"><b>'.$question['question'];
  50.  
  51. if (2==3)
  52. {
  53. echo '<br />Głosowałeś już!</li>';
  54. foreach($data as $answer)
  55. {
  56. $percent = round(($answer['vote'] / $answer['votes']) * 100);
  57. echo '<li>'.$answer['answer'].'<br />
  58. głosów: '.$answer['vote'].', '.$percent.'%<br />
  59. <div style="border: 1px solid rgb(158, 152, 131); background: rgb(74, 8, 5); height: 10px; width: '.$percent.'%;"></div></li>';
  60. }
  61. $sql->closeCursor();
  62. }
  63. else
  64. {
  65. echo '</li><form id="poll" method="post" action="">';
  66. foreach($data as $answer)
  67. {
  68. echo '<li><input type="radio" name="answer" value='.$answer['aid'].' /> '.$answer['answer'].'</li>';
  69. }
  70. $sql->closeCursor();
  71. echo '<li><input type="text" name="qid" value='.$row['qid'].' style="display: none;" /><div align="center"><input class="button" type="submit" value="Oddaj głos!" /></div></li></form>';
  72. }
  73. }
  74. echo '</b></div></ul>';
  75. }
  76. echo showPoll();
  77. }
  78. catch(PDOException $e)
  79. {
  80. echo $e->getMessage();
  81. }
  82. ?>



A baza danych tak:

  1. --
  2. -- Struktura tabeli dla `answers`
  3. --
  4.  
  5. CREATE TABLE IF NOT EXISTS `answers` (
  6. `aid` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  7. `qid` int(10) NOT NULL,
  8. `answer` text COLLATE utf8_polish_ci NOT NULL,
  9. `vote` int(10) NOT NULL DEFAULT '0',
  10. PRIMARY KEY (`aid`)
  11. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=5 ;
  12.  
  13. --
  14. -- Zrzut danych tabeli `answers`
  15. --
  16.  
  17. INSERT INTO `answers` (`aid`, `qid`, `answer`, `vote`) VALUES
  18. (1, 2, 'asddasdadasdasdasdasdasdasdds', 11),
  19. (2, 1, 'wswewew', 2),
  20. (3, 1, 'cxcxzczxcxz', 0),
  21. (4, 2, 'czcsadasqwsacaxc', 0);
  22.  
  23. -- --------------------------------------------------------
  24.  
  25. --
  26. -- Struktura tabeli dla `logs`
  27. --
  28.  
  29. CREATE TABLE IF NOT EXISTS `logs` (
  30. `lid` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  31. `ip` varchar(50) COLLATE utf8_polish_ci NOT NULL,
  32. `user-agent` text COLLATE utf8_polish_ci NOT NULL,
  33. `time` bigint(30) NOT NULL,
  34. PRIMARY KEY (`lid`)
  35. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=1 ;
  36.  
  37. --
  38. -- Zrzut danych tabeli `logs`
  39. --
  40.  
  41.  
  42. -- --------------------------------------------------------
  43.  
  44. --
  45. -- Struktura tabeli dla `questions`
  46. --
  47.  
  48. CREATE TABLE IF NOT EXISTS `questions` (
  49. `qid` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  50. `question` text COLLATE utf8_polish_ci NOT NULL,
  51. `status` int(1) NOT NULL DEFAULT '0',
  52. `votes` int(10) NOT NULL DEFAULT '0',
  53. PRIMARY KEY (`qid`)
  54. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=11 ;
  55.  
  56. --
  57. -- Zrzut danych tabeli `questions`
  58. --
  59.  
  60. INSERT INTO `questions` (`qid`, `question`, `status`, `votes`) VALUES
  61. (1, 'sgfsdfgdfgsdf', 0, 16),
  62. (2, 'dfgdgfdgdfgdf', 0, 18);
wookieb
Ale żeś nazmieniał. Łooo
W dodatku liczenie procentów nadal nie zrobiłeś w funkcji? why?
nospor
no ale miales zamienic procenty na funkcje. nie umiesz do funkcji jako parametr przekazac tablicy na ktorej generujesz te procenty?
julek12
no nie za bardzo :|

spróbuje dojść:P
wookieb
Więc wracamy do żłobka.. http://pl.php.net/manual/pl/functions.arguments.php
julek12
wyszło (chyba) nie korzystałem z manuala tylko sam:
  1. <?php
  2. try
  3. {
  4. $pdo = new PDO('mysql:host=localhost;dbname=xxxx', 'xxx', 'xxxx', array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));
  5. $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  6.  
  7. function percent($data)
  8. {
  9. foreach($data as $answer)
  10. {
  11. $percent = round(($answer['vote'] / $answer['votes']) * 100);
  12. echo '<li>'.$answer['answer'].'<br />
  13. głosów: '.$answer['vote'].', '.$percent.'%<br />
  14. <div style="border: 1px solid rgb(158, 152, 131); background: rgb(74, 8, 5); height: 10px; width: '.$percent.'%;"></div></li>';
  15. }
  16. }
  17.  
  18. function showPoll()
  19. {
  20. global $pdo;
  21.  
  22. // Losowanie rekordu
  23. $sql = $pdo->query('SELECT `qid` FROM `questions` WHERE `status` = 0 ORDER BY RAND() LIMIT 1');
  24. $row = $sql->fetch();
  25.  
  26. $sql = $pdo->prepare('SELECT * FROM `questions` q JOIN `answers` a USING(qid) WHERE a.`qid` = :qid'); //SELECT
  27.  
  28. if (!empty($_POST))
  29. {
  30. $stmt = $pdo->prepare('UPDATE `questions` q JOIN `answers` a USING(qid) SET q.`votes` = q.`votes` + 1, a.`vote` = a.`vote` + 1 WHERE q.`qid` = :qid AND a.`aid` = :aid'); //UPDATE
  31. $stmt->bindValue(':qid', $_POST['qid'], PDO::PARAM_INT); //UPDATE
  32. $stmt->bindValue(':aid', $_POST['answer'], PDO::PARAM_INT); //UPDATE
  33. $stmt->execute(); //UPDATE
  34.  
  35. $sql->bindValue(':qid', $_POST['qid'], PDO::PARAM_INT); //SELECT
  36. $sql->execute(); //SELECT
  37. $data = $sql->fetchAll();
  38. $question = $data[0];
  39.  
  40. echo '<ul><div style="max-width: 120px;">
  41. <li class="first"><b>'.$question['question'].'
  42. <br />Głos został oddany!</li>'.percent($data);
  43. }
  44. else
  45. {
  46. $sql->bindValue(':qid', $row['qid'], PDO::PARAM_INT);
  47. $sql->execute();
  48. $data = $sql->fetchAll();
  49. $question = $data[0];
  50.  
  51. echo '<ul><div style="max-width: 120px;">
  52. <li class="first"><b>'.$question['question'];
  53.  
  54. if (2==3)
  55. {
  56. echo '<br />Głosowałeś już!</li>'.percent($data);
  57. $sql->closeCursor();
  58. }
  59. else
  60. {
  61. echo '</li><form id="poll" method="post" action="">';
  62. foreach($data as $answer)
  63. {
  64. echo '<li><input type="radio" name="answer" value='.$answer['aid'].' /> '.$answer['answer'].'</li>';
  65. }
  66. $sql->closeCursor();
  67. echo '<li><input type="text" name="qid" value='.$row['qid'].' style="display: none;" /><div align="center"><input class="button" type="submit" value="Oddaj głos!" /></div></li></form>';
  68. }
  69. }
  70. echo '</b></div></ul>';
  71. }
  72. echo showPoll();
  73. }
  74. catch(PDOException $e)
  75. {
  76. echo $e->getMessage();
  77. }
  78. ?>
nospor
czemu robisz wyniki funkcji traktujesz jako string i cos z nimi robisz, skoro zadna z twoich funkcji nic nie zwraca? Do zwracania sluzy return, a ty go nie uzywasz.
julek12
To co zamiast echo używać return czy co?
wookieb
Cytat(julek12 @ 24.08.2009, 09:41:57 ) *
wyszło (chyba) nie korzystałem z manuala tylko sam:

Naprawdę? To lepiej byś to nie robił sam.

Cytat(julek12 @ 24.08.2009, 09:51:42 ) *
To co zamiast echo używać return czy co?


Używać MANUALA!!!! http://pl.php.net/manual/pl/functions.returning-values.php
julek12
wiem do czego służy return ale nie wiem jak go użyć wstydnis.gif
wookieb
Cytat(julek12 @ 24.08.2009, 09:59:45 ) *
wiem do czego służy return ale nie wiem jak go użyć wstydnis.gif


A ja nie wiem jak wtłoczyć ci do głowy zasadniczą myśl. CZYTAĆ MANUAL!!!! W pierwszym przykładzie w linku, który ci podalem masz jak BYK pokazane jak się używa i to w dodatku z połączenie z ECHO (gdyby było print to pewnie byś się nie domyślił?)
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.