Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: AJAX a zapytania skorelowane/podzapytania - czy współpracują?
Forum PHP.pl > Forum > Przedszkole
x X x
Czy AJAX obsługuje podzapytania/zapytanie skorelowane?

Mam zapytanie, które jest poprawnie wyświetlane jako zapytanie SQL w PHPMyAdminie (XAMPP 1.8.3-2 dla OSX). Ale którego moja ajaxowa tabela w systemie nie potrafi wyświelić. Nie pojawiają się żadne dane, nawet nie pojawia się pusta tabela zadeklarowana w pliku. Zwykłe zapytania oczywiście działają poprawnie.
nospor
Cos ci sie pomieszalo..... mysql nie ma zadnego zwiazku z ajaxem
x X x
Hm no w systemie tworzy się pewna tabela, która ma x kolumn (zadeklarowanych przeze mnie) i 10 rekordów, na dole można klknąć na wybraną stronę z listy pobranych wyników. Za pomocą echo można pobrać rekordy do tej tabeli za pomocą indeksów kolumn wprost z bazy danych lub można też pobierać te indeksy wprost z zapytania sql. Mam takie zapytanie, które zawiera w sobie podzapytanie i left joina. Normalne, proste zapytanie (np. SELECT class_id FROM classes) można bez problemu w tej tabeli wyświelić. Mojego natomiast, mimo poprawności całego kodu (teoretycznie) nie można. Strona ładuje się około 10 sekund (tyle, ile wykonuje się zapytanie w PHPMyAdminie), ale w ekekcie nie otrzymuje żadnej tabeli. Stąd to pytanie. Czy to na pewno nie jest wina AJAXA?
nospor
Ja nie mowie, ze to nie jest wina ajaxa. Ja mowie, ze mysql z ajaxem nie ma zadnego zwiazku..... AJAX to żądanie http ino ze bez przeladowania strony.

Zobacz co zwraca ci AJAX, zastosuj sie do tego tematu:
Temat: Jak poprawnie zada pytanie
to moze bedzie cos wiadomo. Tak teraz nic nie wiadomo.
x X x
Plik controller.php:

  1. public function Show(){
  2. $q = "SELECT
  3. /*ps.pass_id,*/
  4. x.class_id,
  5. year_id,
  6. y_name, /*year*/
  7. subject_id,
  8. sb_name, /*subject*/
  9. employee_id,
  10. first_name, /*employee*/
  11. last_name, /*employee*/
  12. classestype_id,
  13. ct_name, /*classestype*/
  14. X.student_id,
  15. s_name, /*students*/
  16. sex, /*students*/
  17. ps.pass,
  18. ps.pass_date,
  19. ps.comments
  20. FROM
  21. (
  22. SELECT
  23. cl.class_id,
  24. y.year_id,
  25. y.name AS y_name, /*year*/
  26. sb.subject_id,
  27. sb.name AS sb_name, /*subject*/
  28. e.employee_id,
  29. first_name, /*employee*/
  30. last_name, /*employee*/
  31. ct.classestype_id,
  32. ct.name AS ct_name, /*classestype*/
  33. s.student_id,
  34. s.name AS s_name, /*students*/
  35. sex /*students*/
  36. FROM
  37. classes cl,
  38. years y,
  39. subjects sb,
  40. employees e,
  41. specialties sp,
  42. classestypes ct,
  43. students s
  44. WHERE cl.year_id=s.year_id
  45. AND cl.subject_id=sb.subject_id
  46. AND sb.specialty_id=sp.specialty_id
  47. AND s.specialty_id=sp.specialty_id /*sb.specialty_id*/
  48. AND cl.classestype_id=ct.classestype_id
  49. AND cl.employee_id=e.employee_id
  50. AND y.year_id=s.year_id
  51. ) X
  52. LEFT JOIN passes ps
  53. ON X.class_id=ps.class_id
  54. AND x.student_id=ps.student_id
  55. /*ORDER BY pass ASC*/
  56. WHERE x.employee_id=38
  57. /*WHERE x.class_id=78 OR x.class_id=79*/ /*Przemysław Pardel BSI (ćw. + wyk.) 6 ROK INŻ*/
  58. /*AND classestype_id=1*/";
  59.  
  60. $q2 = "select class_id from classes";
  61.  
  62. $Result = parent::getDB()->run($q);
  63. include('search_result.html');
  64. }


