PDA

View Full Version : سوال: ارتباط با MySQL



sedamorde
جمعه 18 اردیبهشت 1388, 12:25 عصر
سلام
من session های سایتم را تو یه بانک MySQL گذاشتم و یک دیتابیس دیگه برای مطالب دیگه. اما این دو تا بانک تو یک صفحه با هم کار نمیکنه!!؟
چه راهی هست که دوتا بانک در یک زمان با هم کار کنن؟
مرسی

امید امرایی
یک شنبه 20 اردیبهشت 1388, 13:08 عصر
با سلام

بنده متوجه نشدم شما session رو چطوری توی MySQL گذاشتید
اما در مورد کار نکردن دو بانک در یک صفحه قطعا دیتابیس رو select نکردید
قبل از استفاده از هرکدوم اونها رو select کنید

mysql_select_db
و یا در query نام دیتابیس رو هم بیارید


'SELECT * FROM dbname.tablename'

sedamorde
یک شنبه 20 اردیبهشت 1388, 14:14 عصر
مرسی دوست خوب , منظورم از session در دیتابیس این که به جای اینکه اطلاعات در فایلی در tmp ذخیره بشه در دییتابیس ذخیره بشه!


<?php

$_sess_db = 'db_test'; // MySQL name

function _open()
{
global $_sess_db;
$db_user = 'test';
$db_pass = '123456';
$db_host = 'localhost';
if ($_sess_db = mysql_connect($db_host, $db_user, $db_pass))
{
return mysql_select_db('db_test', $_sess_db);
}
return FALSE;
}


function _close()
{
global $_sess_db;
return mysql_close($_sess_db);
}


function _read($id)
{
global $_sess_db;
$id = mysql_real_escape_string($id);
$sql = "SELECT data FROM user_sessions WHERE sess_id ='$id' LIMIT 1";
if ($result = mysql_query($sql, $_sess_db))
{
if (mysql_num_rows($result))
{
$record = mysql_fetch_assoc($result);
return $record['data'];
}
}
return '';
}


function _write($id, $data)
{

global $_sess_db;
$id = htmlspecialchars($id);
$time = time();
$data = $data;
$sql = "REPLACE INTO user_sessions VALUES ('$id', '$time', '$data')";
if(!$sql)
{
$sql2 = "UPDATE user_sessions SET
sess_id='$id',
sess_update='$time',
sess_date='$data'
WHERE sess_id='$id'";

return mysql_query($sql2, $_sess_db);
}
else
{
return mysql_query($sql, $_sess_db);
}

return true;
}



function _destroy($id)
{
global $_sess_db;
$id = htmlspecialchars($id);
$sql = "DELETE FROM user_sessions WHERE sess_id = '$id'";
return mysql_query($sql, $_sess_db);
}



function _clean()
{
global $_sess_db;
$old = mktime(0, 0, 0, date("m"), date("d")-1, date("y"));
$sql = "DELETE FROM user_sessions WHERE sess_updated < '$old'";
return mysql_query($sql, $_sess_db);
}


session_set_save_handler('_open', '_close', '_read', '_write', '_destroy', '_clean');
session_start();
?>

البته هنوز نفهمیدنم چرا درست کار نمیکنه! هر صفحه که عوض میشه دیتا پاک میشه!؟

narsic
دوشنبه 21 اردیبهشت 1388, 17:49 عصر
با سلام
بهتر نیست یک مقدار تایید رو در Session و در بانک ذخیره کنید .(البته منم متوجه نشدم چرا Session رو در بانک ذخیره کردید ).
موفق باشید

sedamorde
سه شنبه 22 اردیبهشت 1388, 15:21 عصر
با سلام
بهتر نیست یک مقدار تایید رو در Session و در بانک ذخیره کنید .(البته منم متوجه نشدم چرا Session رو در بانک ذخیره کردید ).
موفق باشید

مرسی , منظور شما از مقدار تایید چیه!؟ به خاطر اینکه سایت بازدیدهای خیلی زیادی در طول روز داره و فکر کردم 3-4 هزار session بهتر در بانک باشه. شما پیشنهاد بهتری دارید؟ :)

