ďťż

[mysql/php]'problem z identyfikatorami [mysql/php]

       

Podstrony


telcocafe

Witam...problem jest taki:

dodaje zdjęcie w systemie zdjecieX.jpg gdzie X to liczba która jest zwiększana -> jeśli plik istnieje to X jest zwiększane o 1 i tak dopóki nie trafi na pusty numer. Wszystkie dane dodawane są do bazy dzięki czemu ID w tabeli zgadza się z X, ale kiedy usune zdjęcie to pojawia się problem...
dajmy na to, że mam 10 zdjęć i usuwam zdjecie5.jpg wtedy dzieje się następująca rzecz:

zdjecie5.jpg i wszystkie dane z tabeli o ID=5 są usuwane. Następnie gdy dodaje nowe zdjęcie to tworzy się zdjecie5.jpg (bo to pierwsza wolna liczba) ale w tabeli mamy ID=11 więc nie moge wyciągać danych wg. identyfikatora. Jak zrobić żeby nawet po usunięciu zdjęcia nowopowstałe było zdjecie11.jpg żeby zgadzało się z ID...czy może jest sposób żeby ID (auto_increment) zamiast 11 przyjmowało jak zdjęcie pierwszą wolną wartość?potrzebna pomoc



zrób przy tworzeniu zdjęcia tak:
$wynik=mysql_fetch_array(mysql_query("select * from zdjecia order by id desc;"));
$numerek=$wynik["id"]++;
$nazwazdj="zdjecie".$numerek.".jpg";
Użytkownik loguś edytował ten post 19 luty 2007, 20:13
a możesz pomóc? bo siedze ze 4 godzine i już troche nie czaje
$query = "INSERT INTO `fotografie` (foto_id, foto_title, foto_autor, foto_desc) "; $query .= "VALUES (NULL, '$tytul', '$autor', '$opis')"; $result = mysql_query($query); if(!$result){ print("Problem z bazą danych"); exit; } $katalog = 'zdjecia/zdjecie'; $nazwa = 1; while (file_exists($katalog.$nazwa.'.jpg')) $nazwa++; if(move_uploaded_file($_FILES['plik']['tmp_name'], $katalog.$nazwa.'.jpg')) { echo 'Plik został przesłany'; } else { echo 'Wystapił błąd!'; }

To jest skrypt dodawania zdjęcia. Tu to wstawić? Jak?
Użytkownik Dawid-San edytował ten post 19 luty 2007, 20:21
$query = "INSERT INTO `fotografie` (foto_id, foto_title, foto_autor, foto_desc) "; $query .= "VALUES (NULL, '$tytul', '$autor', '$opis')"; $result = mysql_query($query); if(!$result){ print("Problem z bazą danych"); exit; } $wynik=mysql_fetch_array(mysql_query("select * from fotografie order by foto_id desc;")); $numerek=$wynik["foto_id"]; $nazwazdj="zdjecie".$numerek.".jpg"; $katalog = 'zdjecia/'; $nazwa = 1; if(move_uploaded_file($_FILES['plik']['tmp_name'], $katalog.$nazwazdj.'.jpg')) { echo 'Plik został przesłany'; } else { echo 'Wystapił błąd!'; }



dobra a możesz mi coś poradzić? bo jednej rzeczy nie wziąłem pod uwagę zupełnie...

jak wyświetlam sobie fotki to (do tej pory) zliczałem po prostu ilość zdjec ($ilosc_zdjec) i robiłem pętle while $i <= $ilosc_zdjec echo bla bla bla

no ale teraz jest problem...jeżeli id w bazie może przyjąc wartość 20 a zdjęc będzie np. 10 to to nie ma racji bytu bo nie wyświetli zdjęć które mają większe ID niż $ilosc_zdjec...jak to rozwiazac?

$zrob=mysql_query("select * from fotografie order by foto_id desc;"); $ilefotek = mysql_num_rows($zrob);


$zrob=mysql_query("select * from fotografie order by foto_id desc;"); $ilefotek = mysql_num_rows($zrob);
Jeżeli potrzebna jest wyłącznie ilość wierszy jakie zwróciłoby zapytanie należy stosować COUNT(*)

SELECT COUNT(*) as ile FROM fotografie ORDER BY foto_id DESC;

ale to przecież tak czy siak dostanę taką samą wartość...nie ważne przecież czy zlicze ilość zdjęć z foldera czy ilość wpisów z tabeli....bo przecież ich jest tyle samo...

chyba prędzej potrzebuje pobrać ostatni ID czyli ten największy potem dać $i <= $ostatnie_id i zapytanie warunkowe z file_exists() tylko jak pobrać to ostatnie ID?

chodzi o wydajność zapytania. COUNT(*) w zapytaniu jest znacznie bardziej wydajniejsze od count($tablica) w php czy też od mysql_num_rows.