plik search_result.html (część):

  1. <?php foreach($Result as $Pass) : ?>
  2. <tr>
  3. <!-- pass_id -->
  4. <!--<td class="center-align tide"><?php echo $Pass['pass_id']; ?></td>-->
  5.  
  6. <!-- class_id -->
  7. <td name="class_id"><span id="class_id-<?php echo $Pass['pass_id']; ?>"><?php echo $Pass['class_id']; ?></span></td>
  8.  
  9. <!-- year_id -->
  10. <td name="year_id"><span id="year_id-<?php echo $Pass['pass_id']; ?>"><?php echo $Pass['year_id']; ?></span></td>
  11.  
  12. <!-- year_id -> name -->
  13. <td name="y_name"><span id="y_name-<?php echo $Pass['pass_id']; ?>"><?php echo $Pass['y_name']; ?></span></td>
  14.  
  15. <!-- subject_id -->
  16. <td name="subject_id"><span id="subject_id-<?php echo $Pass['pass_id']; ?>"><?php echo $Pass['subject_id']; ?></span></td>
  17.  
  18. <!-- subject_id -> name -->
  19. <td name="sb_name"><span id="sb_name-<?php echo $Pass['pass_id']; ?>"><?php echo $Pass['sb_name']; ?></span></td>
  20.  
  21. <!-- employee_id -->
  22. <td name="employee_id"><span id="employee_id-<?php echo $Pass['pass_id']; ?>"><?php echo $Pass['employee_id']; ?></span></td>
  23.  
  24. <!-- employee_id -> first_name -->
  25. <td name="e_f_name"><span id="e_f_name-<?php echo $Pass['pass_id']; ?>"><?php echo $Pass['e_f_name']; ?></span></td>
  26.  
  27. <!-- employee_id -> last_name -->
  28. <td name="e_l_name"><span id="e_l_name-<?php echo $Pass['pass_id']; ?>"><?php echo $Pass['e_l_name']; ?></span></td>
  29.  
  30. <!-- classestype_id -->
  31. <td name="classestype_id"><span id="classestype_id-<?php echo $Pass['pass_id']; ?>"><?php echo $Pass['classestype_id']; ?></span></td>
  32.  
  33. <!-- classestype_id -> name -->
  34. <td name="ct_name"><span id="ct_name-<?php echo $Pass['pass_id']; ?>"><?php echo $Pass['ct_name']; ?></span></td>
  35.  
  36. <!-- student_id -->
  37. <td name="student_id"><span id="student_id-<?php echo $Pass['pass_id']; ?>"><?php echo $Pass['student_id']; ?></span></td>
  38.  
  39. <!-- student_id -> name -->
  40. <td name="s_name"><span id="s_name-<?php echo $Pass['pass_id']; ?>"><?php echo $Pass['s_name']; ?></span></td>
  41.  
  42. <!-- student_id -> sex -->
  43. <td name="sex"><span id="sex-<?php echo $Pass['pass_id']; ?>"><?php echo $Pass['sex']; ?></span></td>
  44.  
  45. <!-- pass -->
  46. <td name="pass"><span id="pass-<?php echo $Pass['pass_id']; ?>" class="editable-select pass"><?php echo $Pass['pass']; ?></span></td>
  47.  
  48. <!-- date -->
  49. <td name="pass_date"><span id="pass_date-<?php echo $Pass['pass_id']; ?>" class="editable"><?php echo $Pass['pass_date']; ?></span></td>
  50.  
  51. <!-- comments -->
  52. <td name="comments"><span id="comments-<?php echo $Pass['pass_id']; ?>" class="editable"><?php echo $Pass['comments']; ?></span></td>
  53.  
  54. </tr>
  55. <?php endforeach; ?>


Powinienem otrzymywać podobną tabelę:

https://www.dropbox.com/s/vsba9upowyejfv6/Z...%2019.25.04.png

Otrzymuje natomiast:

https://www.dropbox.com/s/ds71h5w40jygbbe/Z...%2019.27.49.png

Po wywołaniu w osobnym pliku zapytania $q dostaję w wyniku treść tego zapytania, więc jest przekazywane.

Nie wiem, może w search result po prostu przekazuję złe dane?

Dodam jeszcze, że jeżeli chciał bym wywołać zapytanie $q2 i przenieść je do owej tabeli (oczywiście odpowiednio modyfikując) - pobierane dane zostają wyświetlone.

Zedytowałem obydwa pliki, ponieważ udało mi się w końcu dodać wyświetlanie rodzaju zajęć, wcześniej dublowało mi każdy przedmiot dla każdego studenta 9 razy (tyle jest rodzajów zajęć). Po prostu zapomniałem dodać połączenia...

Proszę o pomoc lub sugestie, bo jest to ostatni krok do tego abym skończył to robić... Myślę jeszcze, czy udało by się w jakiś magiczny sposób duplikować każdy rekord tak, aby każdy student miał z każdego przedmiotu np. 5 rekordów (czyt. 5 ocen)(zakładając, że na początku tabela passes jest pusta)? Bo jeżeli nie będę musiał dorobić do tabeli passes dodatkowe pola na oceny...
PrinceOfPersia
przecież to nie AJAX, to zwykły HTML. baaasmiley.gif pomieszany z PHP.

