Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Funkcja ignoruje warunek if
Forum PHP.pl > Forum > Przedszkole
Niedowiarek
Witam, mam taki oto skrypt na zmianę wielkości obrazka:

  1. function avatar_resizer($avatar_link, $avatardimensions="80|80")
  2. {
  3. $rozmiar = getsizeimage($avatar_link);
  4.  
  5. if($avatar_link[0] > 80 && $avatar_link[1] > 80) {
  6.  
  7.  
  8. $avatar_link = htmlspecialchars_uni($avatar_link);
  9. $avatar_dimensions = explode("|", $avatardimensions);
  10. if($avatar_dimensions[0] && $avatar_dimensions[1])
  11. {
  12. $avatar_width_height = "width=\"{$avatar_dimensions[0]}\" height=\"{$avatar_dimensions[1]}\"";
  13. }
  14. $avatar = "<img src=\"{$avatar_link}\" alt=\"\" $avatar_width_height />";
  15. }
  16. else
  17. {
  18. $avatar = '';
  19. }
  20.  
  21.  
  22. return $avatar;
  23. }
  24. }


Działał, dopóki nie dodałem instrukcji if, która sprawdza czy obrazek ma już 80x80, a jeżeli ma to przejść do końca funkcji.

Teraz wywala błąd: Parse error: syntax error, unexpected '}' in /virtual/w/o/workdomain.ugu.pl/global.php on line 547

Linijka 547 to ostatnia klamra zamykająca.
rocktech.pl
Witam.

Jakiego IDE używasz?

Usuń ostatnią klamrę nie będę złośliwy smile.gif
Niedowiarek
Na to to ja też wpadłem haha.gif Ale wtesy znowóż wyskakuje:

Fatal error: Call to undefined function getsizeimage() in /virtual/w/o/workdomain.ugu.pl/global.php on line 526
mortus
Klamer jest za dużo, ale i usunięcie tej ostatniej nie pomoże. W instrukcji warunkowej if posługujesz się zmienną $avatar_link, a powinieneś chyba użyć zmiennej $rozmiar.

A funkcja nazywa się getimagesize().

EDIT: Poza tym wydaje mi się, że obraz powinien być skalowany proporcjonalnie, bo inaczej będzie zniekształcony.
Niedowiarek
Okej, zmieniłem na getimagesize() oraz $avatar_link na $rozmiar, lecz teraz wyskoczyło ostrzeżenie:

Warning [2] getimagesize(images/avatars/php.gif?dateline=1325777488) [function.getimagesize]: failed to open stream: No such file or directory - Line: 526 - File: global.php PHP 5.2.17-ugu1 (Linux)

Wyniakłoby z niego że nie ma takiego obrazku, jaki chcę mieć w avatarze, ale sprawdziałem, i jest.

Tutaj obecna funkcja:

  1. function avatar_resizer($avatar_link, $avatardimensions="80|80")
  2. {
  3. $rozmiar = getimagesize($avatar_link);
  4.  
  5. if($rozmiar[0] > 80 && $rozmiar[1] > 80) {
  6.  
  7.  
  8. $avatar_link = htmlspecialchars_uni($avatar_link);
  9. $avatar_dimensions = explode("|", $avatardimensions);
  10. if($avatar_dimensions[0] && $avatar_dimensions[1])
  11. {
  12. $avatar_width_height = "width=\"{$avatar_dimensions[0]}\" height=\"{$avatar_dimensions[1]}\"";
  13. }
  14. $avatar = "<img src=\"{$avatar_link}\" alt=\"\" $avatar_width_height />";
  15. }
  16. else
  17. {
  18. $avatar = '';
  19. }
  20.  
  21.  
  22. return $avatar;
  23. }
  24.  
  25.  
  26. $avatar = avatar_resizer($mybb->user['avatar']);
mortus
Funkcja jako argument $avatar_link przyjmuje adres obrazka, a nie adres pliku PHP, który ten obrazek generuje (chyba).
Niedowiarek
No ale w takim razie funkcja powinna wygenerować to ostrzeżenie również jak nie było żadnej modyfikacji (instrukcja if sprawdzająca wielkość obrazka), a działała. ;/
mortus
Ja nie mówię, że funkcja nie działa, tylko że dostaje nieprawidłowe dane na wejście. Sprawdź, co kryje zmienna $mybb->user['avatar'], powinien to być adres obrazka z odpowiednim rozszerzeniem.
Niedowiarek
Okej, pozmieniałem teraz co nie co, i funkcja wygląda tak:

  1. <?php
  2. function avatar_resizer($avatar_link)
  3. {
  4. $rozmiar = getimagesize($avatar_link);
  5.  
  6. if($rozmiar[0] > 80 || $rozmiar[1] > 80) {
  7.  
  8. if($rozmiar[0] > 80) {
  9.  
  10. $avatardimensions[0] = 80;
  11. $avatardimensions[1] = (80*$avatardimensions[1])/$avatardimensions[0];
  12.  
  13. return $avatardimensions;
  14.  
  15. } else if($rozmiar[1] > 80) {
  16.  
  17. $avatardimensions[1] = 80;
  18. $avatardimensions[0] = (80*$avatardimensions[0])/$avatardimensions[1];
  19.  
  20. return $avatardimensions;
  21. }
  22.  
  23. if($avatar_link)
  24. {
  25. $avatar_link = htmlspecialchars_uni($avatar_link);
  26.  
  27. if($avatardimensions[0] && $avatardimensions[1])
  28. {
  29. $avatar_width_height = "width=\"{$avatardimensions[0]}\" height=\"{$avatardimensions[1]}\"";
  30. }
  31. $avatar = "<img src=\"{$avatar_link}\" alt=\"\" $avatar_width_height />";
  32. }
  33. else
  34. {
  35. $avatar = '';
  36. }
  37.  
  38. return $avatar;
  39. }
  40.  
  41. }
  42.  
  43.  
  44. $avatar = avatar_resizer($mybb->user['avatar']);
  45. ?>


