PHP / MySQL kodlama sorunlar

7 Cevap php

EDIT: After feedback from my original post, I've change the text to clarify my problem.

Ben aşağıdaki sorgu (sahte kod) var:

$conn = mysql_connect('localhost', 'mysql_user', 'mysql_password');
mysql_query("SET NAMES 'utf8'; COLLATE='utf8_danish_ci';");

mysql_query("SELECT id FROM myTable WHERE name = 'Fióre`s måløye'", $conn);

Bu 0 satır döndürür.

Benim günlüğünde, ben bu bkz:

255 Connect     root@localhost on 
255 Query       SET NAMES 'utf8'; COLLATE='utf8_danish_ci'
255 Init DB     norwegianfashion
255 Query       SELECT id FROM myTable WHERE name = 'Fióre`s måløye'
255 Quit
  • Ben phpMyAdmin doğrudan sorguyu çalıştırırsanız, sonuç almak.
  • Tablo kodlama: UTF-8
  • HTML sayfası kodlama: UTF-8
  • Isimler aksan kullanan nerede (form girişinden) kayıtları ekleyebilir (örneğin "Fiore` s Hasselberg ")
  • "Isim LIKE '$ LabelName%'"> - kullanırken ben aksan ile kayıtlarını okuyabilir
  • DB bilgiler gayet iyi görünüyor

Ben isim aksan karakterleri olan herhangi satırları seçemezsiniz neden hiçbir ipucu var.

Ben gerçekten birisi bana yardımcı olabilir umuyoruz.

UPDATE 1: I've come to a compromise. I'll be converting accents with htmlentities when storing data, and html_entity_decode when retrieving data from the DB. That seems to work.

Şimdiye kadar gördüğüm tek dezavantajı, ben phpMySQL kullanarak düz yazı adları okunamıyor olmasıdır.

7 Cevap

Diğer cevaplar gösterdiği gibi, bu çok bir kodlama sorunu gibi görünüyor. Ben veritabanı gerçekten aldığında ne gösterebilir (http://dev.mysql.com/doc/refman/5.1/en/query-log.html) gibi sorgu günlüğü kapatarak öneririz.

UPDATE: I finally found a page explaining the dirty details of PHP and UTF-8 (http://www.phpwact.org/php/i18n/charsets). Also, make sure you read this (http://niwo.mnsys.org/saved/~flavell/charset/form-i18n.html) to understand how you to get proper data returned from form posts.

Seni çok $this->query daha $result dönmek gerektiğini düşünüyorum.

Ayrıca size SQL injection farkında olmak ve mysql_real_escape_string or Prepared Statements to protect you against such attacks. addslashes uygun bir koruma değildir kullanmayı düşünmelisiniz.

Bu sorguyu deneyin. Eğer sonuç alırsanız, o zaman bir sorun sorguda senin ters tırnak karakteri ile bulunuyor

SELECT * FROM sl_label WHERE name Like 'Church%'

Belki de (zaten bu işlevi dışında bu yapıyorsun değil) sorgu çağrıldıktan sonra hata iletileri kontrol deneyin. Bu yanlış ne söylüyorum olabilir.

Artem yorumladı, gerçek sorgu yazdırarak iyi bir fikir olduğunu - bunları olmak için beklediğiniz gibi bazen bazı şeyler tam olarak değil.

Bu bir kodlama sorunu olabilir, 'Church adlı bir fantezi karakter olabilir. PHPMyAdmin UTF-8 olabilir, ve kendi PHP web iso-latin1 olabilir.

Bu satırda bakıyorum

mysql_query("SET NAMES 'utf8'; COLLATE='utf8_danish_ci';");

ve ben bunun bir hata olabileceğini düşünüyorum. Ile ';' Eğer sunucuya iki sorgular gönderiyor, ancak collate bir fıkra değil, kendi başına bir yasal ifadedir. Deneyin:

mysql_query("SET NAMES 'utf8' COLLATE 'utf8_danish_ci'");

Collate fıkra sunucu tarafından kabul edilmezse, etiket sütun bir danish_ci harmanlama sahip sorunu yaşıyor olabilir, ancak gelen ifadeler varsayılan (prob utf_general_ci) var. Orada aksanlı karakterler için hiçbir maç olabilir, ama temel ASCII karakterleri temsil aynıdır çünkü joker çalışır olacaktır.

Eğer aynı kodlama o sorgu var. Php dosyayı kaydediyorsunuz?