hidensoft
سه شنبه 22 اردیبهشت 1388, 18:43 عصر
به نظر من هم مناسبه که در دیتابیس ذخیره کنید اما چرا یه دیتابیس دیگه ؟ یک دیتابیس کفایت نمی کنه ؟

sedamorde
سه شنبه 22 اردیبهشت 1388, 20:17 عصر
hidensoft جان حدود 13 هزار تا user دارم و یک عالمه table دیگه و چون میتونم در یک زمان از 15 تا mysql استفاده کنم میخوام قسمت های مختلف جدا باشه.
حالا کسی نمیدونه مشکل کد من از کجاست!؟

امیـرحسین
سه شنبه 22 اردیبهشت 1388, 22:43 عصر
من توی گوگل سرچ کردم، کلی result واسه اتصال و SELECT برای چند دیتابیس پیدا کردم ولی جواب نداد یعنی کدها به نظر سالم میان ( Google.com :: php mysql connect multiple databases (http://www.google.com/search?hl=en&q=php+mysql+connect+multiple+databases) )

function ها رو دونه دونه دستی تست کنید ببینید کجاش نشتی داره ;)
تابع اول رو اینجوری تست کنید و ارور احتمالیش رو هم بازیابی کنید:
function _open()
{
global $_sess_db;
$db_user = 'test';
$db_pass = '123456';
$db_host = 'localhost';
if ($_sess_db = mysql_connect($db_host, $db_user, $db_pass))
{
return $_sess_db;
}
return mysql_error();
}
انشاالله که اشکالش در میاد....

امید امرایی
سه شنبه 22 اردیبهشت 1388, 23:27 عصر
1- والا چیزای جالب توی سورس شما زیاده



$sql = "REPLACE INTO user_sessions VALUES ('$id', '$time', '$data')";
if(!$sql)
{
$sql2 = "UPDATE user_sessions SET
sess_id='$id',
sess_update='$time',
sess_date='$data'
WHERE sess_id='$id'";

return mysql_query($sql2, $_sess_db);
}
else
{
return mysql_query($sql, $_sess_db);
}
بنده هرچه دقت می کنم معنی این شزطی که شما گذاشتید و اینکه چه لزومی داشته رو متوجه نمی شم.

2- گذشته از اینها وقتی شما در تابع open تنها یک بار یک دیتابیس رو انتخاب کردید چرا انتظار دارید بتونید بدون استفاده از نام مستقیم دیتابیش در کوئری بتونید از چند دیتابیس استفاده کنید ؟

3- بین تکه کد شما و استفاده از چند دیتابیس چه ارتباط وجود داره ؟ به نظر نمیاد شما در حال استفاده از دو دیتابیس متفاوت باشید

4- شما خطایی دریافت می کنید ؟ اگر بله چه خطایی ؟ اگر خیر برنامه شما از نظر منطقی مشکل داره نه دستوری .

__ziXet__
چهارشنبه 23 اردیبهشت 1388, 00:00 صبح
راستش به نظر من هم کار کردن با یه دیتابس خیلی راحت تره!
پروژه شما از vbulletin که دیگه بزرگ تر نیست!!
قبل از گشتن به دنبال راه حل حتما در این مورد فکر کنید.
اگه تعداد تیبل ها زیاد میشه خیلی مهم نیست! به نظرم از استفاده از دوتا db خیلی بهتره

sedamorde
چهارشنبه 23 اردیبهشت 1388, 00:06 صبح
مرسی از دوستان خوبم. من با شما موافقم که کد مشکل نداره و منطق مشکل داره اما من درک نمیکنم چرا!؟
1- kassit جان این شرط رو توی یه کد دیدم خودم هم دلیلش را نفهمیدم! اما گفتم تستش ضرر نداره! ;)
2-3 فکر میکنم من کم دقتی کردم و درست منظورم را نرساندم. با کمک شما مشکل دو دیتابیس حل شد. (مشکل در اشتباه select کردن خودم بود.) حالا مسله اینکه در هر صفحه که میریم تابع write مقدار data رو از داخل بانک حذف میکنه!
4- هیچ خطلایی وجود نداره! فقط در داخل بانک مقدار data پاک میشه!

