Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Czystość kodu
Forum PHP.pl > Forum > Przedszkole
Wertas
Witam. Z góry chcę podkreślić, że jestem słaby w pisaniu dobrego i czystego kodu ponieważ, powtarzam go na okrągło. Temu chciałbym aby ktoś pokazał mi jak można to zrobić, dużo przy tym się nauczę wejdzie mi to w nawyk.

Teraz przejdźmy do rzeczy.

Oto SQL bazy danych

  1. CREATE TABLE `items` (
  2. `id` int(10) NOT NULL AUTO_INCREMENT,
  3. `Strength` int(11) NOT NULL,
  4. `Dexterity` int(11) NOT NULL,
  5. `Intelligence` int(11) NOT NULL,
  6. `Vitality` int(11) NOT NULL,
  7. `Lok` int(11) NOT NULL,
  8. `Lph` int(11) NOT NULL,
  9. `Lphg` int(11) NOT NULL,
  10. `Lifesteal` int(11) NOT NULL,
  11. `Additional Life` int(11) NOT NULL,
  12. `Lps` int(11) NOT NULL,
  13. `IArcane` int(11) NOT NULL,
  14. `ICold` int(11) NOT NULL,
  15. `IFire` int(11) NOT NULL,
  16. `IHoly` int(11) NOT NULL,
  17. `ILightning` int(11) NOT NULL,
  18. `IPoison` int(11) NOT NULL,
  19. `IWeapon` int(11) NOT NULL,
  20. `AttackSpeed` int(11) NOT NULL,
  21. `Increased Minimum Damage` int(11) NOT NULL,
  22. `Increased Maximum Damage` int(11) NOT NULL,
  23. `CHD` int(11) NOT NULL,
  24. `Wd` int(11) NOT NULL,
  25. `Chc` int(11) NOT NULL,
  26. `Bdmgvsel` int(11) NOT NULL,
  27. `CBlind` int(11) NOT NULL,
  28. `CChill` int(11) NOT NULL,
  29. `CFear` int(11) NOT NULL,
  30. ...... itd
  31. UNIQUE KEY `id` (`id`),
  32. KEY `id_2` (`id`)
  33. ) ENGINE=InnoDB DEFAULT CHARSET=latin1;


Ogólnie skrypt jest przeznaczony do wpisywania wartości w te pola by ludzie mogli zobaczyć co możemy zaoferować.

Tutaj jest przykład mojej bezmyślności i niedołęstwa

