Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Zmiana zapytanie lub zmiana zmiennych
Forum PHP.pl > Forum > Przedszkole
dopal
Witam,

Mam tabelę ODDANIA, w niej jest ok 40 pól, przy tym co chcę zrobić interesuje mnie tylko 6. Baza nie jest moja, ja jedynie z niej korzystam dla usprawnienia pracy.
Poniżej jest kod, który działa przy takich założeniach jak są zrobione.
  1. $query="SELECT ODPLNR, ODDWNR, ODDNR1, ODDNKD, ODDNNR, ODDNDT FROM ODDANIA
  2. WHERE
  3. ODDNDT Between '20120101' And '20121231' AND ODDNKD ='E5' OR
  4. ODDNDT Between '20120101' And '20121231' AND ODDNKD ='EK' OR
  5. ODDNDT Between '20120101' And '20121231' AND ODDNKD ='EP'
  6. ";
  7. $result = odbc_exec($connect, $query) or die( odbc_error());
  8.  
  9. $element = array();
  10.  
  11. while($set=odbc_fetch_array($result)){
  12.  
  13. $ODDWNR = $set['ODDWNR'] ;
  14.  
  15.  
  16. if($set['ODDNR1']=='H'){
  17. $element[$ODDWNR] = 'H';
  18. }
  19. if($set['ODDNR1']=='R' && (!isset($element[$ODDWNR]) || $element[$ODDWNR]!='H')){
  20. $element[$ODDWNR] = 'R';
  21. }
  22. if($set['ODDNR1']=='P' && (!isset($element[$ODDWNR]) || $element[$ODDWNR]!='H' && $element[$ODDWNR]!='R')){
  23. $element[$ODDWNR] = 'P';
  24. }
  25. if($set['ODDNR1']=='A' && (!isset($element[$ODDWNR] )|| $element[$ODDWNR]!='H' && $element[$ODDWNR]!='R' && $element[$ODDWNR]!='P')){
  26. $element[$ODDWNR] = 'A';
  27. }
  28. if($set['ODDNR1']=='B' && (!isset($element[$ODDWNR] )|| $element[$ODDWNR]!='H' && $element[$ODDWNR]!='R' && $element[$ODDWNR]!='P' && $element[$ODDWNR]!='A')){
  29. $element[$ODDWNR] = 'B';
  30. }
  31. $tab_h=array();
  32. $tab_r=array();
  33. $tab_p=array();
  34. $tab_a=array();
  35. $tab_b=array();
  36.  
  37. foreach ($element as $el => $atr){
  38. if ($atr=='H') {
  39. $tab_h[] =$el;}
  40. if ($atr=='R') {
  41. $tab_r[] =$el;}
  42. if ($atr=='P') {
  43. $tab_p[] =$el;}
  44. if ($atr=='A') {
  45. $tab_a[] =$el;}
  46. if ($atr=='B') {
  47. $tab_b[] =$el;}
  48. }}
  49.  
  50. echo 'Atrybut h: '.count($tab_h).'<br />';
  51. echo 'Atrybut r: '.count($tab_r).'<br />';
  52. echo 'Atrybut p: '.count($tab_p).'<br />';
  53. echo 'Atrybut a: '.count($tab_a).'<br />';
  54. echo 'Atrybut b: '. count($tab_b).'<br />';

Myślałem ze unikatowym polem jest ODDWNR, więc przy takim założeniu wszystko działa prawidłowo i otrzymywałem ok 16 tys. wyników. Jednak okazało się że połączenie unikatowe to połączenie ODPLNR, ODDWNR. To stanowi dopiero unikalny numer czyli np. ODPLNR=1234 ODDWNR=98765 czyli całością powinno być 123498765 i powinienem uzyskać ponad 20 tys. wyników

