Webboard

Pełna wersja: System avatarów
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Próbuje jakoś sobie ogarnąć system avatarów, żeby tak nudno nie było, ale coś mi nie wychodzi i w ogóle skrypt się nie chce wykonać.
Kod php
Kod PHP:
// System Avatarów

  
if (isset($_POST['avatar']) && isset($_GET['changeavatar'])) {
      
$changeavatar trim($_GET['changeavatar']);
      if (
$changeavatar === 1) {
          
$max_size 1024*1024;
          if (empty(
$_FILES['avatar']['tmp_name']) === false) {
              
$file_ext end(explode('.'$FILES['avatar']['name']));

              if (
in_array(strtolower($file_ext), array("jpg""jpeg""png""gif")) === false) {
                  
$_SESSION['avatar_error'] = "Twój awatar musi być obrazem";
              }
              
$avatar $_FILES['avatar']['tmp_name'];
              
$uid $_SESSION['loggeduid'];
          }
          
$query $db->prepare('UPDATE `users` SET `avatar`=:avatar WHERE `uid` = :uid');
          
$query->bindValue(':avatar'$avatarPDO::PARAM_STR);
          
$query->bindValue(':uid'$uidPDO::PARAM_INT);
          
$query->execute();
      }
  } 
Kod html
Kod PHP:
<form method="post" action="./?p=profile&uid={$uid1}&changeavatar=1" enctype="multipart/form-data">
            <
input name="avatar" type="file" class="btn btn-primary" style="max-width: 100%;">
            <
input type="submit" class="btn btn-primary" value="Wyślij Avatar">
          </
form

Struktura katalogów.
root/pages/profile.php
root/themes/profile.tpl
Ale co nie działa? :) jakieś błędy?
No właśnie nic :D
0 błędów, po kliknięciu submita strona się przeładowuje i ustawia $_GET, a nie dodaje do bazy nazwy avatar(przykład, który próbuje wrzucić "thumb-13900.gif")
Przez chwile myślałem, że winą jest źle umieszczone zapytanie więc poprawiłem, ale dalej nie działa
Kod PHP:
if (isset($_POST['avatar']) && isset($_GET['changeavatar'])) {
      
$changeavatar trim($_GET['changeavatar']);
      if (
$changeavatar === 1) {
          
$max_size 1024*1024;
          if (empty(
$_FILES['avatar']['tmp_name']) === false) {
              
$file_ext end(explode('.'$FILES['avatar']['name']));

              if (
in_array(strtolower($file_ext), array("jpg""jpeg""png""gif")) === false) {
                  
$_SESSION['avatar_error'] = "Twój awatar musi być obrazem";
              }
              
$avatar $_FILES['avatar']['tmp_name'];
              
$uid $_SESSION['loggeduid'];
              
$query $db->prepare('UPDATE `users` SET `avatar`=:avatar WHERE `uid` = :uid');
              
$query->bindValue(':avatar'$avatarPDO::PARAM_STR);
              
$query->bindValue(':uid'$uidPDO::PARAM_INT);
              
$query->execute();
          }
      }
  } 
A tu cokolwiek jest po wysłaniu forma?
Kod PHP:
$_FILES['avatar'
Coś jest, ale czemu to
var_dump($_FILES['avatar']['tmp_name']);
Kod:
string(24) "E:\xampp\tmp\php4009.tmp"

Never mind pobawiłem się z kodem i działa.
Tylko jak sprawdzić czy wrzucony plik jest obrazem bo to mi nie działa, a używanie w kodzie html accept mija się trochę z celem
Kod PHP:
$file_ext end(explode('.'$_FILES['avatar']['name'])); // Linia 10
                  
if (in_array(strtolower($file_ext), array("jpg""jpeg""png""gif")) === false) { // Linia 11
                      
$_SESSION['avatar_error'] = "Twój awatar musi być obrazem"// Linia 12
                  

Error, a raczej Notice
Kod:
Notice: Only variables should be passed by reference in E:\xampp\htdocs\panel2\pages\profile.php on line 10

Poprawka kodu
Kod PHP:
$tmp explode('.'$_FILES['avatar']['name']);
                  
$file_extension end($tmp); 
I wszystko działa.
Przyczyna za dużo o jeden =
Kod PHP:
$changeavatar === 
(08.07.2019, 18:32)Patryk Stefański napisał(a): [ -> ]Tylko jak sprawdzić czy wrzucony plik jest obrazem bo to mi nie działa, a używanie w kodzie html accept mija się trochę z celem
Nie mija się z celem, a jest jednym z dwóch zabezpieczeń. Na backendzie extension możesz sprawdzić tak: https://www.php.net/manual/en/function.pathinfo.php

(08.07.2019, 18:32)Patryk Stefański napisał(a): [ -> ]Error, a raczej Notice
Notice dot. tego, że chcesz / chciałeś przekazać jako referencję jakiś obiekt lub zmienną globalną (?), ale nie wiem czym jest linia nr 10.

(08.07.2019, 18:32)Patryk Stefański napisał(a): [ -> ]Przyczyna za dużo o jeden =
Nie zadziałało, bo wszystko w webdevie jest stringiem :P zrzutuj sobie GETa na int, albo poczytaj o:
  1. https://www.php.net/manual/en/function.filter-input.php
  2. https://www.php.net/manual/en/function.filter-var.php
Notice dot. tego, że chcesz / chciałeś przekazać jako referencję jakiś obiekt lub zmienną globalną (?), ale nie wiem czym jest linia nr 10.
Linie 10 podałem
Kod PHP:
$file_ext end(explode('.'$_FILES['avatar']['name'])); // Linia 10 

Nie mija się z celem, a jest jednym z dwóch zabezpieczeń.
Takie zabezpieczenie, które można edytować :D

Nie zadziałało, bo wszystko w webdevie jest stringiem
Warto zapamiętać :D
(09.07.2019, 13:32)Patryk Stefański napisał(a): [ -> ]Takie zabezpieczenie, które można edytować
Dlatego robi się drugie po stronie backendu :P

(09.07.2019, 13:32)Patryk Stefański napisał(a): [ -> ]Linie 10 podałem
No, to chodziło o $_FILES