v2.5.2
Giriş yap

Php resim adı güncellemeyi engelliyor

yazilimyolcusu
109 defa görüntülendi

Merhaba arkadaşlar. Şöyle bir sorunum var. İnternetteki sunucuda çalışırken, siteye bir resim ekliyorum. Resmi de internetten buldum, o yüzden şöyle bir ismi var, örnek olarak: "siteye-konulan-birinci-resim.jpg" gibi. Resmin adında araya tire işareti konulduğu için resmi güncelleyemedim. Belki de "openssl_encrypt" kullandığım için dosya adı problem çıkarttı. Şu şekildeki resimlere bir sıkıntı çıkartmıyor. Mesela: "birinciresim.jpg" gibi. Resme yeniden isim mi vermeliyim? Nasıl verilir? Sorun nereden kaynaklanıyordur acaba? Aşağıdaki hatayı veriyor.

Uncaught mysqli_sql_exception: Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8mb4_general_ci,COERCIBLE) for operation '=' in
Cevap yaz
Cevaplar (6)
yazilimyolcusu
85 gün önce

Bu konuda bilgisi olan yok mu arkadaşlar?

yazilimyolcusu
85 gün önce

Sorun yaratan resimler çoğunlukla şu şekilde oluyor. Resim adındaki boşluklar "+" işaretine dönüşüyor büyük ihtimal. "+" işaretini nasıl kaldırabilirim kodlardan veya nasıl dönüştürebilirim?
birinci resim (1).jpg
Kodları en son şu şekilde düzenledim ama sorunu halledemedim.

<?php
  if(isset($_FILES['dosya'])) {

    $boyut = $_FILES['dosya']['size'];

      if($boyut > (1024*1024*3)) {
        echo 'Dosya 3MB den büyük olamaz.';
      } else {
        $tip = $_FILES['dosya']['type'];
        $isim = $_FILES['dosya']['name'];
        $newfilename = round(microtime(true)) . $isim;
        $search = array(" ","-","+");
        $replace = array("_","_","_");
        $isimdegistir = str_replace($search, $replace, $newfilename);
        $uzanti = explode('.', $isimdegistir);
        $uzanti = $uzanti[count($uzanti)-1];

        if($tip != 'image/jpeg' && $tip != 'image/png' && $tip != 'image/jpg') { ?>
          <div id="uyaripenceresi"></div>

          <?php
          header("refresh:0; url=anasayfaresimekle.php");
        } else {
          $dosya = $_FILES['dosya']['tmp_name'];
          copy($dosya, '../../images/anasayfaresim/' . $isimdegistir);


          $query = "INSERT INTO anasayfaresim (anasayfaresim_resim) VALUES('$isimdegistir')";
        }
      }

    if (mysqli_query($db, $query) === TRUE) {
      echo '<div style="margin-top:25px; text-align:center; font-size:35px;">
      Kayıt Başarıyla Gerçekleştirildi</div>';
      header("Refresh:1; url=anasayfaresimekle.php");
    } else {
      echo '<div style="margin-top:25px; text-align:center; font-size:35px;">
      Kayıt Başarısız. <br> Geldiğiniz Sayfaya Yönlendiriliyorsunuz.</div>';
      header("refresh:5; url=anasayfaresimekle.php");
    }
  }
?>
yazilimyolcusu
86 gün önce

İzlediğim bir vidyoda "+" işareti varsa eğer şifrede o "+" işareti boşluk yaratıyormuş ya da öyle bir şey. Dikkat ettim, "+" işareti olan hiç bir şifreli resim çalışmıyor. "preg_replace" ile veya "str_replace" ile düzeltmeye kalktığımda ise "+" işaretini operatör olarak algılıyor. Mesela

preg_replace("-");

dediğimde eksi işaretinin rengi sarı iken,

preg_replace("+");

dediğimde rengi kırmızı çıkıyor. Nasıl çözebiliriz?

yazilimyolcusu
86 gün önce

Dediğiniz gibi yaptım. Veritabanı dosyasına şöyle yazdım:

mysqli_set_charset($db,"utf8");

Veritabanı tablomu da "utf8mb4_general_ci" yaptım. Yalnız şöyle bir hata alıyorum şua an.

unlink(./../../images/anasayfaresim/170698815640 ־�.CoF�~�): No such file or directory in

error.log'da ise hata şu şekilde

unlink(./../../images/anasayfaresim/170698815640\n\xd6\xbe\xef\xbf\xbd.CoF\xef\xbf\xbd~\xef\xbf\xbd): No such file or directory in

Resmin verdiği satırda da şu kodlar var.

unlink("./../../images/anasayfaresim/$resimsil");

Bazı resimlerde hata alıyorum. Ne siliyor ne de düzenleme yapabiliyorum.
Şu isimde bir resim hata çıkartmazken : "4381132274.jpg"
şu isimde bir resim çıkartıyor: "4807910204.jpg"
Tabi ki şifrelendikten sonra 21 haneli bir karaktere dönüşüyorlar her iki resim ismi.
Hatta ben size kodların hepsini koyayım. Ekleme işleminde de aynı kodlar var. Ne yapmam lazım.

