Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php + mysql]Upload plików na serwer + wpis do mysql
Forum PHP.pl > Forum > Przedszkole
guilty82
Witam. Jestem poczatkujacym programista i probuje napisac skrypt, ktory przesle 4 pliki (jpg) z formularza na serwer oraz doda do mysql: id, nazwe i id_plikow (jednakowe dla wszystkich ktore przesylam jednorazowo). Przeszukałem forum i znalazlem kilka skryptow, jednak nie potrafie ich poskladac w calosc. Oto moj kod:

  1. CREATE TABLE pliki (id int NOT NULL, nazwa varchar(25), id_domku int);


id - dla kazdego pliku wgrywanego jednorazowo inne, ale gdy wgram kolejne pliki aby powtarzalo sie np.
plik1.jpg id=1, plik2.jpg id=2 ... drugiplik1.jpg id=1, drugiplik2.jpg id=2 ... itd.

A to kod php:

  1. <form enctype="multipart/form-data" action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
  2. <input type="file" name="plik[]"><br />
  3. <input type="file" name="plik[]"><br />
  4. <input type="file" name="plik[]"><br />
  5. <input type="file" name="plik[]">
  6. <input type="submit" value="Wyślij na serwer">
  7. </form>
  8.  
  9. <?php
  10. for ($i=0; $i<sizeof($_FILES['plik']['size']); $i++) {
  11. if ($_FILES['plik']['size'][$i] !=0) {
  12. $uploaded = "upload/". $_FILES['plik']['name'][$i];
  13. if (is_uploaded_file($_FILES['plik']['tmp_name'][$i])) {
  14. if ($_FILES['plik']['size'][$i] > 1024*1024*1024) {
  15. echo "Plik numer $i jest za duży<br />";
  16. } else {
  17. move_uploaded_file($_FILES['plik']['tmp_name'][$i],$uploaded);
  18. echo "Operacja wysyłania pliku $i przebiegła pomyslnie<br />";
  19.  
  20. }
  21. } else {
  22. echo "Błąd przy przesyłaniu danych w pliku $i!<br />";
  23. }
  24. }
  25.  
  26. echo "<pre>";print_r($_FILES);echo "</pre>";
  27. }
  28.  
  29. $nazwa = $_POST['plik']['name'];
  30. // $id = questionmark.gif;
  31. // $id_domku = questionmark.gif;
  32.  
  33. if ($nazwa) {
  34.  
  35. $dbcnx = mysql_connect('localhost', 'login', 'haslo');
  36. if (!$dbcnx) {
  37. exit('<p>Nie mozna polaczyc sie z baza danych.</p>');
  38. }
  39.  
  40. if (!@mysql_select_db('domek')) {
  41. exit('<p>Nie mozna zlokalizowac bazy danych.</p>');
  42. }
  43.  
  44. $ins = @mysql_query("INSERT INTO pliki SET
  45. id = '$id', nazwa = '$nazwa', id_domku = '$id_domku'") or die (mysql_error());
  46. // tutaj nie wiem czy dobre zapytanie..
  47.  
  48. if ($ins) {
  49. echo "Dodano do bazy inf o plikach";
  50. } else {
  51. echo "Blad - nie udalo sie";
  52. }
  53. mysql_close($dbcnx);
  54. }
  55.  
  56. ?>


Pliki ładuja sie na serwer, ale zupelnie nie wiem jak sobie poradzic z wpisaniem informacji o nich do tabelki

Dzieki za pomoc!
nospor
po pierwsze:
nie:
  1. <?php
  2. $ins = mysql_query("INSERT INTO pliki SET
  3. id = '$id', nazwa = '$nazwa' id_domku='$id_domku'");
  4. ?>

a:
  1. <?php
  2. $ins = mysql_query("INSERT INTO pliki SET
  3. id = '$id', nazwa = '$nazwa' id_domku='$id_domku'") or die(mysql_error());
  4. ?>
Bedziesz widzial jaki masz blad

po drugie:
zjadles przecinek, a wiec nie: ....nazwa = '$nazwa' id_domku....
a: ...nazwa = '$nazwa', id_domku.....

po trzecie:
przenosze smile.gif
guilty82
Ok poprawilem tak jak napisales. Mimo to nie pokazuje mi jaki error - chyba wogole pomija caly ten fragment. Prosze o podpowiedz co powinienem wstawic dla $id i $id_domku oraz czy $nazwa jest dobrze napisana tu:

  1. <?php
  2. $nazwa = $_POST['plik']['name'];
  3. // $id = questionmark.gif;
  4. // $id_domku = questionmark.gif;
  5. ?>
Istalacar
Witam
  1. $ins = @mysql_query("INSERT INTO pliki SET
  2. id = '$id', nazwa = '$nazwa', id_domku = '$id_domku'") OR die (mysql_error());
  3. // tutaj nie wiem czy dobre zapytanie..

Mam wrażenie że po prostu średnik zjadłeśtongue.gif
czyli powinno być:
  1. $ins = @mysql_query("INSERT INTO pliki SET
  2. id = '$id', nazwa = '$nazwa', id_domku = '$id_domku';") OR die (mysql_error());
  3. // tutaj nie wiem czy dobre zapytanie..

guilty82
Istalacar dziala rowniez bez srednika, ale dzieki za podpowiedz smile.gif
Natomiast poprawilem ten fragment:

  1. <?php 
  2. $nazwa = $_FILES['plik']['name'];
  3. // $id = questionmark.gif;
  4. // $id_domku = questionmark.gif;
  5. ?>


oraz zapytanie:

  1. <?php
  2. $ins = @mysql_query("INSERT INTO pliki SET
  3. id = 1, nazwa = '$nazwa', id_domku = 1") or die(mysql_error());
  4. ?>


I teraz zapisuje mi do bazy ale zamiast nazwy plikow tabela wyglada tak:

  1. id | nazwa | id_domku
  2. 1 | Array | 1


dla $id i $id_domku przypisalem po prostu wartosc 1 bo nie wiem jak rozwiazac ten problem..
Nie wiem jednak dlaczego w nazwie jest Array?
nospor
1) zmodyfikuj strukture tabeli i zrob z ID autoincrement. Wowcza w insert nie ustawiaj juz ID
2) dostajesz "array" gdyz "plik" to u ciebie tablica plikow, powinienes wiec miec:
  1. <?php
  2. $nazwa = $_FILES['plik']['name'][0];
  3. ?>

To ci pobierze pierwsza nazwe, a ty w formie masz ich cztery. Kombinuj wiec chlopie winksmiley.jpg
3)A co to $id_domku? skad je bierzesz? Nigdzie tego nie ma.
guilty82
1) zrobilem tak na probe i dziala, ale mi chodzi o cos innego.. mianowicie id nie moze byc auto_increment poniewaz bedzie sie powtarzac dla roznych domow. przykladowo mam 2 domki: domek1, domek2. dla kazdego po 4 obrazki. i teraz wgrywam sobie obrazki dla domek1:
id=1, plikdomek1.jpg, id_domku=1; id=2, plikdomek2.jpg, id_domku=1... itd.
natomiast dla domek2 wgrywam:
id=1, plikdomek2.jpg, id_domku=2; id=2, plikdomek2.jpg, id_domku=2... itd.
to wszystko po to aby mysql "wiedzial" pozniej ktore obrazki sa do ktorego domku (id_domku) oraz ktory obrazek z tego wlasnie domku chce pobrac (id).

2) dzieki za podpowiedz - dziala! jesli zas chodzi o to ze mam 4 domki narazie do tego nie doszedlem.. wydaje mi sie ze powinienem uzyc jakiejs petli. tymczasem zrobilem na chlopski rozum, niestety takie rozwiazanie nie dziala:
  1. <?php
  2. $nazwa1 = $_FILES['plik']['name'][0];
  3. $nazwa2 = $_FILES['plik']['name'][1];
  4. $nazwa3 = $_FILES['plik']['name'][2];
  5. $nazwa4 = $_FILES['plik']['name'][3];
  6.  
  7. ...
  8.  
  9. $ins1 = @mysql_query("INSERT INTO pliki SET
  10. nazwa = '$nazwa1', id_domku = 2") or die(mysql_error());
  11. $ins2 = @mysql_query("INSERT INTO pliki SET
  12. nazwa = '$nazwa2', id_domku = 2") or die(mysql_error());
  13. $ins3 = @mysql_query("INSERT INTO pliki SET
  14. nazwa = '$nazwa3', id_domku = 2") or die(mysql_error());
  15. $ins4 = @mysql_query("INSERT INTO pliki SET
  16. nazwa = '$nazwa4', id_domku = 2") or die(mysql_error());
  17. // tutaj nie wiem czy dobre zapytanie..
  18.  
  19. if ($ins1 and $ins2 and $ins3 and $ins4) {
  20. echo "Dodano do bazy inf o plikach";
  21. } else { echo "Blad - nie udalo sie";
  22. }
  23. ?>


3) jak juz wspomnialem id_domku dotyczy wprowadzanego jednorazowo domu i jest za kazdym razem inne, ale nie wiem jak sie do tego zabrac narazie..
nospor
ad1)
Cytat
mianowicie id nie moze byc auto_increment poniewaz bedzie sie powtarzac dla roznych domow
autoincrement sie nie powtarza. dla kazdego rekordu jest inne. U ciebie ma sie powtarzac id_domku a nie id

ad2) w jakim sensie nie dziala? jakis blad?

ad3) No ale skad wiesz do jakiego domku wgrywasz pliki? Skads musisz to wiedziec. Chyba nie wgrywasz na slepo?
guilty82
1) jesli id bedzie primary key i auto_increment to nie wiem jak baza rozpozna ze obrazek z danego domku to np. rzut_parteru.jpg a nie elewacja.jpg. poniewaz typy tych obrazkow beda sie powtarzac dla wszystkich wprowadzanych domkow np. id=1 to rzut parteru, id=2 to elewacja id=3 to widok_domu_przod.jpg...itd. dlatego przyjalem ze nr id bedzie sie powtarzal w kazdym domie, abym mogl wyciagnac konkretny obrazek z ktoregos domu (id_domku).
chyba, ze zostawie id autoincrement i dodam kolumne, ktora przypisze kazdemu obrazkowi ten typ - wydaje mi sie ze roznica bedzie tylko taka ze bede mial 1 kolumne wiecej, ale nie wiem..
nie jestem pewny czy taka forma tabeli ma sens, ale nie znalazlem narazie alternatywy..

