Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Problem ze sprawdzeniem wyniku w bazie danych
chemar
post
Post #1





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 15.08.2010

Ostrzeżenie: (0%)
-----


Mam taki kod

  1. <?php
  2. require_once("database_connection.php");
  3.  
  4.  
  5. $xml = simplexml_load_file('plik'.date('Ymd').'.xml');
  6.  
  7.  
  8. foreach ($xml->oferta as $produkt) {
  9.  
  10. $wynik = mysql_query("SELECT id_produkt FROM produkt WHERE id_produkt=".$produkt->id."") or die(mysql_error());
  11. while ($rekord = mysql_fetch_assoc($wynik))
  12. {
  13. if($rekord['id_produkt'] == $produkt->id)
  14. {
  15. echo $rekord['id_produkt']." - $produkt->id - JEST<br />";
  16. } else {
  17. echo $rekord['id_produkt']." - $produkt->id - NIE MA<br />";
  18. }
  19. }
  20. }
  21. ?>


dlaczego ten kod mi nis sprawdza poprawnie wywala mi tylko te rekordy które są w bazie a tych których nie ma nie wywala wogóle a wiem an pewno, że w pliku xml są rekordy których nie ma w bazie. Jak mogę osiągnąć wynik taki, że jeżeli id z xml istnieje w bazie to wywala komunikat że istnieje a jeżeli nie to że nie istnieje

próbowałem także w taki sposób

  1. if(mysql_num_rows($wynik)==0)
  2. {
  3. //istnieje
  4. } else {
  5. //nei istnieje
  6. }


jednak to też nei działało.

Ten post edytował chemar 15.08.2010, 17:27:23
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 3)
krispak
post
Post #2





Grupa: Zarejestrowani
Postów: 250
Pomógł: 55
Dołączył: 27.08.2008

Ostrzeżenie: (0%)
-----


Slabo zapoznales sie z petlami.. W petli while jezeli warunek jest niespelniony to petla nie wykona sie ani razu, w przeciwienstwie do - do while. Wywal warunek where i sprawdzaj jak teraz w petli.
Pozdrawiam
Go to the top of the page
+Quote Post
chemar
post
Post #3





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 15.08.2010

Ostrzeżenie: (0%)
-----


Niestety takie rozwiązanie też mnie nie ratuje ponieważ jest dużo danych i skrypt nie zdąży wykonać się nie pomaga też set_time_limit(300); z żadnymi wartościami.
Może jakieś inne wyjścia na sprawdzenie tego co chę. bo jakoś nie mogę sobie poradzić.
Teraz mam tak:
  1. <?php
  2. require_once("database_connection.php");
  3.  
  4.  
  5. $xml = simplexml_load_file('plik'.date('Ymd').'.xml');
  6.  
  7.  
  8. foreach ($xml->oferta as $produkt) {
  9.  
  10. $wynik = mysql_query("SELECT id_produkt FROM produkt") or die(mysql_error());
  11. while ($rekord = mysql_fetch_assoc($wynik))
  12. {
  13. if($rekord['id_produkt'] == $produkt->id)
  14. {
  15. echo $rekord['id_produkt']." - $produkt->id - JEST<br />";
  16. } else {
  17. echo $rekord['id_produkt']." - $produkt->id - NIE MA<br />";
  18. }
  19. }
  20. }
  21. ?>


i niestety nie dizała to tak jak potrzeba raz, że skrypt przerywa działanie po uplywie jakiegoś czasu a dwa w NIE MA wyświetla mi takie rekordy które są czyli taki sam rekord jest w JEST jak i w NIE MA

Dobra temat do zamknięcia całkowicie, źle to robiłem.

Ten post edytował chemar 15.08.2010, 19:35:12
Go to the top of the page
+Quote Post
mkozak
post
Post #4





Grupa: Zarejestrowani
Postów: 78
Pomógł: 4
Dołączył: 21.03.2005

Ostrzeżenie: (0%)
-----


Bo puszczasz zapytania w pętli i to głupie zapytania.

Błąd nr 1
Za każdym razem pobierasz wszystkie produkty i jedziesz po liście (np 1000 rekordów) i szukasz id_produkt, zamiast do zapytania wpisać warunek

  1. "SELECT id_produkt FROM produkt WHERE id_produkt = $produkt->id


Ale to i tak będzie beznadziejne rozwiązanie, bo zmniejszy jedynie szybkość pozyskiwania danych i ich przeszukiwania, ale nadal wykonujesz to zapytanie dla wszystkich produktów w xml-u.

Jeżeli masz w xml mniej niż 1000 produktów to polecam:

  1. <?php
  2. require_once("database_connection.php");
  3.  
  4.  
  5. $xml = simplexml_load_file('plik'.date('Ymd').'.xml');
  6.  
  7. $t_idki = array();
  8. foreach ($xml->oferta as $produkt) {
  9. $t_idki[] = $produkt->id;
  10. }
  11.  
  12. $wynik = mysql_query("SELECT id_produkt FROM produkt where id_produkt in (".implode(',',$t_idki).")") or die(mysql_error());
  13.  
  14. ?>


W wyniku dostaniesz tylko te, które są w bazie

Jeżeli masz więcej id-ków w xml niż 1000 to pobierz listę produktów raz do tabeli (na początku skryptu), a później sprawdzaj już w foreach-u np. za pomocą funkcji in_array.

  1. <?php
  2. require_once("database_connection.php");
  3.  
  4.  
  5. $xml = simplexml_load_file('plik'.date('Ymd').'.xml');
  6.  
  7.  
  8. $wynik = mysql_query("SELECT id_produkt FROM produkt") or die(mysql_error());
  9. while ($rekord = mysql_fetch_assoc($wynik))
  10. {
  11. $t_produkty[] = $rekord['id_produkt'];
  12. }
  13.  
  14. foreach ($xml->oferta as $produkt) {
  15. if(in_array($produkt->id,$t_produkty))
  16. {
  17. echo $rekord['id_produkt']." - $produkt->id - JEST<br />";
  18. } else {
  19. echo $rekord['id_produkt']." - $produkt->id - NIE MA<br />";
  20. }
  21. }
  22. ?>
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 12:43