Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL]Dodawanie z txt do bazy
Forum PHP.pl > Forum > Przedszkole
shtoc
Mam takie pytanie!!
Jak dodaje rekordy do bazy z pliku txt to kazdy nowy wiersz pliku jest nowym rekordem.

Czy mozna zrobic tak zeby skrypt bral 1 wiersz i ustawial jako przyposcmy tytul w bazie i kolejne 10 wierszy i ustawail jako opis. zeby to bylo jednym rekordem. i pote lecial dalej 11 na tytul i kolejne 10 na opis!
czyli plik :
1
2
3
4
5
...
w bazie
id tytul opis
1 1 2 3 4 5...


kod jakim dodaje rekordy z pliku do bazy

  1. <?php
  2. $pdo = new PDO('mysql:host=localhost;dbname=test', 'admin', 'xxx');
  3. $pdo ->query("SET NAMES utf8");
  4. $plik = file("d:ksiazka2.txt");
  5.  
  6. foreach($plik as $tmp)
  7. {
  8. $sql = "INSERT INTO spam (`cont`) VALUES (:cont)";
  9. $statement = $pdo->prepare($sql);
  10. $statement->bindValue(':cont', $aaa, PDO::PARAM_STR);
  11. $statement->execute();
  12. }
  13. ?>
thomson89
Cytat(shtoc @ 19.01.2009, 15:05:43 ) *
zeby skrypt bral 1 wiersz i ustawial jako przyposcmy tytul w bazie i kolejne 10 wierszy i ustawail jako opis. zeby to bylo jednym rekordem. i pote lecial dalej 11 na tytul i kolejne 10 na opis!


Pomocna będzie while" title="Zobacz w manualu PHP" target="_manual, oraz explode" title="Zobacz w manualu PHP" target="_manual. Oczywiście, jeżeli wiesz ile masz w pliku tytułów...

Kod
Hello<!>
Opis 1;
Opis 2;
Opis 3;
Opis 4;
...itd.


I najpierw rozbijasz explode, na tytul i tresc. Za pomocą funckji mozesz sprawdzić czy już jest koniec pliku. W ten sposób tworzysz pętlę while, która odczyta tytuły. Będziesz miał wtedy taką tabelkę:
Kod
//jak dales $tabela1 = explode('<!>', $plik)
$tabela1[0] // twoj tytul
$tabela[1] // twoje opisy

I za pomocą kolejnej pętli dzielisz $tabela[1] według ; a potem już łatwo dostosować wyniki do własnych potrzeb.
shtoc
hmm to moze inne pytanie exclamation.gif jak zrobic zeby z pliku pobierac przykladowo po 10 wierszy do jednego pola bazy?

zeby nie bylo ze po <enter> jest nowy rekord.
erix
Robisz sobie pętlę pobierającą linię (fgets" title="Zobacz w manualu PHP" target="_manual) i w niej licznik zwiększający się co krok o jeden. Jeśli dziesięć - wszystkie poprzednio wczytane wpisy, to cały rekord i resetujesz licznik do zera.

Kod
licznik = 0;
while(pobierz){
   jesli
      licznik<10 to rekord .= wczytane dane
   w przeciwnym wypadku
      kasuj licznik
   zwieksz licznik
}
Pilsener
Po pliku poruszasz się tak:
  1. <?php
  2. $uchwyt = fopen($pliczek,'r');  
  3.   while(!feof($uchwyt)){
  4.      if(fgets($uchwyt)){
  5.            $ile_rekordow++;
  6.        }
  7.   }
  8. fclose($uchwyt);
  9. echo $ile_rekordow;
  10. ?>


1. Przerób najpierw plik tak, aby spełniał Twoje wymagania (to co odczytujesz z jednego pliku od razu możesz zapisać do drugiego)
2. Dodaj plik do bazy używając LOAD DATA INFILE zamiast INSERT - z doświadczenia wiem, że jest to nawet kilkanaście razy szybsze.
EarthCitizen
BTW: Jak masz odpowiednią strukturę danych w pliku, np masz plik CSV z rekordami każdy w nowej linii i pola oddzielone separatorami to możesz sobie dodać przez phpmyadmina bez potrzeby pisania skryptu.
shtoc
Cytat(Pilsener @ 20.01.2009, 08:25:10 ) *
Po pliku poruszasz się tak:
  1. <?php
  2. $uchwyt = fopen($pliczek,'r');  
  3.   while(!feof($uchwyt)){
  4.      if(fgets($uchwyt)){
  5.            $ile_rekordow++;
  6.        }
  7.   }
  8. fclose($uchwyt);
  9. echo $ile_rekordow;
  10. ?>


1. Przerób najpierw plik tak, aby spełniał Twoje wymagania (to co odczytujesz z jednego pliku od razu możesz zapisać do drugiego)
2. Dodaj plik do bazy używając LOAD DATA INFILE zamiast INSERT - z doświadczenia wiem, że jest to nawet kilkanaście razy szybsze.


ale fgets pobiera linie o zadanej długości, jednak pobieranie konczy sie jak napotka znak <enter>.

a ja potrzebuje zeby pobral przykladowo do jednego rekordu 3 linie po enterach.

czyli jak mam plik :
linia 1 <enter>
linia 2 <enter>
linia 3 <enter>
linia 4 <enter>

to chcę w bazie
w 1 rekordzie
linia 1 linia 2 linia 3
w 2 rekordzie
linia 4.....itd
erix
Cytat
a ja potrzebuje zeby pobral przykladowo do jednego rekordu 3 linie po enterach.


To jaki masz problem?
  1. <?php
  2. while(!feof($f)){
  3.  $linia1 = fgets($f);
  4.  $linia2 = fgets($f);
  5.  $linia3 = fgets($f);
  6. }
  7. ?>
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.