I teraz obrazek się wyświetla, ale tak samo kiedy nie było skali, więc jeżeli bok ma mniej niż 80 to go rozciąga.
wookieb
Swojego syna też nazwiesz "Błąd" bo nie rozumiesz po co nazywa się pewne rzeczy?
Temat: Jak poprawnie zatytulowac watek
Niedowiarek
@Refresh
mortus
Ale przecież w tym żadnych cudów nie ma:
  1. function avatar_resizer($avatar_link) {
  2. $defaultWidth = 80;
  3. $defaultHeight = 80;
  4. list($avatarWidth, $avatarHeight) = getimagesize($avatar_link);
  5. if($avatarWidth > $avatarHeight) {
  6. $newWidth = $defaultWidth;
  7. $newHeight = (int)($defaultWidth * $avatarHeight / $avatarWidth);
  8. if($newHeight > $defaultHeight) {
  9. $newWidth = (int)($defaultHeight * $avatarWidth / $avatarHeight);
  10. $newHeight = $defaultHeight;
  11. }
  12. } elseif($avatarHeight > $avatarWidth) {
  13. $newWidth = (int)($defaultHeight * $avatarWidth / $avatarHeight);
  14. $newHeight = $defaultHeight;
  15. if($newWidth > $defaultWidth) {
  16. $newWidth = $defaultWidth;
  17. $newHeight = (int)($defaultWidth * $avatarHeight / $avatarWidth);
  18. }
  19. } else {
  20. $newWidth = $defaultWidth;
  21. $newHeight = $defaultHeight;
  22. }
  23. if($avatar_link) {
  24. $avatar_link = htmlspecialchars_uni($avatar_link);
  25. $avatar = "<img src=\"{$avatar_link}\" alt=\"\" width=\"{$newWidth}\" height=\"{$newHeight}\" />";
  26. } else {
  27. $avatar = '';
  28. }
  29. return $avatar;
  30. }

Kodu na proporcjonalne przeliczenie wysokości i szerokości obrazka w sieci jest całe mnóstwo. Wystarczy dobrze poszukać.

EDIT: Jeśli coś dalej nie będzie działać, to sprawdź, co zwraca funkcja getimagesize() - var_dump($avatarWidth, $avatarHeight) w moim kodzie lub var_dump($rozmiar) w Twoim kodzie.
Niedowiarek
Hmm.. Jest tak jak powiedziałeś. Getimagesize pobiera obrazek z linku, a ja mam na dysku. Jest jakaś inna funkcja sprawdzająca wielkość obrazka?

Edit: Taki warning wyskakuje: Warning [2] getimagesize(images/avatars/php.gif?dateline=1325855477) [function.getimagesize]: failed to open stream: No such file or directory - Line: 527 - File: global.php PHP 5.2.17-ugu1 (Linux)
mortus
Problemem jest przekazywanie niewłaściwej wartości do funkcji avatar_resizer(), a nie nieprawidłowe działanie funkcji getimagesize(). Coś jest skopane w innym miejscu aplikacji, tzn. w miejscu w którym pobierasz adresy url obrazków.
Niedowiarek
  1. $avatar = avatar_resizer($mybb->user['avatar']);


Tutaj pobieram obrazekdo funkcji.
mortus
Pisałem już, abyś sprawdził co zawiera zmienna $mybb->user['avatar']: var_dump($mybb->user['avatar']);. Jeśli zawiera adres pliku PHP, to poszukaj tego pliku i sprawdź, co on takiego robi (być może odpowiada za przeskalowanie obrazka).
Niedowiarek
string(44) "images/avatars/mysql.png?dateline=1325856623"


To mi wyszło, znalazłem też w usercp.php taką linijkę: "avatar" => $avatar['avatar'].'?dateline='.TIME_NOW

@refresh
mortus
Trzeba się pozbyć tej końcówki:
  1. $avatar = avatar_resizer(substr($mybb->user['avatar'], 0, strpos($mybb->user['avatar'], '?') - 1);
Niedowiarek
Tzn. zamienić to:

  1. $avatar = avatar_resizer($mybb->user['avatar']);


na to co podałeś?

Nie mogę tego usunąć całkowicie bo do tej zmiennej się odnoszę w szablonie MyBB.
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.