PDA

View Full Version : مشکل MySQL با فارسی



mehdi4467
جمعه 18 شهریور 1390, 15:22 عصر
سلام
من در حالت عادی دیتابیس رو روی utf8_persian_ci قرار دادم و هنگامی که به دیتابیس وصل می شم کد mysql_query('SET NAMES utf8'); رو اجرا می کنم. در این حالت هیچ مشکلی وجود ندارد و همه چیز درست کار می کند و حروف درست نمایش داده می شود.
اما زمانی که می خواهم از PDO برای ارتباط با دیتابیس استفاده کنم مشکل بوجود می آید و حروف فارسی به شکل ؟ نمایش داده می شود.

لطفا راهنمایی کنید.
ممنون

armsoftpc
جمعه 18 شهریور 1390, 18:44 عصر
به نام خدا
با سلام
دوست عزیز اگه ممکن کدتون قرار بدید تا ببینیم ، مشکل از کجاست.:لبخند:

mehdi4467
جمعه 18 شهریور 1390, 22:41 عصر
کد:

if (!isset(self::$_mHandler))
{
// Execute code catching potential exceptions
try
{
// Create a new PDO class instance
self::$_mHandler =
new PDO(PDO_DSN, DB_USERNAME, DB_PASSWORD,
array(PDO::ATTR_PERSISTENT => DB_PERSISTENCY));

// Configure PDO to throw exceptions
self::$_mHandler->setAttribute(PDO::ATTR_ERRMODE,
PDO::ERRMODE_EXCEPTION);

self::$_mHandler->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);

///// for utf8 only
$sqlQuery = "SET NAMES utf8";

$database_handler = self::GetHandler();

$statement_handler = $database_handler->prepare($sqlQuery);

$statement_handler->execute(null);

}
catch (PDOException $e)
{
// Close the database handler and trigger an error
self::Close();
trigger_error($e->getMessage(), E_USER_ERROR);
}
}
البته با قرار دادن خطوط 18 الی 24 مشکل حل شد.
ممنون

mehdi4467
شنبه 06 اردیبهشت 1393, 22:57 عصر
سلام
من چند وقت پیش با روش بالا مشکل رو خودم حل کردم ولی الان هرکاری می کنم دوباره نوشته های فارسی ؟؟؟؟ در دیتابیس ذخیره می شود. راهنمایی ها مختلفی هم در سایت شده بود ولی هیچکدوم جواب نداد.
لطفا راهنمایی کنید.

cpuram
شنبه 06 اردیبهشت 1393, 23:07 عصر
define('DB_TYPE', 'mysql');
define('DB_HOST', 'localhost');
define('DB_NAME', 'DB');
define('DB_CHARSET', 'UTF8');
define('DB_USER', 'root');
define('DB_PASS', '');

parent::__construct(DB_TYPE.':host='.DB_HOST.';dbn ame='.DB_NAME.';charset='.DB_CHARSET, DB_USER, DB_PASS);

mehdi4467
شنبه 06 اردیبهشت 1393, 23:21 عصر
ممنون
من اطلاعات دیتابیس رو در فایل include.php به شکل زیر قرار داده ام:


define('DB_PERSISTENCY', 'true');
define('DB_SERVER', 'localhost');
define('DB_USERNAME', 'root');
define('DB_PASSWORD', '');
define('DB_DATABASE', 'agahi');
define('DB_CHARSET', 'UTF8');
define('PDO_DSN', 'mysql:host=' . DB_SERVER . ';dbname=' . DB_DATABASE.';charset='.DB_CHARSET);

خط آخری رو که داده اید کجا قرار بدهم؟

cpuram
شنبه 06 اردیبهشت 1393, 23:28 عصر
ببخشید فقط این قسمت رو بزارید داخل قسمتی که وصل میشید به دیتابیس

DB_TYPE.':host='.DB_HOST.';dbname='.DB_NAME.';char set='.DB_CHARSET, DB_USER, DB_PASS

mehdi4467
شنبه 06 اردیبهشت 1393, 23:38 عصر
من کد کلی رو انطوری کردم ولی ایراد داره میتونید راهنمایی کنید؟


define('DB_TYPE', 'mysql');
define('DB_PERSISTENCY', 'true');
define('DB_SERVER', 'localhost');
define('DB_USERNAME', 'root');
define('DB_PASSWORD', '');
define('DB_DATABASE', 'agahi');
define('DB_CHARSET', 'UTF8');
define('PDO_DSN', DB_TYPE.':host='.DB_SERVER.';dbname='.DB_DATABASE. ';charset='.DB_CHARSET, DB_USERNAME, DB_PASSWORD);

aalmair
یک شنبه 07 اردیبهشت 1393, 10:06 صبح
این چطوره

$link1 = mysql_connect('localhost','user1','pass1',TRUE);
$link2 = mysql_connect('localhost','user1','pass1',TRUE);

mysql_selectdb('db1',$link1);
mysql_selectdb('db2',$link2);

mysql_set_charset('latin1',$link1);
mysql_set_charset('utf8',$link2);

mehdi4467
یک شنبه 07 اردیبهشت 1393, 11:23 صبح
این چطوره

$link1 = mysql_connect('localhost','user1','pass1',TRUE);
$link2 = mysql_connect('localhost','user1','pass1',TRUE);

mysql_selectdb('db1',$link1);
mysql_selectdb('db2',$link2);

mysql_set_charset('latin1',$link1);
mysql_set_charset('utf8',$link2);


ممنون منتها من دارم از PDO استفاده می کنم.
بدون PDO مشکلی ندارم.

