Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL] Upload bannerów z wpisem do bazy
Forum PHP.pl > Forum > PHP
wyrdhamster
Mam zlepiony i ogarnięty skrypt w PHP do uploadu plików:

*Formularz:
  1. <form enctype="multipart/form-data" action="bannersadd.php" method="POST">
  2. <input type="hidden" name="MAX_FILE_SIZE" value="500000000000" /> <input
  3. name="plik" type="file" /> <input type="submit" value="Wyślij plik" />
  4. </form>


*Skrypt:
  1. <?php
  2. // podłączamy plik connection.php
  3. require "connection.php";
  4. // wywołujemy funkcję connection()
  5. connection();
  6.  
  7. $path = $_SERVER['DOCUMENT_ROOT'];
  8. $sciezka = 'psw'; // można wywalić później
  9. $katalog = $path.'/'.$sciezka.'/banners';
  10. $plik_tmp = $_FILES['plik']['tmp_name'];
  11. $plik_nazwa = $_FILES['plik']['name'];
  12. $plik_rozmiar = $_FILES['plik']['size'];
  13.  
  14.  
  15. if(is_uploaded_file($plik_tmp)) {
  16. move_uploaded_file($plik_tmp, $katalog);
  17. echo "Plik: <strong>$plik_nazwa</strong> o rozmiarze
  18. <strong>$plik_rozmiar bajtów</strong> został przesłany na serwer!";
  19. }
  20.  
  21. if(isset($_POST['submit'])) {
  22. $zapytanie = "INSERT INTO banners ( filename ) VALUES ('$plik_nazwa')";
  23. mysql_query($zapytanie) or die(mysql_error());
  24. print("<h1>Dane zostały dodane<br />");
  25. }
  26. ?>


Od dwóch dni się z nim gryze i nie mam pojęcia co jest nie tak. sciana.gif

Formularz działa, pobiera plik, ale skrypt wrzucający na serwer już nie, i wywala takie o to komunikaty:

Warning: move_uploaded_file(/home/klient.dhosting.pl/adkl/psw/banners) [function.move-uploaded-file]: failed to open stream: Is a directory in /home/klient.dhosting.pl/adkl/psw/bannersadd.php on line 21

Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move '/home/klient.dhosting.pl/adkl/.tmp/phpNSNMEH' to '/home/klient.dhosting.pl/adkl/psw/banners' in /home/klient.dhosting.pl/adkl/psw/bannersadd.php on line 21

Plik: przód.jpg o rozmiarze 25726 bajtów został przesłany na serwer!


Czy ktoś może mi powiedzieć co tu może być nie tak?
bim2
Cytat
failed to open stream: Is a directory in

Na 100% jest taki katalog i nadane ma chmody poprawne?
wyrdhamster
Cytat
Na 100% jest taki katalog i nadane ma chmody poprawne?


Istnieje on od 36 godzin, a chmoda sprawdzałem z n razy już teraz. Ale zapytam się żeby być pewnym na 1000% - powinno być 777? Może to być wina hostingu?
ChrisB
  1. move_uploaded_file($plik_tmp, $katalog);


jako parametr przyjmuje:
1)nazwe pliku w tempie to jest ok
2)nazwe pliku gdzie ma przeniesc (teraz masz tam tylko katalog gdzie ma przeniesc i o to sie pieni)

plus pisanie że się powiodło bez sprawdzenia czy się powiodło jest lekko rzecz ujmując:D
ogolnie o to chodzi:
  1. move_uploaded_file($plik_tmp, $katalog.'jakasnazwa.xxx');
darko
No tak, a dlaczego nie podajesz nazwy pliku tylko sam folder jako destination dla funkcji move_uploaded_file questionmark.gif

Linie 15-19 zamieniłbym na to:

  1. if(is_uploaded_file($plik_tmp)) {
  2. if(move_uploaded_file($plik_tmp, $katalog."/".str_replace(" ","_",$plik_nazwa))) {
  3. echo "Plik: <strong>$plik_nazwa</strong> o rozmiarze <strong>$plik_rozmiar bajtów</strong> został przesłany na serwer!";
  4. } else {
  5. echo "Błąd przesyłania pliku!";
  6. }
  7. }
wyrdhamster
Cytat(darko @ 2.12.2009, 23:34:22 ) *
No tak, a dlaczego nie podajesz nazwy pliku tylko sam folder jako destination dla funkcji move_uploaded_file questionmark.gif

