[PHP] [MySQL] Wypełnianie bazy danych danymi XML

0

Pisze program który ma wypełniać baze danych danymi z pliku XML. Przykładowa zawartość pliku XML wygląda następująco:

<linie> <linia nazwa="1"> <wariant id="1" nazwa="BISKUPIN - MARINO"> </wariant> </linia> </linie>

W bazie znajduje się tabela która ma trzy kolumny:
| nazwa_linii | typ_transportu | kierunek |

wszystkie kolumny są typu varchar.

Stworzyłem kod który wpisuje do zmiennych interesujące mnie dane a następnie wyświetla je na ekranie i zapisuje do bazy.

<?PHP ini_set( 'display_errors', 'On' ); error_reporting( E_ALL ); require('polaczeniezbaza.php'); $typ_transportu="tramwaj"; $rozklad = simplexml_load_file('1.xml'); echo '
  • '; foreach ($rozklad->linia as $linia) { echo '
  • '; $linia_tmp=$linia->attributes(); echo $linia_tmp['nazwa']; foreach ($linia->wariant as $wariant) { echo '
  • '; $wariant_tmp=$wariant->attributes(); echo $wariant_tmp['nazwa']; echo $linia_tmp['nazwa']; $zapytanie=mysql_query("INSERT INTO linia (nazwa_linii, typ_transportu, kierunek) VALUES ($linia_tmp2['nazwa'], $typ_tmp2, $wariant_tmp2['nazwa'])"); } echo '
</li>'; } echo '</ul>'; ?>

Problem pojawia się w linii w której jest zapytanie SQL. Wyrzuca następujący błąd syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING .
Szukałem po i=forach czym to może być spowodowane i znalazłem propozycje aby zmienne w zapytaniu umieścić w apostrofach np. '$linia_tmp2['nazwa']' lub w "'.$linia_tmp2['nazwa'].'" lecz to nie przyniosło żadnego efektu. Próbowałem również rzutować zmienne na string i usuwać białe znaki za pomocą fukncji trim ale to też nie pomogło. Prosze o pomoc.

0

Jak nie pomogło? To znaczy, że jakoś bezsensownie to zrobiłeś. Trzeba po prostu pomyśleć. Wiadomo, że gdy na pałę wstawisz apostrofy wokół zmiennych i niczego innego nie zmienisz, to to nie zadziała.

Masz tu zwykły błąd składni PHP.

Użyj apostrofów zamiast cudzysłowu i przed każdą zmienną wyjdź ze stringu (apostrof), doklej zmienną (operator sklejania, czyli kropka -- przed i po zmiennej), wejdź do stringu (znowu apostrof).

Taka linijka jest poprawnie parsowana przez PHP:

$zapytanie = mysql_query('INSERT INTO linia (nazwa_linii, typ_transportu, kierunek) VALUES (' . $linia_tmp2['nazwa'] . ', ' . $typ_tmp2 . ', ' . $wariant_tmp2['nazwa'] . ')');

Osobną sprawą jest to, że w treści samego zapytania MySQL wypadałoby także umieścić apostrofy wokół wartości kolumn typu string. Więc może wygodniej by Ci było użyć jednak cudzysłowów, bo jeśli chcesz umieścić apostrof w stringu ograniczanym apostrofami, to musisz poprzedzić go lewym ukośnikiem (znakiem ).

Jest też opcja z cudzysłowami, bez wychodzenia ze stringu, tak jak masz. Skomplikowane nazwy zmiennych trzeba wtedy otoczyć znakami { oraz }, jak tutaj:

$zapytanie = mysql_query("INSERT INTO linia (nazwa_linii, typ_transportu, kierunek) VALUES ({$linia_tmp2['nazwa']}, $typ_tmp2, {$wariant_tmp2['nazwa']})");

Tutaj łatwo Ci będzie wstawić apostrofy wokół wartości kolumn typu string, ale niektórzy mówią, że lepiej jednak wyjść ze stringu, bo przy skomplikowanych nazwach zmiennych trudno się połapać, co jest zmienną, a co nie (od pewnego momentu skomplikowania znaki { i } przestają działać).

0

Dzięki bardzo. Działa :)

0

Niestety nie do końca. Kod się wykonuje, ale nie zapisuje rekordów w bazie. Nie jest to chyba spowodowane błędem połączenia bo gdy w zapytaniu zamiast zmienny wstawię np: INSERT INTO linia (nazwa_linii, typ_transportu, kierunek) VALUES (1,2,3) to rekordy zapisują się do bazy.</php>

0

Po co opisujesz tutaj kolejny problem?

Samodzielność, zią!

Nie leć tutaj, tylko dalej użyj mózgownicy. Zaczęło Ci to dobrze iść: sprawdziłeś komendę INSERT ze stałymi parametrami (widzę, że to liczby, a nie łańcuchy znaków -- to Ci sporo uprości). Dobrze, że to sprawdziłeś. Ale co to sugeruje? Tak jak napisałeś: połączenie działa. Ale co jeszcze to sugeruje? Ano to, że dynamicznie zbudowane zapytanie może nie działać. Może jest jakaś literówka, może ja wprowadziłem tam błąd, może Ty. Sprawdź to! Wypisz sobie wartość zmiennej $zapytanie i zobacz, czy wszystko z nią OK. Jeśli np. wartość którejś kolumny będzie pusta, a nie powinna, to też tu nie leć, tylko pomyśl: czemu. I sprawdź. Budowanie łańcucha jest OK? Czy może w samych zmiennych np. $typ_tmp2 nic nie ma, a powinno coś być? Ponownie: wyświetl sobie wartości tych zmiennych. I tak dalej. W taki prosty sposób można debugować aplikacje w PHP, z braku porządnego debuggera.

Główkowanie się opłaca, bo jak będziesz PROgramistą, to nikt za Ciebie tego robił nie będzie. Więc popróbuj (napisałem Ci parę pomysłów na debugowanie tego kodu). Jak to wszystko zawiedzie, jak już naprawdę nic nie dasz rady wymyślić -- wtedy uderzasz na forum. Zwykle jednak ludzie zbyt szybko się poddają.

0

Wiec tak zapomniałem napisać że poprawiłem te błędy z nazwami zmiennych. Niby zapytania budowane są poprawnie bo gdy wyświetlam zawartość zmiennej zapytanie to zapytanie jest ok. Jednak kod wyrzuca błąd: Nieznana kolumna 'BISKUPIN' w field list.

<?PHP
ini_set( 'display_errors', 'On' ); 
error_reporting( E_ALL );


require('polaczeniezbaza.php');


$typ_transportu="tramwaj";

$rozklad = simplexml_load_file('1.xml');



echo '<ul>';
 foreach ($rozklad->linia as $linia) {
    echo '<li>';
   $linia_tmp=$linia->attributes();
   foreach ($linia->wariant as $wariant) {
 
       $wariant_tmp=$wariant->attributes();
	   echo '<li>';
	   echo $wariant_tmp['nazwa'];
	   echo $linia_tmp['nazwa'];
	   echo $typ_transportu;
	  
	$zapytanie = "INSERT INTO linia (nazwa_linii, typ_transportu, kierunek) VALUES ({$linia_tmp['nazwa']}, $typ_transportu, {$wariant_tmp['nazwa']})";
	   echo $zapytanie;
	   mysql_query($zapytanie);
       }
    echo '</ul></li>';
 }
 echo '</ul>';

require('zakoncz_polaczenie.php');

?>
0

Sorki za zamieszanie już poradziałem sobie

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