weź spróbuj rozebrać to na części i zrobić jakieś var_dump($Result), żeby zobaczyć czy naprawdę search_result.html dostaje dobre dane (czyli czy ta linijka działa dobrze: $Result = parent::getDB()->run($q); . Także bym zrobił nowy testowy szablon html/php, który zamiast tworzyć skomplikowaną tabelę HTML, luzem wywalałby dane uzyskane z pętli foreach (żeby sprawdzić, czy właśnie z tymi pętlami i tworzeniem HTML nie masz coś schrzanionego w pliku search_result.html).

no i oczywiście, na samym początku zobaczyłbym w przegladarce zrodło strony (bo możliwe, że tabelka się robi, tylko jakiegoś znacznika HTML nie zamknąłeś i nie widać kolumn).

No i nie ma tu AJAXa, chyba że to nie cały kod.

edit:
noi. sprawdz w jakiej formie dostajesz te dane z bazy. może one są, ale nie w takim formacie (oczekjjesz tablicy rzedów, gdzie każdy rząd jest tablicą asocjacyjną. To też bym sprawdził)
x X x
Nie jest to cały kod. search_result.html to tylko plik html/php z pewnymi skryptami javy, które umożliwiają np. edycję pobranych danych i wysyłanie ich ponownie tam, skąd zostały pobrane. Natomiast za tworzenie tej tabeli odpowiedzialna jest inna funkcja, chyba jest to ta funkcja (tzn. za wyświetlanie tych 10 wyników, sortowanie ich, wybieranie z listy rozwijanej tylko wybranych danych, etc.).

plik nazywa się modules.php i jest to jedna z wielu zawartych w nich funkcji. Pokażę wszystkie, które moim zdaniem mogą być wywoływane do wyświetlania tabeli:
  1. ...
  2.  
  3. public function GetConnectionTab($column, $table){
  4. $Tab = array();
  5. $sql = 'SELECT DISTINCT '.$column.' FROM '.$table;
  6. $Res = $this->DB->run($sql);
  7.  
  8. foreach($Res as $v){
  9. $Tab[] = $v[$column];
  10. }
  11. return $Tab;
  12. }
  13.  
  14. ...
  15.  
  16. public function Select($from, $whe = '', $fields = '*'){
  17. $Res = array();
  18. $Res = $this->DB->select($from, $whe, '', $fields);
  19. return $Res;
  20. }
  21.  
  22. ...
  23.  
  24. public function SelectSingle($from, $whe = '', $fields = '*'){
  25. $R = $this->Select($from, $whe, $fields);
  26. return (isSet($R[0])) ? $R[0] : null;
  27. }
  28.  
  29. ...
  30.  
  31. public function GetResults(){
  32. return $this->GetTable($this->table);
  33. }
  34.  
  35. public function GetPassesTable(){
  36. $Result = $this->DB->select('userpermissions up, results r, subjects sb, classestypes ct, employees e, students st, passes ps', 'up.user_id = '.$this->User->GetID().' AND up.course_id = r.course_id AND sb.subject_id = r.subject_id AND ct.classestype_id = r.classestype_id AND e.employee_id = r.employee_id AND st.student_id = r.student_id AND st.student_id=ps.stutend_id ORDER BY r.pass', 'r.*, ps.*');
  37. return $Result;
  38. } //OWA FUNKCJA, RACZEJ NIE WPŁYWA NA WYŚWIETLANE DANE, PONIEWAŻ ZAKOMENTOWANIE PODOBNYCH DLA INNYCH TABEL NIE WPŁYWA NA TO CO WYŚWIETLA SIĘ W TABELI PLIKU WYNIKOWEGO search_results.html
  39.  
  40. ...
  41.  
  42. public function GetTable($TableName, $Where = ''){
  43. $Result = array();
  44.  
  45. if($this->User->GetPermission() == '99' || '25'){ //25 dodane aby wyświetlała się zawartośc modułu PASSES dla EMPLOYEE
  46. switch($TableName){
  47. case 'passes' : $Result = ($Where != '') ? $this->DB->select($TableName, $Where) : $this->DB->select($TableName); break;
  48. case 'employees' : $Result = ($Where != '') ? $this->DB->select($TableName, $Where.' ORDER by last_name') : $this->DB->select($TableName, ' 1 = 1 ORDER By last_name'); break;
  49. case 'classes' : $Result = ($Where != '') ? $this->DB->select($TableName, $Where) : $this->DB->select($TableName); break;
  50. case 'users' : $Result = ($Where != '') ? $this->DB->select($TableName, $Where) : $this->DB->select($TableName); break;
  51. case 'logs' :$Result = ($Where != '') ? $this->DB->select($TableName, $Where) : $this->DB->select($TableName); break;
  52. default : $Result = ($Where != '') ? $this->DB->select($TableName, $Where.' ORDER by name') : $this->DB->select($TableName, ' 1 = 1 ORDER By name'); break;
  53.  
  54. }
  55. } else {
  56. switch($TableName){
  57. case 'passes' : $Result = $this->GetPassesTable(); break; //TABELA PASSES
  58. case 'courses' : $Result = $this->GetCoursesTable(); break;
  59. case 'units' : $Result = $this->GetUnitsTable(); break;
  60. case 'specialties' : $Result = $this->GetSpecialtiesTable(); break;
  61. case 'subjects' : $Result = $this->GetSubjectsTable(); break;
  62. case 'classes' : $Result = $this->GetClassesTable(); break;
  63. case 'employees' : $Result = $this->GetEmployeesTable(); break;
  64. case 'students' : $Result = $this->GetStudentsTable($Where); break;
  65. default : $Result = ($Where != '') ? $this->DB->select($TableName, $Where) : $this->DB->select($TableName);
  66.  
  67. }
  68. }
  69. return $Result;
  70. }
  71.  
  72. ...
  73.  
  74. public function RewriteTable($Table, $LabelID){
  75. $NewArray = array();
  76. foreach($Table as $row){
  77. $NewArray[$row[$LabelID]] = $row;
  78. }
  79. return $NewArray;
  80. }
  81.  
  82. ...
  83.  
  84. public function RewriteSpecialTable($Table, $LabelID1, $LabelID2){
  85.  
  86. $NewArray = array();
  87. foreach($Table as $row){
  88. $Label = $row[$LabelID1].$row[$LabelID2];
  89. $NewArray[$Label] = $row;
  90. }
  91. return $NewArray;
  92. }
  93.  
  94. ...
  95.  
  96. public function RewriteSpecialDashTable($Table, $LabelID1, $LabelID2){
  97.  
  98. $NewArray = array();
  99. foreach($Table as $row){
  100. $Label = $row[$LabelID1].'_'.$row[$LabelID2];
  101. $NewArray[$Label] = $row;
  102. }
  103. return $NewArray;
  104. }


Wydaje mi się, że w tej funkcji leży problem, ponieważ nie pobieram przecież tylko tabeli passes, ale i dane z tabeli classes. Pokażę jeszcze strukturę tych dwóch tabel dla jasności:

CLASSES
  1. CREATE TABLE IF NOT EXISTS `classes` (
  2. `class_id` int(11) NOT NULL AUTO_INCREMENT,
  3. `subject_id` int(11) NOT NULL,
  4. `year_id` int(11) NOT NULL,
  5. `employee_id` int(11) NOT NULL,
  6. `classestype_id` int(11) NOT NULL,
  7. PRIMARY KEY (`class_id`)
  8. );


PASSES
  1. CREATE TABLE IF NOT EXISTS `passes` (
  2. `pass_id` int(11) NOT NULL AUTO_INCREMENT,
  3. `class_id` int(11) NOT NULL,
  4. `student_id` int(11) NOT NULL,
  5. `pass` enum('0','2','3','3.5','4','4.5','5','ZAL') COLLATE utf8_polish_ci DEFAULT '0',
  6. `pass_date` varchar(256) COLLATE utf8_polish_ci NOT NULL,
  7. `comments` varchar(100) COLLATE utf8_polish_ci DEFAULT NULL,
  8. PRIMARY KEY (`pass_id`)
  9. );


Jak widać tabela classes w zupełności wystarcza mi do wyświetlania wyników. Zapytanie, które przedstawiłem na początku wyświetla przykładowo następujące dane:

ZAJĘCIA1 - PRZEDMIOT1 - PROWADZĄCY 1 - RODZAJ ZAJĘC 1 - STUDENT 1 - OCENA/DATA/KOM
ZAJĘCIA2 - PRZEDMIOT1 - PROWADZĄCY 1 - RODZAJ ZAJĘC 2 - STUDENT 1 - OCENA/DATA/KOM
ZAJĘCIA1 - PRZEDMIOT1 - PROWADZĄCY 1 - RODZAJ ZAJĘC 1 - STUDENT 2 - OCENA/DATA/KOM
ZAJĘCIA2 - PRZEDMIOT1 - PROWADZĄCY 1 - RODZAJ ZAJĘC 2 - STUDENT 2 - OCENA/DATA/KOM

I tak dalej. Z reguły z jednego przedmiotu są 2 rodzaje zajęć: wykład i ćwiczenia, dlatego dla każdego studenta wyświetla dwa rekordy. Wszystkie te informacje pobieram z tabeli classes, łącząc ją z innymi tabelami poprzez id i do tego doklejam tabelę passes.
nospor
Podam ci jeszcze raz linka do tematu:
Temat: Jak poprawnie zada pytanie
Masz tam napisane jak wyswietlac bledy, jak wyswietlac bledy bazy, jak wyswietlac zawartosc zmiennych. Zastosuj sie do tego a nastepnie sprawdz sobie w konsoli FIREBUG co zwraca ci dokladnie AJAX. Bedziesz wiedzial w czym blad.
x X x
Nie wiem czy robię to dobrze, ale z plikiem html o takiej treści:

  1. <?php
  2.  
  3. ini_set('display_errors','1');
  4.  
  5. $connection = @mysql_connect('localhost', 'root', '')
  6. or die('Brak połączenia z serwerem MySQL.<br />Błąd: '.mysql_error());
  7. echo "Udało się połączyć z serwerem!<br />";
  8. $db = @mysql_select_db('szkolenie', $connection)
  9. or die('Nie mogę połączyć się z bazą danych<br />Błąd: '.mysql_error());
  10. echo "Udało się połączyć z bazą danych!";
  11.  
  12. $sql = "SELECT
  13. /*ps.pass_id,*/
  14. x.class_id,
  15. year_id,
  16. y_name, /*year*/
  17. subject_id,
  18. sb_name, /*subject*/
  19. employee_id,
  20. first_name, /*employee*/
  21. last_name, /*employee*/
  22. classestype_id,
  23. ct_name, /*classestype*/
  24. X.student_id,
  25. s_name, /*students*/
  26. sex, /*students*/
  27. ps.pass,
  28. ps.pass_date,
  29. ps.comments
  30. FROM
  31. (
  32. SELECT
  33. cl.class_id,
  34. y.year_id,
  35. y.name AS y_name, /*year*/
  36. sb.subject_id,
  37. sb.name AS sb_name, /*subject*/
  38. e.employee_id,
  39. first_name, /*employee*/
  40. last_name, /*employee*/
  41. ct.classestype_id,
  42. ct.name AS ct_name, /*classestype*/
  43. s.student_id,
  44. s.name AS s_name, /*students*/
  45. sex /*students*/
  46. FROM
  47. classes cl,
  48. years y,
  49. subjects sb,
  50. employees e,
  51. specialties sp,
  52. classestypes ct,
  53. students s
  54. WHERE cl.year_id=s.year_id
  55. AND cl.subject_id=sb.subject_id
  56. AND sb.specialty_id=sp.specialty_id
  57. AND s.specialty_id=sp.specialty_id /*sb.specialty_id*/
  58. AND cl.classestype_id=ct.classestype_id
  59. AND cl.employee_id=e.employee_id
  60. AND y.year_id=s.year_id
  61. ) X
  62. LEFT JOIN passes ps
  63. ON X.class_id=ps.class_id
  64. AND x.student_id=ps.student_id
  65. WHERE x.employee_id=938 and x.student_id=5883";
  66.  
  67.  
  68.  
  69. echo 'ZAPYTANIE: '.$sql.'</br></br>';
  70. mysql_query($sql) or die('BŁĄD:'.mysql_error().'</br></br>');
  71.  
  72.  
  73. //echo 'ZAPYTANIE: '.$Result.'</br></br>';
  74. //mysql_query($Result) or die('BŁĄD:'.mysql_error().'</br></br>');
  75.  
  76.  
  77. //var_dump($Result);
  78. var_dump($sql);
  79.  
  80. mysql_close($connection);
  81. ?>

dostaję taki wynik:

https://www.dropbox.com/s/owq1djq4xea4f9b/Z...%2014.50.51.png

Natomiast z takim (gdzie zmienna $Result odwołuje się do wywoływanego wcześniej zapytania, za pomocą której przekazuję również danę do pętli foreach w docelowej tabeli):

  1. <?php
  2.  
  3. ini_set('display_errors','1');
  4.  
  5. $connection = @mysql_connect('localhost', 'root', '')
  6. or die('Brak połączenia z serwerem MySQL.<br />Błąd: '.mysql_error());
  7. echo "Udało się połączyć z serwerem!<br />";
  8. $db = @mysql_select_db('szkolenie', $connection)
  9. or die('Nie mogę połączyć się z bazą danych<br />Błąd: '.mysql_error());
  10. echo "Udało się połączyć z bazą danych!";
  11.  
  12. $sql = "SELECT
  13. /*ps.pass_id,*/
  14. x.class_id,
  15. year_id,
  16. y_name, /*year*/
  17. subject_id,
  18. sb_name, /*subject*/
  19. employee_id,
  20. first_name, /*employee*/
  21. last_name, /*employee*/
  22. classestype_id,
  23. ct_name, /*classestype*/
  24. X.student_id,
  25. s_name, /*students*/
  26. sex, /*students*/
  27. ps.pass,
  28. ps.pass_date,
  29. ps.comments
  30. FROM
  31. (
  32. SELECT
  33. cl.class_id,
  34. y.year_id,
  35. y.name AS y_name, /*year*/
  36. sb.subject_id,
  37. sb.name AS sb_name, /*subject*/
  38. e.employee_id,
  39. first_name, /*employee*/
  40. last_name, /*employee*/
  41. ct.classestype_id,
  42. ct.name AS ct_name, /*classestype*/
  43. s.student_id,
  44. s.name AS s_name, /*students*/
  45. sex /*students*/
  46. FROM
  47. classes cl,
  48. years y,
  49. subjects sb,
  50. employees e,
  51. specialties sp,
  52. classestypes ct,
  53. students s
  54. WHERE cl.year_id=s.year_id
  55. AND cl.subject_id=sb.subject_id
  56. AND sb.specialty_id=sp.specialty_id
  57. AND s.specialty_id=sp.specialty_id /*sb.specialty_id*/
  58. AND cl.classestype_id=ct.classestype_id
  59. AND cl.employee_id=e.employee_id
  60. AND y.year_id=s.year_id
  61. ) X
  62. LEFT JOIN passes ps
  63. ON X.class_id=ps.class_id
  64. AND x.student_id=ps.student_id
  65. WHERE x.employee_id=938 and x.student_id=5883";
  66.  
  67.  
  68.  
  69. //echo 'ZAPYTANIE: '.$sql.'</br></br>';
  70. //mysql_query($sql) or die('BŁĄD:'.mysql_error().'</br></br>');
  71.  
  72.  
  73. echo 'ZAPYTANIE: '.$Result.'</br></br>';
  74. mysql_query($Result) or die('BŁĄD:'.mysql_error().'</br></br>');
  75.  
  76.  
  77. var_dump($Result);
  78. //var_dump($sql);
  79.  
  80. mysql_close($connection);
  81. ?>


wynik jest poniższy:

https://www.dropbox.com/s/y0v53h26dkugm5m/Z...%2014.52.33.png
nospor
mysql_query($Result)
Jakie $result? Przeciez zapytanie masz w $sql
x X x
Tak jak napisałem wcześniej. Tak jak to rozumiem, zmienna $Result przechowuje wynik zapytania, który później w dołączanym pliku search_results.html jest odczytywany za pomocą pętli foreach. Zobacz mój post w którym dałem zrzut pliku controller.php oraz search_result.html.

Jak widać, odwołanie do zmiennej sql w efekcie daje wyświetlenie tej zmiennej.
nospor
$Result ma zapisane rekordy pobrane z bazy. Po grzyba ty na tym robisz mysql_query()? Nie wiem. Na dodatek jak widac gdy robisz mysql_query($Result) to zmienna ta w ogole nie istnieje.
x X x
To w jaki sposób wyświetlić zawartość zmiennej $Result z pliku controller.php w dołączanym pliku search_res.html?
nospor
print_r($Result);
?

przenosze na przedszkole
x X x
Nie dostaję żadnych wyników oraz żadnego komunikatu - o poprawności/błędzie.
nospor
No bo juz ci mowilem, ze widac, ze $Result tam nie istnieje wiec nie ma co sie dziwic ze nic nie zwraca
x X x
No to dlaczego jeżeli, tak jak w pliku search_results.html w pętli foreach przypiszę $Results do $Pass, i później wyświetlam te dane w sposób, jak to jest pokazane wcześniej dane te się wyświetlają?

Moim zdaniem problem jest z jakąs funkcją przetwarzającą dane zawartą w pliku Modules.php. Jest to główny plik z funkcjami, z którego korzystają wszystkie moduły (wyświetlanie i edycja pracowników, wydziałów, zajęć, etc) w tym systemie i tam znajduje się 90% funkcji. Jeżeli wykonam zwykłe zapytanie (i oczywiście odpowiednio odniose się do niego w search_results.html - tak jak pisałem o tym na przykładzie zapytania $q2) to dane są przekazywane i wyświetlane.

Właśnie wykonałem takie zapytanie:

  1. $q3 = "select * from passes";
  2.  
  3. $Result = parent::getDB()->run($q3);
  4. include('search_results.html');


Nie zmieniając nic w pliku search_results.html i otrzymałem swoją tabelę, w której w odpowiednich miejscach są wyświetlane rekordy z tabeli passes. Czyli wszystko jest z tym w porządku, problem leży gdzieś indziej.

Jako, że w tym systemie w każdym dostępnym module do wyświetlania danych wystarczyło by właśnie takie zapytanie jak wyżej w tym właśnie wyczuwam problem - iż system nie jest przygotowany do obsługi podzapytań. W swoim przypadku łącze dwie tabele (o których wspomniałem wyżej) i wynik, jaki otrzymuje w PHPMyAdminie jest taki, jak również napisałem powyżej. To samo chcę osiągnąć na stronie internetowej w owej ajaxowej tabeli.

I moim zdaniem należy tutaj zmodyfikować funkcję public function GetTable, której kod również wcześniej przesłałem.

Edit:

Jedną ciekawą rzecz zauważyłem. Przy wywołaniu powyższego zapytania dodałem w search_results.html print_r($Result). W miejscu, w którym go dodałem dostałem taki oto wynik:

https://www.dropbox.com/s/lik32p9nohqbnnv/Z...%2019.36.23.png

Natomiast gdy do $Result przesyłam swoje zapytanie ($q) nie dostaję ani tabeli, ani tego wyniku jak powyżej.
PrinceOfPersia
Cytat(x X x @ 6.03.2014, 13:28:33 ) *
Nie jest to cały kod. search_result.html to tylko plik html/php z pewnymi skryptami javy, które

Javy to w to nie mieszaj, bo zapewne chodzi ci o JavaScript...
moze wpierw sprobuj wygooglaç czym się różni AJAX od HTML, i czym się różni kod PHP od JavaScriptu i od MySQL, a potem zadawaj pytania...
x X x
PrinceOfPersia, wielce dziękuję ci za powyższą odpowiedź, rozwiązała wszystkie moje problemy smile.gif

Pomijając fakt tego, że coś źle zostało nazwane (nie widzę w tym żadnej istotności) ktoś ma pomysł dlaczego nie chce mi się wyświetlić to zapytanie? Wydaje mi się, że przedstawiłem już wystarczająco wiele danych i kodu, bądź też różnych pokrewnych przypadków, w których wszystko działa jak należy.

Edit 8.03.2014:

Problem został rozwiązany, jak się okazuje poprawny zapis zapytań jest bardzo istotny i niekoniecznie to, co PHPMyAdmin przetwarza poprawnie - PHP zrobi tak samo. W tym wypadku chodzi o znaki. Wiadomo, że po SELECT musi być odstęp. Wyżej widać jak wygląda moje zapytanie. W takiej formie MySQL przetwarza je bez problemu. PHP natomiast nie - nie rozpoznał znaku ENTER jako odstępu, czyli nie widział odstępu między SELECT a pierwszym wybieranym elementem... Dałem spację -> enter - polecenie działa i ładuje dane do mojej tabeli... Uff. Myślę, że temat można zamknąć.

Ewentualnie proszę o kosz, bo zbyt dużo tutaj różnych danych...
PrinceOfPersia
Cytat(x X x @ 7.03.2014, 13:01:30 ) *
PrinceOfPersia, wielce dziękuję ci za powyższą odpowiedź, rozwiązała wszystkie moje problemy smile.gif

Pomijając fakt tego, że coś źle zostało nazwane (nie widzę w tym żadnej istotności)

ma taką istotność, że nazywając coś nieprawidłowo zawracasz innym gitarę, bo i tak ci nikt nie pomoże jeśli nazwiesz cos z "z dupy" i trzeba się zastanawiać, o co chodzi.

Cytat
Problem został rozwiązany, jak się okazuje poprawny zapis zapytań jest bardzo istotny i niekoniecznie to, co PHPMyAdmin przetwarza poprawnie - PHP zrobi tak samo. W tym wypadku chodzi o znaki

no właśnie. czyli jak pisałem, rozebrać na części problem i rozwiązanie się znajdzie samo wink.gif
x X x
Może i coś nazwałem nieprawidłowo, sugerowałem się wyglądem. Z resztą zamieściłem kod. No ale sorry, nie jestem jakiś mega w temacie.

Tak czy inaczej temat owego zapytania został zakończony, teraz muszę napisać funkcję, która doda mi do bazy danych nowy rekord, jeżeli zedytuję przynajmniej jedno puste pole w wyświetlanych wynikach. Ale to nie wiem czy mogę tutaj prosić o pomoc gdzieś?

EDYCJA: 9.03

Dobra, pomóżcie mi jeszcze w jednej sprawie. Tak wygląda moja wynikowa tabela na stronie:

https://www.dropbox.com/s/3kunkkqnjiv6eov/Z...%2013.11.00.png

Jak widać tabela passes ma na razie tylko 3 rekordy (są tylko 3 id). Jeżeli kliknę na pola, do których przypisane są możliwości edycji pojawia się coś takiego jak na załączniku (jeżeli klikam w pole tekstowe jak komentarz pojawia się okno tekstowe). W przypadku oceny wybieram z listy na sztywno zapisanych w funkcji javascript, która wygląda w ten sposób:

  1.  
  2. $('.editable-select.pass', oTable.fnGetNodes()).editable(
  3. window.location.pathname.replace('Show', 'EditAjax'),
  4. {
  5. indicator: 'Zapisywanie',
  6. tooltip: 'Kliknij, żeby zedytować',
  7. id: 'row_id',
  8. cancel : 'Porzuć',
  9. submit : 'OK',
  10. type : 'select',
  11. data : " {'0':'0' , '2':'2' , '3':'3' , '3.5':'3.5' , '4':'4' , '4.5':'4.5' , '5':'5' , 'ZAL':'ZAL'} ",
  12. submitdata : function(value, settings){
  13. return {ajax: true}
  14. },
  15. callback: function(value, settings){
  16. $(this).text(value.replace(/ /g, ""));
  17. }
  18. }
  19. );


Dla zwykłych pół tekstowych funkcja nazywa się po prostu editable, siedzi ona gdzieś bodajże w bibliotece jquery (bo w pliku search_results.html, z którego pochodzi powyższa funkcja czegoś takiego nie ma).

Pozostałę funkcje, które są używane moim zdaniem do zapisu i późniejszego wyświetlania to:

EditAjax (z pliku Controller.php):
  1. public function EditAjax(){
  2. if(!empty($_POST)){
  3. $v = explode('-', $_POST['row_id']);
  4. $arr = array();
  5. $id = $v[1];
  6. $arr[$v[0]] = $_POST['value'];
  7. parent::EditRecord($id, $arr);
  8. if(isSet($_POST['select_edit'])){
  9. $Table = parent::RewriteTable(parent::GetTable($_POST['select_edit']), $_POST['edit_id']);
  10. echo $Table[$_POST['value']]['name'];
  11. } else {
  12. echo $_POST['value'];
  13. }
  14. }
  15. }


EditRecord (z pliki Modules.php):
  1. public function EditRecord($id, $arr, $tab = '', $tab_id = ''){
  2. if($tab == '') $tab = $this->table;
  3. if($tab_id == '') $tab_id = $this->table_id;
  4. $Result = $this->DB->update($tab, $arr, $tab_id.' = '.$id);
  5. $this->AddLog('edit', $tab, $id);
  6. return $Result;
  7. }


Chyba tyle z tego co potrzebne.

Muszę teraz zedytować lub napisać nową funkcję, która zamiast robić update - doda nowy rekord do tabeli passes, przekazując do niej pobrane z tabeli class_id, student_id i, w zależności co w pierwszej kolejności zedytuje pracownik: pass, pass_date, comments. Mógłby ktoś przy tym pomóc?

Myślę, że na prostym schemacie funkcja taka powinna wyglądać następująco:

IF (pass_id == NULL){
INSERT INTO passes (...) VALUES ($class_id, $student_id, $pass, $pass_date, $comments)
}ELSE{
parent::EditAjax
}

to tylko schemat, ale moim zdaniem tak to powinno wyglądać. Jestem słaby z takich funkcji, gdyby ktoś pomógł będę wdzięczny.
x X x
Chciałem napisać to w moim poprzednim temacie (który, tak BTW) jest bardzo nieaktualny już) ale nie mogę niestety tego zrobić, dostaję komunikat o błędzie bez treści. Przepraszam więc, że zakładam nowy temat, ale potrzebuję pomocy jeszcze w jednej, w sumie ostatniej już rzeczy.