ale co mi po wydajności jak to nie działa jak potrzeba?:P
przecież nie w tym tkwi problem...potrzebuje rady jak rozwiązać ten problem, wydajnością będe się martwił potem

próbowałem coś z mysql_insert_id() ale nie zdaje egzaminu w tym wypadku
Użytkownik Dawid-San edytował ten post 19 luty 2007, 21:43
no teraz to ja już kompletnie nie rozumiem co ty chcesz osiągnąć. Chcesz pobrać największe id z bazy? oto kod:
$wynik=mysql_fetch_array(mysql_query("select * from fotografie order by foto_id desc;")); $najwiekszeid=$wynik["foto_id"];

loguś chce znaleźć odpowiedź i to jedyny pomysł mi przychodzi do głowy.

wyświetlanie fotografii do tej pory polegało na tym.
1. zliczam ilość zdjęć w katalogu i przypisuje wartość do $ilosc_zdjec
2. robie pętle whilee która ma się robić dopóki $i <= $ilosc zdjec
3. za każdym zwiększeniem $i wypisuje zdjecie: zdjecie1.jpg, zdjecie2.jpg, zdjecie3.jpg itp itd.

ale skoro teraz zdjec może być 5 a mogą się nazywać zdjęcie23.jpg albo zdjecie50.jpg to to nie zda egzaminu bo $ilosc_zdjec bedzie mialo wartosc 5 więc $i nigdy nie dojdzie do 50 i nie wyświetli pożadanego zdjęcia. Dlatego myśle, że skoro liczba przy nazwie jest taka sama jak ostatnie ID w tabeli to mogę zrobić tak:
1. do zmiennej $ilosc przypisuje wartosc największego ID
2. robie pętle while $i <= $ilosc
3. wewnątrz pętli sprawdzam czy zdjecie o podanym $i istnieje. Jesli istnieje wyświetla zdjęcie jeśli nie to $i++ i szukam dalej i tak do ostatniej wartości $ilosc

chyba, że masz lepsze rozwiażanie

mam lepsze
Można to zrobić bez użycia bazy$folder= dir("zdjecia"); while($nazwa= $folder->read()) { if(eregi(".jpg",$nazwa)) { echo "<img src='zdjecia/$nazwa'>"; } } }
Użytkownik loguś edytował ten post 19 luty 2007, 21:58
a pomożesz z przerobieniem tego na twój sposób?
for ($j = 1; $j <= $ilosc_zdjec; $j++) { if($j%3 == 1) echo "<tr>"; echo "<td width='438'> <a href='strona.php?zmienna=".$j."'> <img src='zdjecia/zdjecie".($j-1).".jpg' width='140' height='140' /></a> </td>"; if($j%3 == 0) echo "</tr>"; if($j == $ilosc_zdjec && $ilosc_zdjec%3 != 0) echo "<td colspan='".(3-$ilosc_zdjec%3)."'>&nbsp</td></tr> "; }

ten kod ma na celu wyświetlanie zdjeć w 3 kolumnach + dodanie linka z przekazaniem zmiennej id przez get żebym mógł się odwołąć na następnej podstronie do danych z tabeli wg. id
Użytkownik Dawid-San edytował ten post 19 luty 2007, 22:06
echo "<table><tr>" $j=1; $folder= dir("zdjecia"); while($nazwa= $folder->read()) { if(eregi(".jpg",$nazwa)) { if($j%3==1)echo"</tr><tr>"; $j++; $idek=str_replace("zdjecie", "", $nazwa); $idek=str_replace(".jpg", "", $nazwa); echo "<td><a href='strona.php?zmienna=$idek'><img src='zdjecia/$nazwa'></a></td>"; } } } echo "</tr></table>"
o coś takiego ci chodziło?
Użytkownik loguś edytował ten post 19 luty 2007, 22:28
w 90% tak...
nie da się żeby wartość zmiennej to było 18 a nie zdjecie18?
bo jeżeli da to już dalej nie bedzie najmniejszego problemu dla mnie

$idek=str_replace("zdjecie", "", $nazwa); $idek=str_replace(".jpg", "", $nazwa);
ten kod właśnie powoduje że to się zamienia, a co, nie działa?

no właśnie działą tak, że
strona.php?zmienna=$idek
to daje

strona.php?zmienna=zdjecie19

ale dobra chyba można to ominąć bo wystarczy, że do tabeli dodam dodatkowe pole
które będzie miało wypełniane nazwą (a nie tytułem) pliku czyli zdjecieX
i wtedy zamiast po ID bede dobierał po nazwie

he, no tak, już wiem co było źle, aż wstyd sie przyznać. To jest poprawiony kod który podaje ci id:
$idek=str_replace("zdjecie", "", $nazwa); $idek=str_replace(".jpg", "", $idek);

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • nvm.keep.pl

  • Sitedesign by AltusUmbrae.