Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [JavaScript][PHP][jquery/php]Onload nie chodzi tak jak trzeba
Forum PHP.pl > Forum > Przedszkole
marcwars
Witam,
mam kilka plików i wszystko prawie chodzi z wyjątkiem onloada.
Chcę, aby po załadowaniu strony index.php, załadował się od razu plik table.php (tworzy nową tabelę z danymi w bazie danych) i wyświetlił tablicę (temu służy kod po jedynym DIV w index.php).

Na razie to działa tak, że po wywołaniu strony nie pokazuje się nic, ale po jej przeładowaniu (odświeżam) pokazuje się załadowana tabela.
Próbowałem już różnych alternatyw z onload i plikiem onload.js, ale nic nie pomaga.
* Przy dołączaniu
Kod
onload="onload.js"
w body, robi sie potrójna tabelka, tak jakby ładowało plik table.php trzy razy;)
* unload z pliku onload.js działa poprawnie, czyli kasuje tabelę po wyjściu ze strony.
*po 1 załadowaniu strony działa funkcja table- w bazie powstaje tabela, jest tylko problem z pokazaniem tabeli.

Będę wdzięczny, jak ktoś mi wskaże źródło problemu.

Pliki:
index.php
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5. <title>Employee</title>
  6. <link rel="stylesheet" type="text/css" media="screen" href="styl.css" />
  7. <script src="jquery-1.7.1.js" type="text/javascript"></script>
  8. <script src="custom.js" type="text/javascript"></script>
  9. <script type="text/javascript" src="onload.js"></script>
  10. </head>
  11. <body>
  12. <div></div>
  13. <?php
  14. require_once ('module.class.php');
  15. $Db = new Module;
  16. $Db->magic();
  17. $Db->connect();
  18. $action = 'load';
  19. if(isset($_GET['action']))
  20. $action = $_GET['action'];
  21. if($action == 'load')
  22. {
  23. $Db->select("SELECT * FROM employee");
  24. $Db->ShowAllEmp();
  25. }
  26. ?>
  27. </body>
  28. </html>


onload.js
  1. $(document).ready(function () {
  2. $("div").load('table.php');
  3. });
  4. $(window).unload( function () { $("div").load('drop.php'); } );