2) no wlasnie nie wyskakuje ani blad ani ze dodano do bazy.. gdy sprawdzam tabelke to jest pusta

3) pliki wgrywam do jednego katalogu, natomiast skojarze je z domkiem za pomoca id_domku
nospor
ad1) no to trzeba bylo od razu tak mowic smile.gif
Dodaj kolumne typ i po sprawie. Id jako ID zawsze sie przyda, nawet jak sie wydaje ze nie

ad2) Dla wszystkiego powywalaj jeszcze te malpy (@) i daj jakiej kontrolne echo 'kontrolne'; przy tych mysql_query by sprawdzic czy tam wogole dochodzi

ad3)
Cytat
natomiast skojarze je z domkiem za pomoca id_domku
To wiem. Nie wiem natomiast skad ty te id_domku bierzesz smile.gif
guilty82
nospor dzieki wielkie za pomoc!

mam jeszcze 1 pomysl na rozwiazanie tego calego problemu. otoz zaladuje sobie wszystko do 1 tabeli (dane o domku + info o obrazkach na serwerze).

i chyba tak zrobie. dzieki wszystkim za pomoc!
nospor
Cytat
Unknown column 'technologia' in 'field list'.
Skoro ci pisze ze nie mia kolumny technologia, znaczy ze jej nie ma smile.gif
Moze literowke jakac zrobiles przy tworzeniu tej tabeli, moze masz cos z malej litery a powinno byc z duzej lub na odwrot.
guilty82
nospor tak, to byla literowka zamiast INSERT INTO text mialo byc INSERT INTO domki...
coz.. poczatki bywaja trudne. dzieki za pomoc
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.