Kwestię wyświetlania ocen, wraz z odpowiednim zapytaniem już rozwiązałem, szczegóły opisane są w poniższym wątku:

Temat: AJAX a zapytania skorelowane podzapytania czy wspolpracuja

Aktualnie jestem na poziomie stworzenia funkcji, która:

1. Sprawdzi, czy pole id (pass_id) w wierszu, który chcę zedytować posiada jakąś wartość.
2. Jeżeli warunek jest spełniony (pass_id istnieje) - wykonuje się istniejąca funkcja, która wyświetli i po zatwierdzeniu wpisze w odpowiednie miejsce nowe dane. Przykładowo: jeżeli zmieniam ocenę w pass_id=9 - funkcja wykona operację update w polu pass, dla pass_id=9.
3. Jeżeli warunek nie jest spełniony (pass_id NIE istnieje):
A) funkcja pobiera class_id z edytowanego wiersza (pobierane jest ono w zapytaniu, ale jeżeli jest to konieczne może też być wyświetlane w tabeli)
B) funkcja pobiera student_id z edytowanego wiersza (j.w.)
C) w przypadku edycji pass (oceny) - pobiera ją i po kliknięciu OK -> D) wykonuje zapytanie INSERT INTO passes (...) VALUES (pobrane wartości)


Tym sposobem dane zostaną dodane, pass_id utworzy się samo (w tabeli PASSES jako AUTO INCREMENT). Tak przynajmniej ma to działać w teorii.