Bo myślałem ze wystarczy wskazać tylko katalog docelowy...

Dziękuję, zaraz wypróbuje poprawki... smile.gif

I działa. smile.gif Przesyła pliki jak trzeba. Jeszcze raz dzięki darko. guitar.gif

Ale pojawił się inny problem - nie robi wpisu do bazy powiązanego z uploaddem. Struktura tabeli banners:

  1. CREATE TABLE IF NOT EXISTS `banners` (
  2. `id_banner` int(5) NOT NULL AUTO_INCREMENT,
  3. `filename` varchar(30) collate utf8_bin NOT NULL,
  4. PRIMARY KEY (`id_banner`)
  5. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=1 ;
darko
  1. $wpis_do_bazy = $katalog."/".str_replace(" ","_",$plik_nazwa);
  2. if(is_uploaded_file($plik_tmp)) {
  3. if(move_uploaded_file($plik_tmp, $wpis_do_bazy)) {
  4. echo "Plik: <strong>$plik_nazwa</strong> o rozmiarze <strong>$plik_rozmiar bajtów</strong> został przesłany na serwer!";
  5. } else {
  6. echo "Błąd przesyłania pliku!";
  7. }
  8. }

i dalej...
  1. $zapytanie = "INSERT INTO banners VALUES (null, '$wpis_do_bazy')";
wyrdhamster
Dziwne, ciągle nie robi nowego wpisu do bazy, choć linki przesyłają się aż miło... blinksmiley.gif Ponieważ są jakieś porblemy także ze sciagniem newsów do wyświetlenia, może problemem jest źle napisania konfiguracja połączenia? Oto skrypt connection.php:

  1. <?php
  2. /******************************************************
  3. * connection.php
  4. * konfiguracja połączenia z bazą danych
  5. ******************************************************/
  6.  
  7. function connection() {
  8. // serwer
  9. $mysql_server = "***";
  10. // admin
  11. $mysql_admin = "***";
  12. // hasło
  13. $mysql_pass = "***";
  14. // nazwa baza
  15. $mysql_db = "***";
  16. // nawiązujemy połączenie z serwerem MySQL
  17. @mysql_connect($mysql_server, $mysql_admin, $mysql_pass)
  18. or die('Brak połączenia z serwerem MySQL.');
  19. // łączymy się z bazą danych
  20. @mysql_select_db($mysql_db)
  21. or die('Błąd wyboru bazy danych.');
  22. }
  23.  
  24. ?>


Oczywisćie *** to dane prywatne, których nie ujawnię na forum. dry.gif
wyrdhamster
Ten skrypt, wyświetlający newsy z bazy...
  1. <?php
  2. include "connection.php";
  3. connection();
  4. $sqlcount = "SELECT COUNT(id_news) ile FROM news";
  5. $resultcount = mysql_query ($sqlcount,$conn) or die(mysql_error());
  6. $rowcount = mysql_fetch_array($resultcount);
  7. $count = $rowcount["ile"];
  8. $l2 = 10;
  9. if (isset($_GET["l1"])){
  10. $l1 = $_GET["l1"];
  11. }
  12. else {
  13. $l1 = 0;
  14. }
  15. $sql = "SELECT news_name, user_name, date, n.info info
  16. FROM news n JOIN users u ON n.user_id = u.id_user
  17. ORDER BY date DESC
  18. LIMIT ".$l1.", ".$l2;
  19. $result = mysql_query ($sql,$conn) or die(mysql_error());
  20. $cont = "";
  21. while ($row = mysql_fetch_array($result)) {
  22. $cont .= "<div class='news'><h3>";
  23. $cont .= $row["news_name"];
  24. $cont .= "</h3><div><span class='user'>";
  25. $cont .= $row["user_name"];
  26. $cont .= "</span><span class='date'>";
  27. $cont .= $row["date"];
  28. $cont .= "</span></div><div class='info'>";
  29. $cont .= $row["info"];
  30. $cont .= "</div></div>";
  31. }
  32. echo $cont;
  33. if (($l1+10) < $count){
  34. echo "<a href='news.php?l1=".($l1+10)."'>zobacz wcześniejsze... </a>";
  35. }
  36. if ($l1 > $count){
  37. echo "<a href='news.php?l1=".($l1-10)."'>zobacz późniejsze... </a>";
  38. }
  39.  
  40. ?>


Generuje tylko takie ostrzeżenie:

Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource in /home/klient.dhosting.pl/adkl/psw/news.php on line 5

Może rzeczywiście coś jest nie tak z połączeniem z bazą, z connection.php?

Cytat
  1. <?php
  2. function lacz_bd() {
  3. $wynik = new mysqli('localhost', 'root', '' , 'test2');
  4. if (!$wynik) {
  5. throw new Exception('Połączenie z serwerem bazy danych nie powiodło się');
  6. } else {
  7. return $wynik;
  8. }
  9. }
  10.  
  11. ?>


Zakładając że miało być w kodzie mysqli('<serwer>', '<user>', '<hasło>' , '<baza>'), to nadal nie chodzi to połaczenia. Teraz dowala jeszcze taki błąd:

Warning: mysqli::mysqli() [mysqli.mysqli]: (HY000/2003): Can't connect to MySQL server on 'air.dhosting.pl' (111) in /home/klient.dhosting.pl/adkl/psw/connection.php on line 26

(Taki duzy numer linii, bo wcześniejszą funkcje za komentowałem, i wkleiłem twoją, onkel. )
bim2
Czytaj błędy jakie ci wyskakują, a jak ich nie rozumiesz to naucz się angielskiego.

Can't connect to MySQL server on 'air.dhosting.pl' -> Nie można się połączyć z serwerem MySQL 'air.dhosting.pl'

Rozumiesz w czym tkwi problem już?
wyrdhamster
Problem był w tym że nie łaczyłem się z baza SQl tylko FTPem. wstydnis.gif

Kumpel jednak zapropował inny skrypt łączenia się z bazą.
  1. <?php
  2. $conn = mysql_connect("<serwer_sql>", "<user>", "<hasło>")
  3. OR die(mysql_error());
  4. $db = mysql_select_db("<baza>")
  5. OR die(mysql_error());
  6. mysql_query("SET NAMES 'latin2'");
  7. ?>

darko
Lepiej mysql_query("SET NAMES 'utf8'"); jak już.

Daj jeszcze print_r(mysql_connect($mysql_server, $mysql_admin, $mysql_pass)); powinno być resource id# jak nie ma, to nie jesteś w ogóle połączony
wyrdhamster
Okej, wprowadziłem poprawke odnośnie UTFa.

Mam teraz skrypt, niby nie bezpośrednio powiązny z tematem, ale jego uzupełninie - chodzi o skrypt wyświetlający obrazki z pomocą bazy danych i pozwalający dany z nich wywalić, zarówno z serwera jak i bazy. Tutaj jest kod:
  1. <?php
  2. require "conn.inc.php";
  3. $path = str_replace('/dashboard/banners_delete.php','',$_SERVER['PHP_SELF']);
  4. $sciezka = 'psw'; // można wywalić później
  5. $katalog = "$path/banners";
  6.  
  7. $banners = mysql_query('SELECT * FROM banners', $conn) or die("Nie udało się pobrać danych z bazy") ;
  8.  
  9. while($row = mysql_fetch_assoc($banners)){
  10. foreach($row as $key => $value) {
  11. $$key = $value;
  12. }
  13. $link="$katalog/$filename";
  14. echo "<div class='banner'><img src='$link' alt='$filename' ></br>";
  15. echo '<form name="usun" id="usun" method="post" action="banners_delete.php"/>';
  16. echo '<input type=hidden name=id value="$id" />';
  17. echo '<input type=submit value="Usuń" onclick="return usun();"/>';
  18. echo '</form></div>';
  19. }
  20.  
  21. function usun()
  22. {
  23. $numer=$id;
  24. unlink("$katalog/$filename");
  25. $sql = "DELETE FROM `banners` WHERE `id_banner`='$numer'";
  26. return mysql_query($sql, $conn) or die("Nie udało się usunąć danych z bazy") ;
  27. }
  28. ?>


Obrazki się wyświetlają, natomiast przycisk nie usuwa wpisu - wiem ze coś z nimi nie tak, ale nie jestem pewien co. Pewnie przesyłanie tego id do funkcji usun().
darko
Prawdopodobnie funkcja usun nie widzi zmiennych:

$numer, $id, $katalog oraz $filename

Nie wiem dokładnie gdzie definiujesz te zmienne w każdym razie powinieneś albo przekazać je do funkcji usuń albo uczynić globalnymi wewnątrz funkcji:

global $numer, $id, $katalog, $filename;
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.