table.php
  1. <?php
  2. //
  3. require_once ('module.class.php');
  4. $Db = new Module;
  5. $Db->magic();
  6. $Db->connect();
  7. $Db->query("CREATE TABLE employee
  8. (`id` INT AUTO_INCREMENT PRIMARY KEY,
  9. `name` VARCHAR (30),
  10. `surname` VARCHAR (30),
  11. `age` INT,
  12. `profession` VARCHAR (30),
  13. `experience` INT
  14. )");
  15. $Db->query("INSERT INTO employee (name, surname, age, profession, experience)
  16. VALUES ( 'Jan', 'Kowalski', '42', 'handlowiec', '5'),
  17. ('Piotr', 'Kononowicz', '22', 'stazysta', '0'),
  18. ('Lucjan', 'Gawlinski', '31', 'informatyk', '2'),
  19. ('Katarzyna', 'Oles', '28', 'recepcjonistka', '3')");
  20. ?>


fragment module.class.php
Kod
....
public function ShowAllEmp()
  {
  if ($this->result)
  {
  while($row = mysql_fetch_assoc($this->result))
{
    $out[]=$row;
}
echo '<table id="tab"><tr><th>Id</th><th>Name</th><th>Surname</th><th>Age</th><th>Profession</th><th>Experience</th><th>Delete</th></tr>';
foreach ($out as $art)
{
     echo '<tr>';
     echo '<td>'.$art['id'].'</td>';
     echo '<td>'.htmlspecialchars($art['name'],ENT_QUOTES).'</td>';
     echo '<td>'.htmlspecialchars($art['surname'],ENT_QUOTES).'</td>';
     echo '<td>'.$art['age'].'</td>';
     echo '<td>'.htmlspecialchars($art['profession'],ENT_QUOTES).'</td>';
     echo '<td>'.$art['experience'].'</td>';
     echo '<td><form method="post" action=""><input type="hidden" name="id" value="'.$art['id'].'" /><input class="del" type="submit" value="" title="Delete" /></form></td>';
     echo '</tr>';  
}
}
  }
....
wNogachSpisz
Jakość kodu jest bardzo marna, żeby nie powiedzieć - tragiczna.

Kod
if(isset($_GET['action']))  
   $action = $_GET['action'];

IMO Taka walidacja jest niewstarczająca, nawet jeśli uznamy ją za przedwstępną.
Jeśli skrypt wywołasz mniej więcej tak:
Kod
/script.php?action[]=foo

to do zmiennej $action trafi tablica..

Ponadto, taka konstrukcja jest błędna:
Kod
$action = 'load';
if(isset($_GET['action']))  
   $action = $_GET['action'];

Rozumiem że deklarujesz $action aby zabezpieczyć się przed registrer-globals-vuln,
tyle że takie rozwiązanie jest najwolniejsze z możliwych.
Następujący kod będzie działał szybciej:
Kod
if(isset($_GET['action']))  
   $action = $_GET['action'];
else
   $action = 'load';


Kod
$Db->select("SELECT * FROM employee");

A ja myślałem że kod SQL harcoded w widoku ostatnio wykorzystywano w latach 90'tych,
okazuje się że nadal ma on swoich zwolenników.
Użyj bibliteki PDO lub klasy-modelu który będzie się zajmował generowaniem kodu SQL.

Idziemy dalej:

Kod
$(window).unload()

Ten ewent wywoływany jest inaczej lub wcale - w zależności od przeglądarki.
Trzeba być szablonym jeśli chce się na nim polegać, nawet w najmniejszym stopniu.

Co do fragmentu kodu module.class.php - dramat.
Rozumiem że jest to coś w rodzaju widoku?
Jeśli tak, to nie godzi się wywoływać w nim funkcji typu 'mysql_fetch_assoc'.
Widokowi dostarczasz zmienne do podstawienia w HTMLu.
Idealnie w widoku nie powinny być wywoływane żadne funkcje,
a podstawienia do HTML'a nie wokunuje się w ten sposób:
Kod
echo '<td>'.$art['age'].'</td>';


tylko w ten:
Kod
<td><?=$art['age']?></td>


Przed tobą sporo nauki.

Pozdrowienia.
marcwars
Po pierwsze muszę przyznać, ze jestem informatykiem - amatorem, po innych studiach i równie innym doświadczeniu zawodowym, który usiłuje się wgryźć w temat, więc trudno, żebym śmigał jak zawodnik, który na politechnice nie przespał niejedną noc ślęcząc nad kodem, więc przy takim założeniu, wiele Twoich uwag jest zrozumiałych, jak to mówił jeden kolega ochroniarz "dobrze jest raz dziennie dać komuś w ryja, ale jeszcze lepiej dla pokory samemu raz dziennie dostać" smile.gif

Ok, do rzeczy.
Jakość kodu tragiczna - przepisałem z książki o ajaxie z heliona wydanej w 2011r.- mam na myśli ten wątek z get[action], po prostu próbowałem różnych wątków na to, aby tabelka wgrywała się od razu, a nie za drugim przeładowaniem...
zmieniłem index.php:
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5. <title>Module Employee</title>
  6. <link rel="stylesheet" type="text/css" media="screen" href="css/styl.css" />
  7. <script src="js/jquery-1.7.1.js" type="text/javascript"></script>
  8. <script src="js/custom.js" type="text/javascript"></script>
  9. <script src="js/onload.js" type="text/javascript"></script>
  10. </head>
  11. <body>
  12. <div></div>
  13. <h1> Module Employee</h1>
  14. <?php
  15. require_once ('class/module.class.php');
  16. $Db = new Module;
  17. $Db->magic();
  18. $Db->connect();
  19. $Db->SelectAll();
  20. $Db->ShowAllEmp();
  21. ?>
  22. </body>
  23. </html>

więc sql w widoku nie ma.

Piszesz, że zastosowany jquery jest do kitu, ok, ale co proponujesz? Bo dla mnie w niezaładowaniu strony tutaj tkwi klucz, albo w pliku z klasą.
wNogachSpisz
Cytat(marcwars @ 3.12.2011, 17:24:12 ) *
Piszesz, że zastosowany jquery jest do kitu, ok, ale co proponujesz? Bo dla mnie w niezaładowaniu strony tutaj tkwi klucz, albo w pliku z klasą.

Nie napisałem że jQuery jest do kitu.
jQuery jest w porządku.
Problem ze zdarzeniem unload, jest ono 'unreliable'.
Proponuje inaczej zaprojektować aplikację, tak aby nie polegała ona na zdarzeniu unload.
marcwars
To ćwiczeniowy plik, który po załadowaniu strony index.php ma utworzyć w bazie tabele jak poniżej widać, a po wyjściu ma ją kasować.
I prawie wszystko chodzi, ale po wejściu na stronę, muszę ją raz przeładować/odświeżyć, aby tabelka się pojawiła, tak jakby za pierwszym razem nie wchodził pusty div na samym początku index.php
Jak dałem pod divem a nad tabelką nagłowek w <h1>, to nagłówek się wyświetla za pierwszym załadowaniem strony. I tego nie rozumiem, bo funkcja onload wydawała się właściwa.
No chyba, że pomyliłem właściwości onloada w jquery z onloadem (tak wiem, to jest w body i odpala funkcję) z javascriptu?
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.