<?php
if(isset($_FILES['dosya'])) {

    $boyut = $_FILES['dosya']['size'];

    if($boyut > (1024*1024*3)) {
        echo 'Dosya 3MB den büyük olamaz.';
    } else {
        $tip = $_FILES['dosya']['type'];
        $isim = $_FILES['dosya']['name'];
        $newfilename = round(microtime(true)) . $isim;
        $isimdegistir = str_replace("-","_","$newfilename");
        $uzanti = explode('.', $isimdegistir);
        $uzanti = $uzanti[count($uzanti)-1];

        if($tip != 'image/jpeg' && $tip != 'image/png' && $tip != 'image/jpg') { ?>
        <div id="uyaripenceresi"></div>

        <?php
        header("Location: anasayfaresimlistele.php");
        } else {
            $dosya = $_FILES['dosya']['tmp_name'];
            copy($dosya, '../../images/anasayfaresim/' . $isimdegistir);


            $anasayfaresimguncellesorgusu = "UPDATE anasayfaresim SET anasayfaresim_resim='$isimdegistir' WHERE anasayfaresim_id='$duzenlesonuc' and anasayfaresim_resim='$duzenlesilresimsonuc'";
            $anasayfaresimguncellesorgu = mysqli_query($db, $anasayfaresimguncellesorgusu);
            if ($anasayfaresimguncellesorgu) {
                unlink("./../../images/anasayfaresim/$duzenlesilresimsonuc"); 
                echo '<div style="margin-top:25px; text-align:center; font-size:35px;">
                Düzenleme Başarıyla Gerçekleştirildi</div>';
                header("Refresh:2; url=anasayfaresimlistele.php");
            } else {
                echo '<div style="margin-top:25px; text-align:center; font-size:35px;">
                Düzenleme Başarısız. <br> Geldiğiniz Sayfaya Yönlendiriliyorsunuz.</div>';
                header("Refresh:4; url=anasayfaresimlistele.php");
            }
        }
    }
}
?>
yazilimyolcusu
87 gün önce

Merhaba. Aşağıdaki şekilde veritabanına "birinciresim.jpg" olarak yazdırabiliyorum ama klasöre giden resmin adı değişmiyor. Eğer değiştirilebilirse, resmi düzenle dediğimde o resim yerine başka bir resim koyarken şu hatayı vermez diye düşünüyorum. Bir de resmi yüklerken aşağıdaki şekilde kopyalama yaparak gönderiyorum. Bu yüzden problem çıkarıor olabilir mi? Bunu nasıl düzeltebiliriz?

$isim = $_FILES['dosya']['name'];
$isimdegistir = str_replace("-","","$isim");
unlink(./../resimler/resim/resimbirinciresim.jpg): No such file or directory in
copy($dosya, '../../resimler/resim/' . $newfilename);
gokcin
88 gün önce

Merhaba! Sorununuzun iki farklı kısmı var gibi görünüyor: dosya adı sorunu ve MySQL ile ilgili bir karakter seti uyumsuzluğu hatası.

Dosya Adı Sorunu:
Dosya adında tire işareti kullanmak genellikle sorun yaratmaz. Ancak, belirttiğiniz gibi "openssl_encrypt" fonksiyonu kullanılıyorsa, bu fonksiyonun çıktısı bazen özel karakterler içerebilir. Bu durumda, dosya adını sadece harf, rakam ve basit özel karakterlerle sınırlamak daha iyi bir uygulama olabilir. Örneğin, dosya adını "siteye_konulan_birinci_resim.jpg" gibi bir formata dönüştürebilirsiniz.

MySQL Karakter Seti Uyumsuzluğu:
Hata mesajında belirtilen "Illegal mix of collations" hatası, genellikle veritabanındaki sütunların ve karşılaştırma operatörlerinin farklı karakter setleri veya sıralama düzenleri kullanması durumunda ortaya çıkar. Bu durumu düzeltmek için aşağıdaki adımları izleyebilirsiniz:

  1. Veritabanı Karakter Seti Ayarı:
    MySQL veritabanınızın karakter setini kontrol edin ve mümkünse UTF-8 (utf8mb4_general_ci) olarak ayarlayın. Bu, genellikle çeşitli karakterlerin sorunsuzca işlenmesini sağlar.

    Örneğin:

    ALTER DATABASE your_database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
    
  2. Tablo ve Sütun Karakter Seti Ayarı:
    Eğer mümkünse, ilgili tablo ve sütunların karakter setini de kontrol edin ve aynı şekilde ayarlayın.

    Örneğin:

    ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
    

Bu adımları izledikten sonra, sorununuz çözülmelidir. Ayrıca, dosya adlarını basitleştirmek ve özel karakterleri kaldırmak, dosya işlemleri sırasında olası sorunları azaltabilir.