2011-08-07 11 views
2

データベースに「Rhône」という文字列を挿入すると、残っているものはすべて「Rh」です これはどのように可能ですか? utf8_general_ciエンコーディングでMysqlを使用していますか?mysqlデータベースにôを挿入するとRhôneの一部になります

<?php 
header('Content-Type: text/html; charset=utf-8'); 
?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-gb" lang="en-gb"> 
<head> 
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> 
<title>Decode</title> 
<head></head> 
<body> 
<?php 
include_once ($_SERVER['DOCUMENT_ROOT'] . '/v3/functions/connect.php'); 

$res_id = $_POST['res_id']; 
$yr_id = $_POST['yr_id']; 

$yr_id=html_entity_decode($yr_id, ENT_COMPAT, "UTF-8"); 


if(isset($yr_id) && $yr_id<>'') { 

$search = array('%C3%B4'); 
$replace = array('ô'); 
$yr_id=str_replace($search, $replace, $yr_id); 



mysql_query("SET NAMES utf8"); 
    $uQuery2="UPDATE sv_snowrepublic set yr_id='$yr_id' where res_id=$res_id limit 1"; 
    $uResult2 = mysql_query($uQuery2); 
    echo 'updated'; 

    } 







    $uQuery1="SELECT * FROM sv_snowrepublic where res_id=$res_id limit 1"; 
    $uResult1 = mysql_query($uQuery1); 
    $row1 = mysql_fetch_assoc($uResult1); 


if (mysql_num_rows($uResult1) >= 1 && isset($res_id) && $res_id>2) 

    { 
echo "<form method='POST' action='index.php'>"; 
echo "<input type='hidden' size='4' value='" . $row1['res_id'] . "' name='res_id' /><br />"; 

$yr2_id=$row1['yr_id']; 
// $yr2_id=html_entity_encode($yr2_id, ENT_COMPAT, "UTF-8"); 
echo mb_detect_encoding($yr2_id); 

echo "<input type='text' size='200' value='" . $yr2_id . "' name='yr_id' /><br />"; 
echo "<br /><label for='submit'></label><input type='submit' name='submit' value=' Send '></form>"; 
     }  


?> 

</body> 
</html> 
+4

コードを表示してください。 –

答えて

2

これはどのように可能ですか?

Rhône文字列をMySQLデータベースに転送する際に問題が発生しました。これには複数の理由があります。最も重要なのは、関係するコンポーネント(最も確かにMySQLはサーバーまたはクライアントとしてMySQL)が指定された文字列で実行され、通常はôという文字位置に一致しません。エンコードが無効に見える最初の位置であるため、これは途切れてしまいます。

あなたが処理するデータのエンコーディングは常にあなたにはっきりしていて、正しくセットアップされ、適切に処理されていることを確認してください。

これは、データベースへの入力だけでなく、データベースからのデータの取得にも役立ちます。頭に浮かぶ

事がある:

  • あなたはUTF-8ディスクへとエンコードされたPHPのファイルを保存しないでください。

さらに上:

  • あなたはお勧めのMySQLクライアント拡張機能を使用していません。
  • 接続エンコードの設定を正しく設定する代わりにSET NAMESを使用しています。 mysql_set_charsetDocsを参照してください。

これを確認してくださいが、それは唯一の推測ですが、これが起こる理由はたくさんあります。

1

UTF-8にも接続エンコードを設定する必要があります。あなたはmysql_ *関数を使用している場合、あなたはmysql_real_escape_stringの()で文字列をエスケープすることを確認する必要があり、最初のクエリ

+2

'' SET NAMES'の代わりに['mysql_set_charset()'](http://php.net/manual/en/function.mysql-set-charset.php)を使うのが良いです。 – hakre

+0

より良いmysql_ *拡張子を使用しないでください: – RiaD

+0

まあ、OPはそれらを使用していますが、私は[ロングバージョン](http://stackoverflow.com/questions/6975451/inserting-o-into-mysql-database-一部のrhone-results-in-rh/6975803#6975803)も参照してください。 – hakre

0

前に、接続した後

SET NAMES UTF-8 

を、試してみてください、しかし、PDOを使用してプリペアドステートメントを使用することをお勧めしますまたはmysqli。

+2

質問に直接答えているかどうかはわかりませんが、確かにとても良いアドバイスです。 – Spudley

+0

かもしれません。あなたの弦をエスケープし、それが何か違いがあるかどうかを調べてみてください。また、あなたは脆弱なSQLインジェクションを防ぐことができます。あなたは 'SET NAMES utf8'クエリなしで試しましたか?これまでに文字エンコーディングを設定しなくても、DBにUTF-8文字を入力するだけで問題はありませんでした。 – Mike

関連する問題