MRmoon
یک شنبه 07 اردیبهشت 1393, 11:57 صبح
اینو امتحان کن:


new PDO('mysql:hostname=localhost;dbname=mydb;charset= utf8', 'user', 'pass');

MMSHFE
یک شنبه 07 اردیبهشت 1393, 13:58 عصر
به PDO اینطوری وصل بشین ببینید درست میشه:

$dsn = 'mysql:dbname=learning;host=localhost';
$options = array(
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'utf8\'',
);
try {
$pdo = new PDO($dsn, 'root', '', $options);
}
catch(Exception $e) {
echo 'Connection failed: ' . $e->getMessage();
}

mehdi4467
یک شنبه 07 اردیبهشت 1393, 14:58 عصر
به PDO اینطوری وصل بشین ببینید درست میشه:

$dsn = 'mysql:dbname=learning;host=localhost';
$options = array(
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'utf8\'',
);
try {
$pdo = new PDO($dsn, 'root', '', $options);
}
catch(Exception $e) {
echo 'Connection failed: ' . $e->getMessage();
}

سلام
نحوه کانکت شدن من به این شکل بود:


self::$_mHandler = new PDO(PDO_DSN, DB_USERNAME, DB_PASSWORD,array(PDO::ATTR_PERSISTENT => DB_PERSISTENCY));

که با استفاده از راهنمایی شما به این شکل تغییر دادم:


self::$_mHandler = new PDO(PDO_DSN, DB_USERNAME, DB_PASSWORD,array(PDO::ATTR_PERSISTENT => DB_PERSISTENCY,PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'utf8\''));

که درست نشد. البته اگر تغییرات رو درست اعمال کرده باشم!!

hamedarian2009
یک شنبه 07 اردیبهشت 1393, 18:37 عصر
شما باید به متغیر dsn$ آخرش کاراکترست رو اضافه کنی اینطوری:

$dsn = 'mysql:dbname=learning;host=localhost;charset=utf8 ';

mehdi4467
دوشنبه 08 اردیبهشت 1393, 21:45 عصر
شما باید به متغیر dsn$ آخرش کاراکترست رو اضافه کنی اینطوری:

$dsn = 'mysql:dbname=learning;host=localhost;charset=utf8 ';

این کار رو کردم ولی متاسفانه درست نشد.
موقع Insert توی دیتابیس حروف فارسی ? ذخیره می شوند.

mehdi4467
چهارشنبه 10 اردیبهشت 1393, 22:58 عصر
سلام
مشکل هنوز حل نشده.

MMSHFE
پنج شنبه 11 اردیبهشت 1393, 10:59 صبح
خود اسکریپتتون رو با کدگذاری UTF-8 without BOM ذخیره کردین؟ تگ متا رو توی صفحه گذاشتین؟

mehdi4467
پنج شنبه 11 اردیبهشت 1393, 11:36 صبح
خود اسکریپتتون رو با کدگذاری UTF-8 without BOM ذخیره کردین؟ تگ متا رو توی صفحه گذاشتین؟

سلام
بله این موارد رعایت شده است.
تگ متا هم به شکل زیر است:



<meta http-equiv="content-type" content="text/html; charset=UTF8">

MMSHFE
پنج شنبه 11 اردیبهشت 1393, 12:06 عصر
درصورت امکان توی پیام خصوصی TeamViewer بدین وصل بشم به سیستمتون ببینم مشکل چیه.

mehdi4467
پنج شنبه 11 اردیبهشت 1393, 13:53 عصر
سلام
ارسال شد.

mehdi4467
پنج شنبه 11 اردیبهشت 1393, 14:58 عصر
سلام
با کمک آقای شهرکی مشکل حل شد.
مشکل از طرف SP در دیتا بیس بود که به شکل زیر حل شذ:
کد من به این شکل بود:



CREATE PROCEDURE `account_create`(IN name VARCHAR(50),IN hesab VARCHAR(50),IN cart VARCHAR(50),IN sheba VARCHAR(50),IN holder VARCHAR(50))
BEGIN
INSERT INTO `accounts` (`id` ,`accountname` ,`accountnumber` ,`accountatm` ,`accountsheba` ,`accountholder` ,`accountstatus`)
VALUES
(NULL ,name ,hesab ,cart ,sheba ,holder ,1);
END



که به این شکل نوشته شد:



CREATE PROCEDURE `account_create`(IN name VARCHAR(50) CHARACTER SET UTF8,IN hesab VARCHAR(50),IN cart VARCHAR(50),IN sheba VARCHAR(50),IN holder VARCHAR(50) CHARACTER SET UTF8)
BEGIN
INSERT INTO `accounts` (`id` ,`accountname` ,`accountnumber` ,`accountatm` ,`accountsheba` ,`accountholder` ,`accountstatus`)
VALUES
(NULL ,name ,hesab ,cart ,sheba ,holder ,1);
END


فقط از آقای شهرکی یک سوال داشتم. شما تمام جدوال رو از utf8_general_ci به utf8_bin تغییر دادید. دلیل خاصی داشت؟

MMSHFE
پنج شنبه 11 اردیبهشت 1393, 15:03 عصر
ci ها به بزرگی و کوچکی حروف حساس نیستن و مثلاً اگه یک فیلد رو UNIQUE کنید و ali ثبت بشه، دیگه نمیگذاره ALI ثبت بشه. بخاطر همین عادت کردم از utf8_bin استفاده کنم وگرنه دلیل خاص دیگری نداشت.