XML porównanie z bazą

0

Witam serdecznie, zetknąłem się z pewnym problemem, otóż: Mam bazę danych, napisałem skrypt który wyświetla wszystko z tej bazy oto on nic nadzwyczajnego.

$wynik = mysql_query("SELECT * FROM dane")
or die('Błąd zapytania');


if(mysql_num_rows($wynik) > 0) {
echo "<table cellpadding=\"2\" border=1>";
    while($r = mysql_fetch_assoc($wynik)) {
        echo "<tr>";
        echo "<td>".$r['IMIE']."</td>";
        echo "<td>".$r['NAZWISKO']."</td>";
      
        echo "</tr>";
    }
    echo "</table>";
}

Następnie posiadam plik xml z jakąś tam strukturą, napisałem do niego parser żeby wyciągał z niego nazwiska i imiona ogólnie pole to to: <Nazwa1>Jan Nowak</Nazwa1>

Oto kod parsera:

$dokument = DOMDocument::load('plik.xml');
$autorzy=$dokument->getElementsByTagName('NAZWA1');
foreach ($autorzy as $autor) {
print$autor->nodeValue."\n";

echo "</br>";
}

Dodam że działa bez zarzutu... Ale dla mnie tu zaczynają się schody... Chcę aby te nazwiska, które są w bazie danych i te same co są w xml (w bazie jest Nowak i w xml jest Nowak) się np podświetliły w tabeli, podejrzewam że trzeba jakoś wyciągać i porównywać stringi z tablicy, ale moja wiedza się tu kończy,
meczę się dzień i nie wiem jak się za to zabrać.

0
$dokument = DOMDocument::load('plik.xml');
$autorzy = $dokument->getElementsByTagName('NAZWA1');
$nazwiska = array(); //Inicjujemy tablicę
foreach ($autorzy as $autor)
$nazwiska[] = substr(strrchr($autor->nodeValue, " "),1);
$wynik = mysql_query('SELECT * FROM dane') or die('Błąd zapytania');

if (mysql_num_rows($wynik) > 0) {
  echo('<table cellpadding="2" border="1">');
    while($r = mysql_fetch_assoc($wynik)) {
        if (in_array($r['NAZWISKO'], $nazwiska)) { $kolor = 'background: red'; } else { $kolor = 'background: white'; } //Sprawdzamy czy nazwisko było w dokumencie XML
           echo('<tr style="'.$kolor.'">');
           echo('<td>'.$r['IMIE'].'</td>');
           echo('<td>'.$r['NAZWISKO'].'</td>');
           echo('</tr>');
    }
  echo('</table>');
}

Podałem kody w takiej kolejności w jakiej mają być wykonywane, inaczej nie wyjdzie. I zwracaj uwagę na zapis, bo bardzo go urozmaicasz co potem skutkuje zmniejszeniem czytelności.

Bo raz tak (to aż razi):

print$autor->nodeValue."\n";

Potem tak:

echo "<tr>";

I tak też (imo najładniejszy zapis):

die('Błąd zapytania');
0

Jesteś genialny ;) a możesz jeszcze powiedzieć dla informacji bo patrz jak zmieniw w xml w sekcji <NAZWA1> i wpisze bez imienia tzn same nazwisko np. <NAZWA1>Kowal</NAZWA1> to już nie wyswietli o co mi chodzi... nakierujesz mnie jak zrobić aby kolejność imie nazwisko nazwisko imie oraz małe wielkie litery nie miała znaczenia ? np. <NAZWA1>Nowak</NAZWA1>, <NAZWA1>Nowak Anna</NAZWA1>,
<NAZWA1>ANNA Nowak</NAZWA1>,

0
if (in_array(strtolower($r['NAZWISKO']), $nazwiska))
$nazwiska[] = strtolower(substr(strrchr($autor->nodeValue, " "),1));

Dodajesz tam gdzie jest porównywanie nazwiska funkcję strtolower(), wtedy nie będzie różnicy jaką wielkością liter zapisano nazwisko.

Oprócz tego... no chyba z tą kolejnością nazwisk nie powinieneś przesadzać. Bo żeby system automatycznie rozpoznawał które to imię, a które nazwisko, trzeba by stworzyć listę imion i je dopasowywać do zawartości nazwa1.

0

Dzięki wielkie dużo mi pomogłeś z tym, ale tak myślę popatrz, czy żeby rozpoznawać które to imię a które nazwisko trzeba koniecznie tworzyć listę imion? A nie wystarczy sprawdzić czy w stringu Jan Kowalski lub Kowalski Jan nie wysepuje string Kowalski ? Bo mnie urządza już tylko same wyciągnięcie i porównanie nazwisk bez imion.

0

Ale skąd skrypt ma wiedzieć że akurat Kowalski to nazwisko, a Jan to imię? No chyba że zrobiłbyś tak:

$nazwisko_rev = explode(' ', $nazwisko);
$nazwisko_rev = $nazwisko_rev[1] . ' ' . $nazwisko_rev[0];

I wtedy przez in_array sprawdził czy w tablicy $nazwiska jest $nazwisko jeśli nie ma, to próbujesz $nazwisko_rev (czyli $nazwisko z odwróconą kolejnością wyrazów). Tutaj test tego listingu który podałem wyżej:

http://to.o12.pl/work/4programmers/153747.php?nazwisko=Kowalski%20Jan
http://to.o12.pl/work/4programmers/153747.php?nazwisko=Jan%20Kowalski

Problem będzie rozwiązany, do czasu aż ktoś nie będzie miał dwóch imion. Wtedy trzeba będzie więcej pokombinować...

0

Czyli coś w tym stylu...

$dokument = DOMDocument::load('plik.xml');
$autorzy = $dokument->getElementsByTagName('NAZWA1');
$nazwiska = array(); //Inicjujemy tablicę
foreach ($autorzy as $autor)
$nazwiska[] = substr(strrchr($autor->nodeValue, " "),1);
$nazwisko_rev = explode(' ', $nazwisko);
$nazwisko_rev = $nazwisko_rev[1] . ' ' . $nazwisko_rev[0];
$wynik = mysql_query('SELECT * FROM dane') or die('Błąd zapytania');

if (mysql_num_rows($wynik) > 0) {
  echo('<table cellpadding="2" border="1">');
    while($r = mysql_fetch_assoc($wynik)) {
        if (in_array($nazwisko, $nazwiska)) { $kolor = 'background: red'; } else { in_array($nazwisko_rev, $nazwiska }
           echo('<tr style="'.$kolor.'">');
           echo('<td>'.$r['IMIE'].'</td>');
           echo('<td>'.$r['NAZWISKO'].'</td>');
           echo('</tr>');
    }
  echo('</table>');
}

Coś mi tu nie działa... Jeśli ten sposób będzie chodził uznam problem za rozwiązany - kwestia dwóch imion na następny raz...

0

Źle ifa skonstruowałeś.

if (in_array($nazwisko, $nazwiska) || in_array($nazwisko_rev, $nazwiska)) { $kolor = 'background: red'; } else { [...] }
0

IF już jest ale mimo tego że w xml nie ma nazwiska podkreśla mi całą tabelę na zielono ;/

if (mysql_num_rows($wynik) > 0) {
  echo('<table cellpadding="2" border="1">');
    while($r = mysql_fetch_assoc($wynik)) {
        if (in_array($nazwisko, $nazwiska) || in_array($nazwisko_rev, 

$nazwiska)) { $kolor = 'background: green'; } else { $kolor = 'background: red'; } 


           echo('<tr style="'.$kolor.'">');
           echo('<td>'.$r['IMIE'].'</td>');
           echo('<td>'.$r['NAZWISKO'].'</td>');
  echo('<td>'.$r['NR_UMOWY'].'</td>');
           echo('</tr>');

    }
  echo('</table>');
}
0

Nie tu gdzie trzeba ten kod podstawiłeś. Część XMLową zostaw w spokoju, a do części MySQLowej:

$wynik = mysql_query('SELECT * FROM dane') or die('Błąd zapytania');

if (mysql_num_rows($wynik) > 0) {
  echo('<table cellpadding="2" border="1">');
    while($r = mysql_fetch_assoc($wynik)) {
        /* Zmienione */
        $nazwisko_rev = explode(' ', $r['NAZWISKO']); $nazwisko_rev = $nazwisko_rev[1] . ' ' . $nazwisko_rev[0];
        if (in_array($r['NAZWISKO'], $nazwiska) || in_array($nazwisko_rev, $nazwiska)) { $kolor = 'background: red'; } else { $kolor = 'background: white'; } //Sprawdzamy czy nazwisko było w dokumencie XML
        /* Koniec zmienionego */
           echo('<tr style="'.$kolor.'">');
           echo('<td>'.$r['IMIE'].'</td>');
           echo('<td>'.$r['NAZWISKO'].'</td>');
           echo('</tr>');
    }
  echo('</table>');
}
0

OK pomyliłem sporo fakt, ale wklejam Twój kod i mimo wszystko wyświetla na biało całą tabelę mimo że nazwiska sa i w bazie i w xmlu, sorry za upierdliwość... ale coś nie gra...a tak już ciągnąc jeszcze temat mam taki głupi pomysł z kolejnością tzn nie możnabybyło zrobić tak?

$autorzy[0]['imie']=...
$autorzy[0]['nazwisko']=...
$autorzy[1]['imie']=...
$autorzy[1]['nazwisko']=...

1 użytkowników online, w tym zalogowanych: 0, gości: 1