sedamorde
چهارشنبه 23 اردیبهشت 1388, 00:11 صبح
__ziXet__ جان از vbulletin که اصلا! ;)
اگر پیشنهادی دارید خوشحال میشم بشنوم. :)
در ضمن امیر حسین جان تکه تکه همه چیز درست.

__ziXet__
چهارشنبه 23 اردیبهشت 1388, 00:19 صبح
__ziXet__ جان از vbulletin که اصلا! ;)
اگر پیشنهادی دارید خوشحال میشم بشنوم. :)
در ضمن امیر حسین جان تکه تکه همه چیز درست.
پیشنهاد من اینه که این تیبل مخصوص session رو بذار تو همون db اصلیت و از دوتا دیتابیس همزمان استفاده نکن

sedamorde
چهارشنبه 23 اردیبهشت 1388, 14:58 عصر
پیشنهاد من اینه که این تیبل مخصوص session رو بذار تو همون db اصلیت و از دوتا دیتابیس همزمان استفاده نکن

مرسی , دلیلش را هم میتونی بهم بگی؟ اگه دوتا db باشه مشکلی پیش میاد!؟

امیـرحسین
چهارشنبه 23 اردیبهشت 1388, 22:18 عصر
خب connect دیتابیس رو از توابع خارج کنید. یعنی با شروع اسکریپتتون اتصال انجام میشه و توابع فقط برای درج و بازیابی هستند و .... البته اگر مشکل فقط برای اتصال هست.
یه چیزی تو این مایه ها:

<?php

if (! $_sess_db = mysql_connect('localhost', 'test', '123456') )
return false;


function _open()
{
global $_sess_db;
return mysql_select_db('db_test', $_sess_db);
}


function _close()
{
global $_sess_db;
return mysql_close($_sess_db);
}


function _read($id)
{
global $_sess_db;
$id = mysql_real_escape_string($id);
$sql = "SELECT data FROM user_sessions WHERE sess_id ='$id' LIMIT 1";
if ($result = mysql_query($sql, $_sess_db))
{
if (mysql_num_rows($result))
{
$record = mysql_fetch_assoc($result);
return $record['data'];
}
}
return '';
}


function _write($id, $data)
{
global $_sess_db;
$id = htmlspecialchars($id);
$time = time();
$data = $data;
$sql = "REPLACE INTO user_sessions VALUES ('$id', '$time', '$data')";
if(!$sql)
{
$sql2 = "UPDATE user_sessions SET
sess_id='$id',
sess_update='$time',
sess_date='$data'
WHERE sess_id='$id'";

return mysql_query($sql2, $_sess_db);
}
else
{
return mysql_query($sql, $_sess_db);
}

return true;
}



function _destroy($id)
{
global $_sess_db;
$id = htmlspecialchars($id);
$sql = "DELETE FROM user_sessions WHERE sess_id = '$id'";
return mysql_query($sql, $_sess_db);
}



function _clean()
{
global $_sess_db;
$old = mktime(0, 0, 0, date("m"), date("d")-1, date("y"));
$sql = "DELETE FROM user_sessions WHERE sess_updated < '$old'";
return mysql_query($sql, $_sess_db);
}


session_set_save_handler('_open', '_close', '_read', '_write', '_destroy', '_clean');
session_start();
?>

__ziXet__
چهارشنبه 23 اردیبهشت 1388, 22:27 عصر
مرسی , دلیلش را هم میتونی بهم بگی؟ اگه دوتا db باشه مشکلی پیش میاد!؟
خب دلیلشم اینه که دیگه این مشکلا رو نداری!
هرجا خواستی راحت با db کار میکنی و نیازی نیست هی db سلکت کنی

sedamorde
چهارشنبه 23 اردیبهشت 1388, 23:52 عصر
مرسی از همه دوستان خوب که کمک کردن. :)
مشکل db ها حل شد. فقط کسی نمیدونه کد من کجاش مشکل داره!؟ تو هر صفحه که میریم مقدار session رو از تو بانک حذف میکنه!!!؟