Próbowałem zrobić to tak
  1. $query="SELECT CONCAT(ODPLNR, ODDWNR) as numer, ODDNR1, ODDNKD, ODDNNR, ODDNDT FROM ODDANIA
  2. WHERE
  3. ODDNDT Between '20120101' And '20121231' AND ODDNKD ='E5' OR
  4. ODDNDT Between '20120101' And '20121231' AND ODDNKD ='EK' OR
  5. ODDNDT Between '20120101' And '20121231' AND ODDNKD ='EP'
  6. ";
  7. $result = odbc_exec($connect, $query) or die( odbc_error());
  8.  
  9. $element = array();
  10.  
  11. while($set=odbc_fetch_array($result)){
  12.  
  13. $ODDWNR = $set['numer'] ;
  14. //dalsza część kodu bez zmian

Przy takim zapisie w wynikach otrzymuję:
Atrybut h: 1
Atrybut r: 0
Atrybut p: 0
Atrybut a: 0
Atrybut b: 0
co oczywiście nie jest oprawdą.

Dalej próbowałem tak:
  1. $query="SELECT ODPLNR, ODDWNR, ODDNR1, ODDNKD,ODDNNR, ODDNDT FROM ODDANIA
  2. WHERE
  3. ODDNDT Between '20120101' And '20121231' AND ODDNKD ='E5' OR
  4. ODDNDT Between '20120101' And '20121231' AND ODDNKD ='EK' OR
  5. ODDNDT Between '20120101' And '20121231' AND ODDNKD ='EP'
  6. ";
  7. $result = odbc_exec($connect, $query) or die( odbc_error());
  8.  
  9.  
  10. $element = array();
  11.  
  12. while($set=odbc_fetch_array($result)){
  13.  
  14. $ODDWNR = $set['ODDWNR'] ;
  15. $ODPLNR = $set['ODPLNR'];
  16.  
  17. if($set['ODDNR1']=='H'){
  18. $element[$ODDWNR && $ODPLNR] = 'H';
  19.  
  20. } //dalsza cześć analogicznie przerobiona
  21.  
  22. //lub taki sposób
  23. while($set=odbc_fetch_array($result)){
  24.  
  25. $numer1 = $set['ODDWNR'] ;
  26. $numer2 = $set['ODPLNR'];
  27.  
  28. $ODDWNR=$numer1 && $numer2;
  29.  
  30. if($set['ODDNR1']=='H'){
  31. $element[$ODDWNR] = 'H';
  32.  
  33. }
  34. //lub tak
  35. while($set=odbc_fetch_array($result)){
  36.  
  37. $ODDWNR = $set['ODDWNR'] && $set['ODPLNR'];
  38.  
  39. if($set['ODDNR1']=='H'){
  40. $element[$ODDWNR] = 'H';


I przy takich próbach zawsze było w wynikach
Atrybut h: 1
Atrybut r: 0
Atrybut p: 0
Atrybut a: 0
Atrybut b: 0

Gdzie może tkwić problem?
nospor
Pierwsza wersja Twojego kodu z CONCAT(ODPLNR, ODDWNR) as numer wydaje się być jak najbardziej poprawna.

Czekaj, już wiem gdzie jest błąd. Jeśli kolumny, który łączysz, są INTem, to musisz wpierw zrzutorwać je na tekst. Przykład masz podany w manualu:
Kod
CONCAT(CAST(int_col AS CHAR), char_col)

smile.gif

A na przyszłośc sprawdzaj jakie dane dostajesz, to od razu by było widać w czym problem...
print_r($set);
i wszystko jest jak na dłoni.
dopal
Niestety kolumny, które łącze nie są INTem.

Przy uzyciu tego kodu ( tak jak pisałeś, że wydaje się najbardziej poprawna )
  1. $query="SELECT CONCAT(ODPLNR, ODDWNR) as numer, ODDNR1, ODDNKD, ODDNNR, ODDNDT FROM ODDANIA
  2. WHERE
  3. ODDNDT Between '20120101' And '20121231' AND ODDNKD ='E5' OR
  4. ODDNDT Between '20120101' And '20121231' AND ODDNKD ='EK' OR
  5. ODDNDT Between '20120101' And '20121231' AND ODDNKD ='EP'
  6. ";
  7. $result = odbc_exec($connect, $query) or die( odbc_error());
  8.  
  9.  
  10. $element = array();
  11.  
  12. while($set=odbc_fetch_array($result)){
  13.  
  14. $ODDWNR = $set['numer'] ;
  15.  
  16.  
  17.  
  18. if($set['ODDNR1']=='H'){
  19. $element[$ODDWNR] = 'H';
  20.  
  21. }
  22.  
  23.  
  24. if($set['ODDNR1']=='R' && (!isset($element[$ODDWNR]) || $element[$ODDWNR]!='H')){
  25.  
  26. $element[$ODDWNR] = 'R';
  27.  
  28. }
  29.  
  30. if($set['ODDNR1']=='P' && (!isset($element[$ODDWNR]) || $element[$ODDWNR]!='H' && $element[$ODDWNR]!='R')){
  31.  
  32. $element[$ODDWNR] = 'P';
  33.  
  34. }
  35.  
  36. if($set['ODDNR1']=='A' && (!isset($element[$ODDWNR] )|| $element[$ODDWNR]!='H' && $element[$ODDWNR]!='R' && $element[$ODDWNR]!='P')){
  37.  
  38. $element[$ODDWNR] = 'A';
  39.  
  40. }
  41. if($set['ODDNR1']=='B' && (!isset($element[$ODDWNR] )|| $element[$ODDWNR]!='H' && $element[$ODDWNR]!='R' && $element[$ODDWNR]!='P' && $element[$ODDWNR]!='A')){
  42.  
  43. $element[$ODDWNR] = 'B';
  44.  
  45. }
  46.  
  47. $tab_h=array();
  48. $tab_r=array();
  49. $tab_p=array();
  50. $tab_a=array();
  51. $tab_b=array();
  52.  
  53. foreach ($element as $el => $atr){
  54. if ($atr=='H') {
  55. $tab_h[] =$el;}
  56.  
  57. if ($atr=='R') {
  58. $tab_r[] =$el;}
  59.  
  60. if ($atr=='P') {
  61. $tab_p[] =$el;}
  62.  
  63. if ($atr=='A') {
  64. $tab_a[] =$el;}
  65.  
  66.  
  67. if ($atr=='B') {
  68. $tab_b[] =$el;}
  69. }
  70.  
  71. print_r($set);
  72.  
  73. }
  74.  
  75. echo '<br/>';
  76. echo 'Atrybut h: '.count($tab_h).'<br />';
  77. echo 'Atrybut r: '.count($tab_r).'<br />';
  78. echo 'Atrybut p: '.count($tab_p).'<br />';
  79. echo 'Atrybut a: '.count($tab_a).'<br />';
  80. echo 'Atrybut b: '. count($tab_b).'<br />';


print_r($set) daje mi wyniki, natomiast nie są one sumowane, dlaczego tak może być?
nospor
pokaz mi kilka pzykladowych wynikow prinr_r.... czy prawie zawsze trzeba o to prosic?
dopal
Już się robi.
Array ( [NUMER] => 140021080 [ODDNR1] => H [ODDNKD] => EK [ODDNNR] => 12225395 [ODDNDT] => 20120102 ) Array ( [NUMER] => 140001019 [ODDNR1] => H [ODDNKD] => EK [ODDNNR] => 12225396 [ODDNDT] => 20120102 ) Array ( [NUMER] => 1400032084 [ODDNR1] => H [ODDNKD] => EK [ODDNNR] => 12225397 [ODDNDT] => 20120102 ) Array ( [NUMER] => 1400023367 [ODDNR1] => H [ODDNKD] => EK [ODDNNR] => 12225398 [ODDNDT] => 20120102 ) Array ( [NUMER] => 140003054 [ODDNR1] => H [ODDNKD] => EK [ODDNNR] => 12225399 [ODDNDT] => 20120102 ) Array ( [NUMER] => 1400029358 [ODDNR1] => H [ODDNKD] => EK [ODDNNR] => 12225400 [ODDNDT] => 20120102 ) Array ( [NUMER] => 1400041331 [ODDNR1] => H [ODDNKD] => EK [ODDNNR] => 12225401 [ODDNDT] => 20120102 ) Array ( [NUMER] => 1400041415 [ODDNR1] => H [ODDNKD] => EK [ODDNNR] => 12225402 [ODDNDT] => 20120102 ) Array ( [NUMER] => 140001685 [ODDNR1] => H [ODDNKD] => E5 [ODDNNR] => 12225403 [ODDNDT] => 20120102 ) Array ( [NUMER] => 1400039472 [ODDNR1] => H [ODDNKD] => EK [ODDNNR] => 12225404 [ODDNDT] => 20120102 ) Array ( [NUMER] => 1400042832 [ODDNR1] => H [ODDNKD] => EK [ODDNNR] => 12225405 [ODDNDT] => 20120102 ) Array ( [NUMER] => 1400042833 [ODDNR1] => H [ODDNKD] => EK [ODDNNR] => 12225406 [ODDNDT] => 20120102 ) Array ( [NUMER] => 14000101 [ODDNR1] => H [ODDNKD] => EK [ODDNNR] => 12225407 [ODDNDT] => 20120102 ) Array ( [NUMER] => 50013218 [ODDNR1] => H [ODDNKD] => EK [ODDNNR] => 12225408 [ODDNDT] => 20120102 ) Array ( [NUMER] => 1400032549 [ODDNR1] => H [ODDNKD] => EK [ODDNNR] => 12225409 [ODDNDT] => 20120102 ) Array ( [NUMER] => 1400037169 [ODDNR1] => H [ODDNKD] => EK [ODDNNR] => 12225410 [ODDNDT] => 20120103 ) Array ( [NUMER] => 1400034713 [ODDNR1] => H [ODDNKD] => EK [ODDNNR] => 12225411 [ODDNDT] => 20120103 ) Array ( [NUMER] => 140001751 [ODDNR1] => H [ODDNKD] => E5 [ODDNNR] => 12225412 [ODDNDT] => 20120103 ) Array ( [NUMER] => 140016252 [ODDNR1] => H [ODDNKD] => EP [ODDNNR] => 12225413 [ODDNDT] => 20120103 ) Array ( [NUMER] => 1400033018 [ODDNR1] => H [ODDNKD] => EK [ODDNNR] => 12225414 [ODDNDT] => 20120103 ) Array ( [NUMER] => 1400024769 [ODDNR1] => H [ODDNKD] => EK [ODDNNR] => 12225415 [ODDNDT] => 20120103 ) Array ( [NUMER] => 140007534 [ODDNR1] => H [ODDNKD] => EK [ODDNNR] => 12225416 [ODDNDT] => 20120103 ) Array ( [NUMER] => 1400028990 [ODDNR1] => H [ODDNKD] => E5 [ODDNNR] => 12225417 [ODDNDT] => 20120103 ) Array ( [NUMER] => 1400110564 [ODDNR1] => H [ODDNKD] => EK [ODDNNR] => 12225418 [ODDNDT] => 20120103 ) Array ( [NUMER] => 500022372 [ODDNR1] => H [ODDNKD] => EK [ODDNNR] => 12225419 [ODDNDT] => 20120104 ) Array ( [NUMER] => 1400028983 [ODDNR1] => H [ODDNKD] => EK [ODDNNR] => 12225420 [ODDNDT] => 20120104 ) Array ( [NUMER] => 1400034378 [ODDNR1] => H [ODDNKD] => EK [ODDNNR] => 12225421 [ODDNDT] => 20120104 ) Array ( [NUMER] => 1400016661 [ODDNR1] => H [ODDNKD] => EK [ODDNNR] => 12225422 [ODDNDT] => 20120104 )
nospor
Widać wyrażnie, że masz NUMER a ty w kodzie php odwołujesz się do numer. To są dwa różne teksty.

czyli nie: $ODDWNR = $set['numer'] ;
a: $ODDWNR = $set['NUMER'] ;
Michasko
dopal: tak na przyszłość, będzie CI łatwiej znaleźć jakieś nieprawidłowości w tablicy ( Twój $set ), jeśli jej wyswietlanie zawrzesz w tagach <pre> :
  1. echo '<pre>';
  2. print_r($set);
  3. echo '</pre>';
Potem jak to skopiujesz, to wklejając na forum opatrz tagami [ code ] :)
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.