O kadar her yerde, çünkü bu cevap PHP'nin PDO kütüphane üzerine bir vurgu vardır.
Kısa bir hatırlatma - mysql istemci-sunucu mimarisi. Asıl veritabanı mysql sunucu değil, sadece orada, ama mysql sunucusu (bunlar ayrı kişiler konum) için görüşmeler şey ayrı mysql istemci sürücüsü de var çünkü bu önemlidir. Sen tür sorta mysql istemci ve pdo karıştırılır söyleyebiliriz.
Eğer kullandığınız zaman set names utf8
, sen mysql standart bir sql sorgu vermek. Sql sorgu PDO geçmesine etmez ve ardından mysql istemci kitaplığı aracılığıyla, ve sonra nihayet mysql sunucuyu ulaşırken, SADECE mysql sunucu ayrıştırır ve bu sql sorgusu yorumlar. Bu mysql sunucunun bu yüzden karakter kümesi ve kodlama değişti bildirerek pdo veya mysql istemci geri herhangi bir mesaj göndermek, ve değil çünkü önemli pdo bu oldu aslında tamamen cahil.
Bu geçerli karakter kümesi farkında değilse istemci kütüphanesi düzgün dizeleri işleyemez, çünkü bunu yapmak için önemli değil. En yaygın operasyonlar doğru karakter setini bilmeden istemcisi olmadan düzgün çalışmaz, ama örneğin PDO::quote gibi dize kaçan olmaz biri. Bunun için varsayılan ayar oldu, çünkü mysql kullanıcılar farkında emulated prepared statements kullanın: Eğer hazırlanmış ifadeler kullanmak, ancak gerçeği PDO'nun büyük çoğunluğu olduğu için böyle manuel ilkel dize kaçan hakkında endişelenmenize gerek yok düşünüyorum PDO: artık çok uzun bir süre için mysql sürücüsü. Mysql API tarafından sağlanan bir taklit hazırlanmış deyimi gerçek yerli MySQL hazırlanmış deyimleri kullanmaz; Bunun yerine, php PDO::quote()
tüm değerleri çağıran, ve sizin için kote değerleri ile tüm tutucular str_replacing'ing eşdeğer yapar.
Eğer kullandığınız set karakteri biliyorum sürece düzgün bir dize kaçmıyor beri set adları yoluyla belirli karakter setleri için değiştirdiyseniz, bu taklit hazırlanmış deyimleri SQL enjeksiyon açıktır. Eğer farklı bir karakter kümesine yönelik kaçan bir düzeni kullanmak olursa olsun sql enjeksiyon olasılığı, hala dizeleri zarar verebilir.
Bağladığınızda PDO MySQL sürücüsü için, specifying it in the DSN tarafından, karakter kümesi belirtebilirsiniz. Bunu eğer istemci kütüphanesi belirlenen karakterin farkında olacaktır.
$dsn = 'mysql:host=localhost;dbname=testdb;charset=utf8';
Ama yanlış dize öncelemeli tek sorun değildir. Sütun adları dizeleri olarak belirtilen, ve böylece tekrar kodlama konular çünkü Örneğin, ayrıca PDO::bindColumn kullanarak sorunları olabilir. Bir örnek ütube
(Umlaut'u not) adında bir sütun adı olabilir, ve size set adları yoluyla utf8
için latin
geçiş, ve sonra deneyin { [(4)]} php dosyası utf8 kodlanmış olduğundan ütube
bir utf8 kodlanmış bir dize olmak. Bu bir latin1 varyantı olarak dize kodlamak gerekir, işe yaramaz ... ve şimdi devam deli her türlü var.