1)Fragment kodu


  1. if($_REQUEST['do'] == 'list')
  2. {
  3. echo '<table border="1"><thead>
  4. <th>id</th>
  5. <th>Strength</th>
  6. <th>Dexterity</th>
  7. <th>Intelligence</th>
  8. <th>Vitality</th>
  9. <th>Lok</th>
  10. <th>Lph</th>
  11. <th>Lphg</th>
  12. <th>Lifesteal</th>
  13. <th>Additional Life</th>
  14. <th>Lps</th>
  15. <th>IArcane</th>
  16. <th>ICold</th>
  17. <th>IFire</th>
  18. <th>IHoly</th>
  19. <th>ILightning</th>
  20. <th>IPoison</th>
  21. <th>IWeapon</th>
  22. <th>AttackSpeed</th>
  23. <th>Increased Minimum Damage</th>
  24. <th>Increased Maximum Damage</th>
  25. <th>CHD</th>
  26. <th>Wd</th>
  27. <th>Chc</th>
  28. <th>Bdmgvsel</th>
  29. <th>CBlind</th>
  30. <th>CChill</th>
  31. <th>CFear</th>
  32. <th>CFreeze</th>
  33. <th>CImmobilize</th>
  34. <th>CKnockback</th>
  35. <th>CSlow</th>
  36. <th>CStun</th>
  37. <th>Ctbleed</th>
  38. <th>Bleeddmg</th>
  39. <th>Gf</th>
  40. <th>Mf</th>
  41. <th>Exp</th>
  42. <th>Indestructible</th>
  43. <th>Movement Speed</th>
  44. <th>Yardspick</th>
  45. <th>Reduced Level Requirement</th>
  46. <th>Sock1</th>
  47. <th>Sock2</th>
  48. <th>Sock3</th>
  49. <th>Resistance All</th>
  50. <th>RArcane</th>
  51. <th>RCold</th>
  52. <th>RFire</th>
  53. <th>RHoly</th>
  54. <th>RLightning</th>
  55. <th>RPhysical</th>
  56. <th>RPoison</th>
  57. <th>Increased Armor</th>
  58. <th>CCred</th>
  59. <th>Meleeatd</th>
  60. <th>Reduced Damagefeli</th>
  61. <th>Chance to blockomshield</th>
  62. <th>Chance to blockomattr</th>
  63. <th>Block Amount</th>
  64. <th>Type</th>
  65. <th>Price</th>
  66. <th>Seller</th>
  67. </thead>';
  68. WHILE ($row = mysql_fetch_array($result)){
  69. echo '
  70. <tr><td>'.$row['id'].'</td>
  71. <td>'.$row['Strength'].'</td>
  72. <td>'.$row['Dexterity'].'</td>
  73. <td>'.$row['Intelligence'].'</td>
  74. <td>'.$row['Vitality'].'</td>
  75. <td>'.$row['Lok'].'</td>
  76. <td>'.$row['Lph'].'</td>
  77. <td>'.$row['Lphg'].'</td>
  78. <td>'.$row['Lifesteal'].'</td>
  79. <td>'.$row['Additional Life'].'</td>
  80. <td>'.$row['Lps'].'</td>
  81. <td>'.$row['IArcane'].'</td>
  82. <td>'.$row['ICold'].'</td>
  83. <td>'.$row['IFire'].'</td>
  84. <td>'.$row['IHoly'].'</td>
  85. <td>'.$row['ILightning'].'</td>
  86. <td>'.$row['IPoison'].'</td>
  87. <td>'.$row['IWeapon'].'</td>
  88. <td>'.$row['AttackSpeed'].'</td>
  89. <td>'.$row['Increased Minimum Damage'].'</td>
  90. <td>'.$row['Increased Maximum Damage'].'</td>
  91. <td>'.$row['CHD'].'</td>
  92. <td>'.$row['Wd'].'</td>
  93. <td>'.$row['Chc'].'</td>
  94. <td>'.$row['Bdmgvsel'].'</td>
  95. <td>'.$row['CBlind'].'</td>
  96. <td>'.$row['CChill'].'</td>
  97. <td>'.$row['CFear'].'</td>
  98. .... itd do każdego ze schematu SQL
  99. </tr>';
  100. }
  101. echo '</table>';
  102. }


Jak to w ogóle wygląda? Czy macie jakiś pomysł jak bardzo to skrócić?

Nie wiem czy jest szansa stworzenia jakiegoś PDO czy czegoś tam w celu wywoływania tego samego "małego" kodu na innych podstrona gdyż chcę zrobić do tego opcję edytowania,usuwania więc kod zajął by kilka linijek.....

Kod jest taki obszerny i beznadziejny, że nie ma miejsca na wklejenie go.


