Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL][PHP]Dodawanie wielu elementów tablicy $_FILES do bazy danych
babcia_smierc
post
Post #1





Grupa: Zarejestrowani
Postów: 33
Pomógł: 0
Dołączył: 4.03.2011

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


Mam taki problem:
Użytkownik wskazuje ilosc zdjec do galeri newsa do wgrania na serwer, po czym tworzona jest tablica $_FILES. W jaki sposób dodać zawartość tej tablicy (wielu rekordów) za pomocą jednego zapytania ?

tabela news_gal do ktorej wstawic chiałbym wiele rekordów wyglada tak:(id, id_newsa, obraz)

oto kod dynamicznego tworzenia ilosci zdjec do wstawienia:

  1. if(@$_POST['submit'] AND ($_POST['ilosc_zdj'])>0) {
  2. //form start
  3. echo('<form enctype="multipart/form-data" action="dodaj_zdj_akt.php?id_newsa='. $id . '" method="POST">
  4. <input type="hidden" name="MAX_FILE_SIZE" value="1000000" />');
  5. $ilosc = (int)$_POST['ilosc_zdj'];
  6. for($x=1;$x<=$ilosc;$x++) {
  7. echo('<input name="plik[]" type="file" /><br />');
  8. }


A to kod (błędny) zapytania

  1. if(@$_POST['submit2']) {
  2.  
  3.  
  4. $add_news_pic = "INSERT INTO `wtz`.`news_gal`(id, id_newsa, obraz) VALUES (NULL, '" . $id . "')";
  5. mysql_query($add_news_pic) or die(mysql_error());
  6.  
  7. }
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 19)
Damonsson
post
Post #2





Grupa: Zarejestrowani
Postów: 2 355
Pomógł: 533
Dołączył: 15.01.2010
Skąd: Bydgoszcz

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


Zrób sobie foreach tej tablicy i w nim INSERT, przy okazji możesz skorzystać z transakcji.
Go to the top of the page
+Quote Post
Sephirus
post
Post #3





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

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


Ogólnie możesz zastosować wiele dodawanych wartości w INSERT w SQL przecież (IMG:style_emoticons/default/smile.gif)

Przykład:

  1.  
  2. $sql = "INSERT INTO tabelka (id,pole1,pole2) VALUES ";
  3. $sqlValues = array();
  4.  
  5. foreach($tablica AS $element) {
  6. $sqlValues[] = "(NULL,'{$element['pole1']}','{$element['pole2']}')";
  7. }
  8.  
  9. $sql = $sql . implode(', ',$sqlValues);
  10.  
  11.  
Go to the top of the page
+Quote Post
Damonsson
post
Post #4





Grupa: Zarejestrowani
Postów: 2 355
Pomógł: 533
Dołączył: 15.01.2010
Skąd: Bydgoszcz

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


Ładowanie wszystkiego do jednego INSERT'a po przecinku, jest szybsze/wydajniejsze/lepsze, niż oddzielne wykonywanie INSERT'ów bez korzystania z transakcji/z wykorzystaniem transakcji?
Go to the top of the page
+Quote Post
Sephirus
post
Post #5





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

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


W tym przypadku - sam sobie odpowiedz (IMG:style_emoticons/default/smile.gif)

EDIT: Transakcja tutaj to dodatek - możesz jej równie dobrze użyć w moim zapytaniu lub nie - to już zależy od twórcy - nie to było tematem.

Ten post edytował Sephirus 20.02.2013, 08:48:14
Go to the top of the page
+Quote Post
Damonsson
post
Post #6





Grupa: Zarejestrowani
Postów: 2 355
Pomógł: 533
Dołączył: 15.01.2010
Skąd: Bydgoszcz

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


Gdybym wiedział, nie pytałbym (IMG:style_emoticons/default/tongue.gif)

Ale zaryzykuję, że jest równe oddzielnym insertom z wykorzystaniem transakcji?

edit: w tym konkretnym przypadku, to nie ma znaczenia pewnie, ale przy większej ilości, to już ma znaczenie, chodzi mi o ten drugi przypadek.

Ten post edytował Damonsson 20.02.2013, 08:49:03
Go to the top of the page
+Quote Post
Sephirus
post
Post #7





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

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


Cytat
Gdybym wiedział, nie pytałbym

Ale zaryzykuję, że jest równe oddzielnym insertom z wykorzystaniem transakcji?


Ogólnie tak - zgadzam się z tym, ale tylko jeśli autor zbierze wszystkie zapytania w kupę (w jakiś jeden ciąg - łącznie ze startem transakcji) i je wyśle raz do DB - inaczej wykonywanie oddzielnych zapytań (autor korzysta z mysql_***) będzie mniej wydajne (IMG:style_emoticons/default/smile.gif)

EDIT: Dla duuuuużej liczby rekordów to nawet moją metodę trzeba by było dzielić dodając po X rekordów tak by nie przekroczyć maksymalnej długości zapytania. Tu bardziej chodzi o dobry nawyk. Lepiej od razu zrobić coś na zasadzie:

Kod
pętla() {
    Tu generuje całe zapytanie SQL z dodawaniem wielu rekordów
}

Tu wykonuje jedno zapytanie


Niż:

Kod
pętla() {
    Każdorazowo wykonuje zapytanie
}


Dla dużej liczby tych plików poszła by masa zapytań, a że autor korzysta z funkcji rodziny mysql_*** to z wydajnością było by to na bakier (IMG:style_emoticons/default/wink.gif)

EDIT2: Bo zapomniałem - moja metoda wymusza po prostu takie myślenie (IMG:style_emoticons/default/smile.gif)

Ten post edytował Sephirus 20.02.2013, 08:56:40
Go to the top of the page
+Quote Post
babcia_smierc
post
Post #8





Grupa: Zarejestrowani
Postów: 33
Pomógł: 0
Dołączył: 4.03.2011

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


A co jesli $_FILES['name'] tez jest tablica ? Tzn. w formularzy <select> wybieram wiecej niz 1 zdjecie... Wtedy to wyglada tak:
  1.  
  2. (
  3. [plik] => Array
  4. (
  5. [name] => Array
  6. (
  7. [0] => obraz12.jpg
  8. [1] => obraz1.jpg
  9. )
  10. )


Co trzeba zmodyfikować w:

  1. $tablica = $_FILES;
  2. $sql = "INSERT INTO news_gal (id,id_newsa,obraz) VALUES ";
  3. $sqlValues = array();
  4.  
  5. foreach($tablica AS $element) {
  6. $sqlValues[] = "(NULL,' . $id . ','{$element['name'][0]}')";
  7. }
  8.  
  9. $sql = $sql . implode(', ',$sqlValues);
  10.  
  11.  


Dodać jeszcze jedną pętle foreach ?
Go to the top of the page
+Quote Post
Sephirus
post
Post #9





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

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


  1. $tablica = $_FILES['name'];
  2. $sql = "INSERT INTO news_gal (id,id_newsa,obraz) VALUES ";
  3. $sqlValues = array();
  4.  
  5. foreach($tablica AS $element) {
  6. $sqlValues[] = "(NULL,'{$id}','{$element}')";
  7. }
  8.  
  9. $sql = $sql . implode(', ',$sqlValues);
  10.  


(IMG:style_emoticons/default/smile.gif)

EDIT: miałeś mały błąd.

Ten post edytował Sephirus 20.02.2013, 09:27:54
Go to the top of the page
+Quote Post
phpion
post
Post #10





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Cytat(Damonsson @ 20.02.2013, 08:44:56 ) *
Ładowanie wszystkiego do jednego INSERT'a po przecinku, jest szybsze/wydajniejsze/lepsze, niż oddzielne wykonywanie INSERT'ów bez korzystania z transakcji/z wykorzystaniem transakcji?

Zdecydowanie (przynajmniej w przypadku PostgreSQL). Przy jednym projekcie miałem okazję sprawdzić to na własnej skórze. Multi-insert jest zdecydowanie szybszy. Zależy oczywiście ile danych jest do wstawienia. Różnica będzie rosła wraz z ilością danych do wstawienia. Oczywiście przy ogromnej liczbie danych warto rozważyć zapis danych do pliku i późniejsze LOAD DATA INFILE.
Go to the top of the page
+Quote Post
babcia_smierc
post
Post #11





Grupa: Zarejestrowani
Postów: 33
Pomógł: 0
Dołączył: 4.03.2011

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


A błędne czasem nie jest to ze w panelu phpmyadmin w tablei news_gal w ostatniej kolumnie 'obraz' wyswietla nie nazwe obrazu tylko 'Array' ? Bo to własnie tablice mi dodaje a nie konkretna nazwe pliku.
Oto co mi wywala:

Notice: Array to string conversion in E:\xampp\xampp\htdocs\wtz_php\dodaj_zdj_akt.php on line 26

Przypominam, że chciałbym dodać więcej niż jeden plik (obraz). W zakresie 1-10.

Ten post edytował babcia_smierc 20.02.2013, 09:55:17
Go to the top of the page
+Quote Post
Sephirus
post
Post #12





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

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


Na pewno dobrze przepisałeś ten kod?

Skoro $tablica to $_FILES['name'] to w foreach powinno być wszystko ok...
Go to the top of the page
+Quote Post
babcia_smierc
post
Post #13





Grupa: Zarejestrowani
Postów: 33
Pomógł: 0
Dołączył: 4.03.2011

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


Zrobiłem kopiuj wklej i oto co mi wywala:

Notice: Undefined index: name in E:\xampp\xampp\htdocs\wtz_php\dodaj_zdj_akt.php on line 21

Warning: Invalid argument supplied for foreach() in E:\xampp\xampp\htdocs\wtz_php\dodaj_zdj_akt.php on line 25
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1

a oto linia 25:

  1. foreach($tablica AS $element) {
  2. $sqlValues[] = "(NULL,'{$id}','{$element}')";
  3. }


Ten post edytował babcia_smierc 20.02.2013, 10:04:47
Go to the top of the page
+Quote Post
Sephirus
post
Post #14





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

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


ajjj takie przeoczenie (IMG:style_emoticons/default/smile.gif) sam mogłeś wpaść na to (IMG:style_emoticons/default/tongue.gif) Zapomnieliśmy obaj o tym że INPUT FILE ma swoją nazwę (IMG:style_emoticons/default/smile.gif)

  1. // W tym miejscu powinieneś też sprawdzać czy w ogóle w $_FILES coś jest itd...
  2. $tablica = $_FILES['plik']['name'];
  3. $sql = "INSERT INTO news_gal (id,id_newsa,obraz) VALUES ";
  4. $sqlValues = array();
  5.  
  6. foreach($tablica AS $element) {
  7. $sqlValues[] = "(NULL,'{$id}','{$element}')";
  8. }
  9.  
  10. $sql = $sql . implode(', ',$sqlValues);
  11.  
Go to the top of the page
+Quote Post
babcia_smierc
post
Post #15





Grupa: Zarejestrowani
Postów: 33
Pomógł: 0
Dołączył: 4.03.2011

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


Działa !
Tylko nie dodaje mi identyfikatora newsa do bazy (id,id_newsa,obraz). Nie wiecie dlaczego ?

Ten post edytował babcia_smierc 20.02.2013, 10:18:58
Go to the top of the page
+Quote Post
Sephirus
post
Post #16





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

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


A odbierasz to ID z parametru GET w ogóle? (IMG:style_emoticons/default/smile.gif)

  1. $id = mysql_real_escape_string($_GET['id_newsa']);
  2.  
  3. // ... dalszy kod
Go to the top of the page
+Quote Post
babcia_smierc
post
Post #17





Grupa: Zarejestrowani
Postów: 33
Pomógł: 0
Dołączył: 4.03.2011

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


Tak, na początku strony:

  1. include("header.php");
  2. if($_SESSION['USERLEVEL'] != 10) {
  3. header("Location: index.php?page=main");
  4. }
  5. @$id = $_GET['id'];
  6.  
  7. ...
Go to the top of the page
+Quote Post
Sephirus
post
Post #18





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

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


Cytat
$_GET['id']


A jak się nazywa parametr w adresie? (IMG:style_emoticons/default/smile.gif)

Co masz w atrybucie ACTION w FORM? (IMG:style_emoticons/default/smile.gif)

Chłopie! ;P (IMG:style_emoticons/default/facepalmxd.gif)
Go to the top of the page
+Quote Post
babcia_smierc
post
Post #19





Grupa: Zarejestrowani
Postów: 33
Pomógł: 0
Dołączył: 4.03.2011

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


Problem w tym ze na jednej stornie mam 2 formularze (1 do okreslenia ilosci zdjec która chce sie uploadowac a 2 do wysyłania tych zdjec).

1:
  1. echo('<form enctype="multipart/form-data" action="dodaj_zdj_akt.php?id_newsa='. $id . '" method="POST">

2:
  1. echo '<form action=dodaj_zdj_akt.php?id_newsa=' . $id . ' method=POST>';
  2. echo '<p class=form>Podaj ilosc zdjęć do wstawienia</p>';
  3. echo '<select name=ilosc_zdj>';
Go to the top of the page
+Quote Post
Sephirus
post
Post #20





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

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


Przecież możesz to połączyć w jeden (IMG:style_emoticons/default/smile.gif)

Liczbę zdjęć możesz określi po liczbie plików (IMG:style_emoticons/default/wink.gif)

Z tym musisz już sobie sam poradzić.
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: 14.09.2025 - 22:38