Php resim adı güncellemeyi engelliyor
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
Soru hatalı mı? 👎
Eğer sorunun kurallara aykırı olduğunu düşünüyorsanız lütfen bize bildirin!
Cevaplar (6)
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");
}
}
?>
İ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?
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");
}
}
}
}
?>
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);
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:
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;
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.