2)Fragment kodu


  1. echo '<table cellpadding="0" cellspacing="0" border="0" class="display" id="example">
  2. <thead>
  3. <tr align="center">
  4. <th>Item Number</th>
  5. <th>Item Name</th>
  6. <th>Stats</th>
  7. <th>Socketed</th>
  8. <th>Price</th>
  9. <th>Seller</th>
  10. <th>Status</th>
  11. </tr>
  12. </thead>
  13. <tbody>';
  14. while($row = mysql_fetch_array($result))
  15. {
  16. if ($row['Strength'] == '0') { echo '';} else { $dataStrength ='<li class=d3-color-blue><p style="color:#6969FF;"><span class=value>+ '.$row['Strength'].'</span> Strength</p></li>'; }
  17. if ($row['Dexterity'] == '0') { echo '';} else { $dataDexterity = '<li class=d3-color-blue><p style="color:#6969FF;"><span class=value>+ '.$row['Dexterity'].'</span> Dexterity</p></li>'; }
  18. ..............


I tak dalej do każdego pola ze schematu SQL

a potem wywołane to jest

  1. $attributedump = '
  2. '.@$dataStrength.' '.@$dataDexterity.' '.@$dataIntelligence.' '.@$dataVitality.' '.@$dataRArcane.'
  3. '.@$dataLok.' '.@$dataLph.' '.@$dataLphg.' '.@$dataLifesteal.' '.@$dataAdditional.'
  4. '.@$dataLps.' '.@$dataICold.' '.@$dataIFire.' '.@$dataIHoly.' '.@$dataIPoison.' '.@$dataIWeapon.'
  5. '.@$dataAttackSpeed.' '.@$dataIncreasedMinimumDamage.' '.@$dataIncreasedMaximumDamage.'
  6. '.@$dataCHD.' '.@$dataWd.' '.@$dataChc.' '.@$dataBdmgvsel.' '.@$dataCBlind.' '.@$dataCChill.'
  7. '.@$dataCFear.' '.@$dataCFreeze.' '.@$dataCImmobilize.' '.@$dataCKnockback.' '.@$dataCSlow.'
  8. '.@$dataCStun.' '.@$dataCtbleed.' '.@$dataBleeddmg.' '.@$dataGf.' '.@$dataMf.' '.@$dataExp.'
  9. '.@$dataIndestructible.' '.@$dataMovementSpeed.' '.@$dataYardspick.' '.@$dataReducedLevelRequirement.'
  10. '.@$dataSock1.' '.@$dataSock2.' '.@$dataSock3.' '.@$dataResistanceAll.' '.@$dataRCold.' '.@$dataRFire.'
  11. '.@$dataRHoly.' '.@$dataRLightning.' '.@$dataRPhysical.' '.@$dataRPoison.' '.@$dataIncreasedArmor.'
  12. '.@$dataCCred.' '.@$dataMeleeatd.' '.@$dataReducedDamagefeli.' '.@$dataChancetoblockomshield.'
  13. '.@$dataChancetoblockomattr.' '.@$dataBlockAmount.'
  14. ';


Jestem pewien że nie jeden spadł z krzesła smile.gif no ale działa.

Ma to na celu sprawdzenie, że jeżeli jest podana wartość w SQL np. dla pola Strength = 0 to nie pokaże tego pola w $attributedump

Jest to na prawdę bardzo patologicznie pokazane wszystko lecz jestem pewien, że jest to żenada, proszę o pomoc.

Chętnie nauczę się operacji na takich dużych zmiennych itd. Proszę o podpowiedzi.
redeemer
Na początek to zrób sobie jakiś konfig, coś w stylu:
  1. $fieldsConfig = array(
  2. ...
  3. 'Vitality' => 'Vitality',
  4. 'RArcane' => 'Arcane Resistance',
  5. ...
  6. );

Do tego pętla foreach i sprawa załatwiona.
peter13135
1. Aby oddzielić php od htmla, użyj systemu szablonów - smarty albo twig (te polecam bo z tych miałem okazję korzystać).
2. Nie mam pojęcia w jakim celu używasz te małpy, w każdym razie ich używanie jest niezalecane. Błędy należy poprawiać, a nie ukrywać i udawać, że ich nie ma.


  1. <tr><td>'.$row['id'].'</td>
  2.  
  3. <td>'.$row['Strength'].'</td>
  4.  
  5. <td>'.$row['Dexterity'].'</td>
  6.  
  7. <td>'.$row['Intelligence'].'</td>
  8.  
  9. <td>'.$row['Vitality'].'</td>
  10.  
  11. <td>'.$row['Lok'].'</td> (...)


To możesz zastąpić pętlą, ale chyba zwykle się tego tak nie robi.
  1. foreach($row as $field)
  2. {
  3. echo '<td>' .$field . '</td>';
  4. }

Widzę, że w wielu miejscach masz taki sam znacznik style="color:#6969FF;" i podobne. Użyj do tego klasy.

Poza tym, jednoznacznie trudno wskazać, jak ten kod trzeba skrócić. Jeśli masz wiele pól i każde pole ma jakieś różne "reguły" to trzeb je wzystkie uwzględnić.

Na pewno dużo czytelniej będą one wyglądać w systemie szablonów.
Wertas
@Peter zobacz kod cały.Jeden i drugi.

http://pastebin.com/tsT95LCU
http://pastebin.com/PUdEzyH9

Tu nic nie ma skomplikowanego i nie będzie. Tylko jest tego za dużo sad.gif niby działa wszystko ale mi się nie podoba tak pisać. ;( Wpaja mi to złe nawyki

Większość może być znacznie skrócona bo np taki kod

  1. if ($row['RCold'] == '0') { echo '';} else { $dataRCold ='<li class=d3-color-blue><p style="color:#6969FF;"><span class=value>+ '.$row['RCold'].'</span> Cold Resist</p></li>'; }


sprawdza czy coś jest w bazie jak jest 0 to nic nie da a jak będzie to znaczki @$dataRCold pokaże jego wartość a to @ dla zabezpieczenia jak by pole 0 przeszło sam nie wiem..

Ale jestem pewien że to można skrócić do 3-10 linijek nie 50
CuteOne
Mogę cię uspokoić kod nie jest tragiczny a ilość kolumn wynika z ilości danych.. nie raz pisałem większe potworki smile.gif

ps. http://phpdao.com/ poczytaj, zobacz na necie przykłady i oceń czy się nada

EDIT do tego co napisałeś o if(){}else{}

  1. $str .= (!empty($row['xxx'])) ? $row['xxx'];


EDIT2:
używaj funkcji w miejscach powtórzeń kodu !

  1.  
  2. function showCell($row, $description) {
  3.  
  4. return '<li class="d3-color-blue"><p style="color:#6969FF;"><span class="value">+ '.$row.'</span>'.$description.'</p></li>';
  5. }
  6.  
  7.  
  8. while() {
  9.  
  10. ...
  11. $str .= showCell($row['RCold'], 'Cold');
  12. ...
  13. }
peter13135
@ przed niczym nie zabezpiecza i nie mam nadal pojęcia po co on tam jest.
Wertas
A co z tym

  1. $attributedump = '
  2. '.@$dataStrength.' '.@$dataDexterity.' '.@$dataIntelligence.' '.@$dataVitality.' '.@$dataRArcane.'
  3. '.@$dataLok.' '.@$dataLph.' '.@$dataLphg.' '.@$dataLifesteal.' '.@$dataAdditional.'
  4. '.@$dataLps.' '.@$dataICold.' '.@$dataIFire.' '.@$dataIHoly.' '.@$dataIPoison.' '.@$dataIWeapon.'
  5. '.@$dataAttackSpeed.' '.@$dataIncreasedMinimumDamage.' '.@$dataIncreasedMaximumDamage.'
  6. '.@$dataCHD.' '.@$dataWd.' '.@$dataChc.' '.@$dataBdmgvsel.' '.@$dataCBlind.' '.@$dataCChill.'
  7. '.@$dataCFear.' '.@$dataCFreeze.' '.@$dataCImmobilize.' '.@$dataCKnockback.' '.@$dataCSlow.'
  8. '.@$dataCStun.' '.@$dataCtbleed.' '.@$dataBleeddmg.' '.@$dataGf.' '.@$dataMf.' '.@$dataExp.'
  9. '.@$dataIndestructible.' '.@$dataMovementSpeed.' '.@$dataYardspick.' '.@$dataReducedLevelRequirement.'
  10. '.@$dataSock1.' '.@$dataSock2.' '.@$dataSock3.' '.@$dataResistanceAll.' '.@$dataRCold.' '.@$dataRFire.'
  11. '.@$dataRHoly.' '.@$dataRLightning.' '.@$dataRPhysical.' '.@$dataRPoison.' '.@$dataIncreasedArmor.'
  12. '.@$dataCCred.' '.@$dataMeleeatd.' '.@$dataReducedDamagefeli.' '.@$dataChancetoblockomshield.'
  13. '.@$dataChancetoblockomattr.' '.@$dataBlockAmount.'
  14. ';


Jest coś innego możliwego do zrobienia z tym?
sobol6803
Cytat(Wertas @ 15.07.2012, 22:42:55 ) *
A co z tym

  1. $attributedump = '
  2. '.@$dataStrength.' '.@$dataDexterity.' '.@$dataIntelligence.' '.@$dataVitality.' '.@$dataRArcane.'
  3. '.@$dataLok.' '.@$dataLph.' '.@$dataLphg.' '.@$dataLifesteal.' '.@$dataAdditional.'
  4. '.@$dataLps.' '.@$dataICold.' '.@$dataIFire.' '.@$dataIHoly.' '.@$dataIPoison.' '.@$dataIWeapon.'
  5. '.@$dataAttackSpeed.' '.@$dataIncreasedMinimumDamage.' '.@$dataIncreasedMaximumDamage.'
  6. '.@$dataCHD.' '.@$dataWd.' '.@$dataChc.' '.@$dataBdmgvsel.' '.@$dataCBlind.' '.@$dataCChill.'
  7. '.@$dataCFear.' '.@$dataCFreeze.' '.@$dataCImmobilize.' '.@$dataCKnockback.' '.@$dataCSlow.'
  8. '.@$dataCStun.' '.@$dataCtbleed.' '.@$dataBleeddmg.' '.@$dataGf.' '.@$dataMf.' '.@$dataExp.'
  9. '.@$dataIndestructible.' '.@$dataMovementSpeed.' '.@$dataYardspick.' '.@$dataReducedLevelRequirement.'
  10. '.@$dataSock1.' '.@$dataSock2.' '.@$dataSock3.' '.@$dataResistanceAll.' '.@$dataRCold.' '.@$dataRFire.'
  11. '.@$dataRHoly.' '.@$dataRLightning.' '.@$dataRPhysical.' '.@$dataRPoison.' '.@$dataIncreasedArmor.'
  12. '.@$dataCCred.' '.@$dataMeleeatd.' '.@$dataReducedDamagefeli.' '.@$dataChancetoblockomshield.'
  13. '.@$dataChancetoblockomattr.' '.@$dataBlockAmount.'
  14. ';


Jest coś innego możliwego do zrobienia z tym?


Chyba najlepiej zmiana na:
  1. $attributedump = "$dataStrength $dataDexterity $dataIntelligence $dataVitality"; //itp.
Mephistofeles
Nie lepiej. Lepiej takie dane trzymać w tablicy, wtedy łatwiej je ze sobą złączyć, ale najlepiej byłoby je oddzielić od PHP, bo z tego co widzę zmienne te zawierają kod HTML.
Wertas
Mogę poprosić o przykład?
CuteOne
W tym wypadku na nic mu z tablicy skoro ma wyświetlać mix HTML + dane z bazy. Wertas podałem ci odpowiedź - utwórz funkcję, która zwróci kod HTML i dopisze go do zmiennej.
  1. $name = array(
  2. 'crest' => 'Cold Resist',
  3. 'rrest' => 'Red Resist',
  4. ...
  5. );
  6.  
  7. function createCell($description, $value) {
  8.  
  9. return '<li class="d3-color-blue"><p style="color:#6969FF;"><span class="value">+ '.$value.'</span>'.$description.'</p></li>';
  10. }
  11.  
  12. function createRow($aRow, $aName) {
  13.  
  14. $html = '';
  15.  
  16. foreach($aRow as $key => $value) {
  17.  
  18. $html .= createCell($aName[$key], $value);
  19. }
  20.  
  21. return $html;
  22. }
  23.  
  24.  
  25. $str = '';
  26. while() {
  27.  
  28. $str .= crateRow($row);
  29. }
  30.  
  31. echo $str; // zamiast $attributedump = '';


Następnego gotowca już nie będzie.. więc pora zacząć myśleć i szukać pomocy w manualu.


ps. żeby nie było za łatwo zostawiłem parę błędów, które sam musisz odnaleźć i poprawić smile.gif
Wertas
Poradziłem sobie bez funkcji
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.