Zaprezentuję raz jeszcze funkcje, które moim zdaniem aktualnie za to odpowiadają:

plik search_results.html (potrzebny wycinek):
  1. ...
  2. <td name="ocena">
  3. <span id="pass-<?php echo $Pass['pass_id']; ?>" class="editable-select pass" style="color: red; weight: bold"><?php echo $Pass['pass']; ?></span>
  4. </td>
  5. ...
  6. $('.editable-select.pass', oTable.fnGetNodes()).editable(
  7. window.location.pathname.replace('Show', 'EditAjax'),
  8. {
  9. indicator: 'Zapisywanie',
  10. tooltip: 'Kliknij, żeby zedytować',
  11. id: 'row_id',
  12. cancel : 'Porzuć',
  13. submit : 'OK',
  14. type : 'select',
  15. data : " {'0':'0' , '2':'2' , '3':'3' , '3.5':'3.5' , '4':'4' , '4.5':'4.5' , '5':'5' , 'ZAL':'ZAL'} ",
  16. submitdata : function(value, settings){
  17. return {ajax: true}
  18. },
  19. callback: function(value, settings){
  20. $(this).text(value.replace(/ /g, ""));
  21. }
  22. }
  23. );


z pliku Controller.php (obsługa funkcji EditAjax):
  1. public function EditAjax(){
  2. if(!empty($_POST)){
  3. $v = explode('-', $_POST['row_id']);
  4. $arr = array();
  5. $id = $v[1];
  6. $arr[$v[0]] = $_POST['value'];
  7. parent::EditRecord($id, $arr);
  8. if(isSet($_POST['select_edit'])){
  9. $Table = parent::RewriteTable(parent::GetTable($_POST['select_edit']), $_POST['edit_id']);
  10. echo $Table[$_POST['value']]['name'];
  11. } else {
  12. echo $_POST['value'];
  13. }
  14. }
  15. }


z pliku Modules.php (funckja EditRecord, z której dziedziczy EditAjax):
  1. public function EditRecord($id, $arr, $tab = '', $tab_id = ''){
  2. if($tab == '') $tab = $this->table;
  3. if($tab_id == '') $tab_id = $this->table_id;
  4. $Result = $this->DB->update($tab, $arr, $tab_id.' = '.$id);
  5. $this->AddLog('edit', $tab, $id);
  6. return $Result;
  7. }


z pliku Modules.php, funkcja AddRecord, którą być może można by wykorzystać (owa wykorzystywana jest w wypadku dodawania danych do bazy za pomocą zwykłego formularza:
  1. public function AddRecord($arr, $tab = ''){
  2. if($tab == '') $tab = $this->table;
  3. $where = '';
  4. $count = 0;
  5. $len = count($arr);
  6. $pattern = '/^dont_save/i';
  7.  
  8. foreach($arr as $k => $v){
  9. $count++;
  10. if(!preg_match($pattern, $k)){
  11. $where .= $k.' = "'.$v.'"' ;
  12. if($count < $len)
  13. $where .= ' AND ';
  14. }
  15. }
  16. if($len > 0){
  17. $AlreadyIs = $this->DB->select($tab, $where);
  18. if($AlreadyIs){
  19. return 2;
  20. } else {
  21. $Result = $this->DB->insert($tab, $arr);
  22. $this->LastAddedIndex = $this->DB->lastInsertId();
  23. $this->AddLog('add', $tab, $this->DB->lastInsertId());
  24. return 1;
  25. }
  26. }
  27. return 0;
  28. }


Na razie siedzę nad tym i próbuję coś wymyśleć, ale bezskutecznie.
Kshyhoo
A mnie się udało napisać... łączę wątki.
x X x
Nie chodziło mi o ten wątek, ale z działu Bazy Danych. Ten został wyczerpany i było to trochę nie w temacie, no ale dzięki za przeniesienie.

EDIT 13.03:

Pomoże ktoś z tą funkcją z powyższych postów? Czy da się to jakoś zrobić w ten sposób? Bo jeżeli - nie muszę zaprojektować to jakoś inaczej...

Analizowałem już ten kod z kolegą, wg niego pierwszy problem to przekazywanie unikalnych id (class_id i student_id) - pobieranie ich z tabeli. Aktualnie funkcja do komunikacji z bazą potrzebuje głównego identyfikatora z tabeli passes - pass_id. Dzięki niemu wie jaką wartość ma zedytować (parametrem jest nazwa kolumny i identyfikator wiersza). Przeglądałem podstawowe funkcje skryptu jeditable i na razie nie znalazłem opcji na przekazywanie dodatkowych danych.

Prosze pomóżcie, doradzcie coś.

Pomoże ktoś z tą funkcją z powyższych postów? Czy da się to jakoś zrobić w ten sposób? Bo jeżeli - nie muszę zaprojektować to jakoś inaczej...

Analizowałem już ten kod z kolegą, wg niego pierwszy problem to przekazywanie unikalnych id (class_id i student_id) - pobieranie ich z tabeli. Aktualnie funkcja do komunikacji z bazą potrzebuje głównego identyfikatora z tabeli passes - pass_id. Dzięki niemu wie jaką wartość ma zedytować (parametrem jest nazwa kolumny i identyfikator wiersza). Przeglądałem podstawowe funkcje skryptu jeditable i na razie nie znalazłem opcji na przekazywanie dodatkowych danych.

Prosze pomóżcie, doradzcie coś.

Zamieszczam jeszcze pełną tabelkę wyświetlającą dane - aby zobrazować na jakiej zasadzie identyfikowana jest edytowana komórka. Wartość ID (czyli wskazanie na miejsce, co zmieniamy) pobierane jest z span id, natomiast VALUE to to, co wyświetla się pomiędzy spanem.
  1. <tr>
  2. <td name="id">
  3. <?php echo $Pass['pass_id']; ?>
  4. </td>
  5. <td name="id_zajec">
  6. <span id="class_id-<?php echo $Pass['pass_id']; ?>"><?php echo $Pass['cl_id']; ?></span>
  7. </td>
  8. <td name="rok">
  9. <span id="year_id-<?php echo $Pass['pass_id']; ?>"><?php echo $Pass['y_name']; ?></span>
  10. </td>
  11. <td name="przedmiot">
  12. <span id="subject_id-<?php echo $Pass['pass_id']; ?>"><?php echo $Pass['sb_name']; ?></span>
  13. </td>
  14. <td name="prowadzacy">
  15. <span id="employee_id-<?php echo $Pass['pass_id']; ?>"><?php echo $Pass['emp_name']; ?></span>
  16. </td>
  17. <td name="rodzaj_zajec">
  18. <span id="classestype_id-<?php echo $Pass['pass_id']; ?>"><?php echo $Pass['ct_name']; ?></span>
  19. </td>
  20. <td name="id_studenta">
  21. <span id="student_id-<?php echo $Pass['pass_id']; ?>"><?php echo $Pass['s_id']; ?></span>
  22. </td>
  23. <td name="student">
  24. <span id="student_id-<?php echo $Pass['pass_id']; ?>"><?php echo $Pass['s_name']; ?></span>
  25. </td>
  26. <td name="ocena">
  27. <span id="pass-<?php echo $Pass['pass_id']; ?>" class="editable-select pass" style="color: red; weight: bold"><?php echo $Pass['pass']; ?></span>
  28. </td>
  29. <td name="data">
  30. <span id="pass_date-<?php echo $Pass['pass_id']; ?>" class="editable"><?php echo $Pass['pass_date']; ?></span>
  31. </td>
  32. <td name="komentarz">
  33. <span id="comments-<?php echo $Pass['pass_id']; ?>" class="editable"><?php echo $Pass['comments']; ?></span>
  34. </td>
  35. </tr>
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.