PDA

View Full Version : مشکل در ساخت منوهای تو در تو توسط php



Nabi
شنبه 24 آذر 1386, 22:12 عصر
سلام ؛

من معمولاً وقتی کاملاً به بن بست میخورم میپرسم...
الان دو هفتس که دارم با این قضیه کلنجار میرم ولی به جواب نمیرسم...

توی دیتابیس یه سری رکورد داریم که هر کدوم نشونه یک منو است. فیلد menu_parent منوی زیر مجموعه رو نشون میده، یعنی مثلاً:

menu_id menu_parent
1 0
2 1

در مثال بالا، منوی 2 در منوی 1 قرار گرفته و منوی 1 در 0 (یعنی ریشه) قرار گرفته. بدین صورت:
0 > 1 > 2

من برنامه ای نوشتم که تمام این منوها با زیرمجموعه ها رو به صورت آرایه برمیگردونه. اما مشکل کار اینجاست که پیمایش از آخر به اول صورت میگیره، یعنی ابتدا آخرین منو ای دی (در اینجا 2) پیدا میشه، بعد 1، بعد 0 خونده میشه (کد کامل رو در زیر آوردم)

حال من همین نتیجه رو میخوام بدست بیارم با این تفاوت که پیمایش از اول به آخر صورت بگیره، یعنی ابتدا 0 و بعد 1 و بعد 2 خونده بشه. دلیلش هم وجود رتبه بندی منوهاست که ایجاب میکنه اینطور باشه تا نظم نمایش حفظ بشه.

توجه داشته باشید که تعداد منوها نامحدود و هر منو ممکنه زیر مجموعه های زیادی داشته باشه.



<?php
//connect db
$GLOBALS[db][host] = "localhost"; // database host
$GLOBALS[db][user] = "root"; // database username
$GLOBALS[db][pass] = ""; // database password
$GLOBALS[db][name] = "testmenu"; // name of database
$conn = mysql_pconnect($GLOBALS[db][host], $GLOBALS[db][user], $GLOBALS[db][pass]) or die("Connection failed: Please try later.");
$db_flag = mysql_select_db ($GLOBALS[db][name], $conn) or die("Could not select database:".mysql_error());

define ("ADMIN_LANG", 'en');

function CreateParent()
{
$lang = ADMIN_LANG;
$keys = '';

$result = mysql_query("SELECT * FROM `menu`
WHERE `menu_lang`='$lang'
ORDER BY `menu_rank` ASC, `menu_id` ASC");

while ($row = mysql_fetch_array($result))
{
if (!CheckParent($row[menu_id]))
{
$key = '';
$key = "[$row[menu_id]]" . $key;

if ($row[menu_parent] != 0)
{
CallBackParent($key, $row[menu_parent]);
}

$keys .= '$menu[0]' . $key . '=\''.$row[menu_id].'\'; ';
}
}
return $keys;
}
function CallBackParent(&$key, $parent_id)
{
$lang = ADMIN_LANG;

$result = mysql_query("SELECT * FROM `menu`
WHERE `menu_lang`='$lang'
AND `menu_id`='$parent_id'
ORDER BY `menu_rank` ASC, `menu_id` ASC");
$row = mysql_fetch_array($result);

$key = "[$row[menu_id]]" . $key;

if ($row[menu_parent] == 0)
{
return;
}
else
{
CallBackParent($key, $row[menu_parent]);
}
}
function CheckParent($menu_parent)
{
$lang = ADMIN_LANG;

$result = mysql_query("SELECT * FROM `menu`
WHERE `menu_lang`='$lang'
AND `menu_parent`='$menu_parent'
LIMIT 1");
if (mysql_num_rows($result))
{
return true;
}
else
{
return false;
}
}

$keys = CreateParent();
eval($keys);
echo "<pre>";
print_r($keys);
echo "<br>";
print_r($menu);
?>


دیتا بیس آزمایشی:



CREATE TABLE `menu` (
`menu_id` int(11) unsigned NOT NULL auto_increment,
`menu_parent` int(11) unsigned NOT NULL default '0',
`menu_type` varchar(255) NOT NULL default 'url',
`menu_title` varchar(255) NOT NULL default '',
`menu_url` varchar(255) NOT NULL default '',
`menu_target` varchar(255) NOT NULL default '',
`menu_rank` varchar(11) NOT NULL default '0',
`menu_status` tinyint(4) NOT NULL default '1',
`menu_lang` varchar(255) NOT NULL default '',
PRIMARY KEY (`menu_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=76 ;

INSERT INTO `menu` VALUES (68, 66, 'url', 'c', 'http://', '_self', '2', 1, 'en');
INSERT INTO `menu` VALUES (67, 66, 'url', 'b', 'http://', '_self', '1', 1, 'en');
INSERT INTO `menu` VALUES (66, 0, 'url', 'a', 'http://', '_self', '1', 1, 'en');
INSERT INTO `menu` VALUES (75, 0, 'url', 'f', 'http://', '_self', '3', 1, 'en');
INSERT INTO `menu` VALUES (74, 73, 'url', 'e', 'http://', '_self', '1', 1, 'en');
INSERT INTO `menu` VALUES (73, 0, 'url', 'd', 'http://', '_self', '2', 1, 'en');


تشکر
نبی

oxygenws
شنبه 24 آذر 1386, 23:45 عصر
اصولا کامنت گذاری در برنامه نویسی خیلی خوب و مفید و منطقی است!!!! حتی برای برنامه های خودتون!!!!!!

Nabi
یک شنبه 25 آذر 1386, 01:05 صبح
اصولا کامنت گذاری در برنامه نویسی خیلی خوب و مفید و منطقی است!!!! حتی برای برنامه های خودتون!!!!!!
اینهمه گذاشتم!!! :
//connect db

:-D

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

جاییش مبهمه امید جان؟

oxygenws
یک شنبه 25 آذر 1386, 01:27 صبح
آره، تقریبا هیچ کدوم از توابع معلوم نیست چکار می کنند.

Nabi
یک شنبه 25 آذر 1386, 02:34 صبح
این کد رو دوست خوبم احسان برام ایمیل کرد:


<?
//connect db
$GLOBALS[db][host] = "localhost"; // database host
$GLOBALS[db][user] = "root"; // database username
$GLOBALS[db][pass] = ""; // database password
$GLOBALS[db][name] = "testmenu"; // name of database
$conn = mysql_pconnect($GLOBALS[db][host], $GLOBALS[db][user], $GLOBALS[db][pass]) or die("Connection failed: Please try later.");
$db_flag = mysql_select_db ($GLOBALS[db][name], $conn) or die("Could not select database:".mysql_error());

define ("ADMIN_LANG", 'en');


function CreateTree($parentNode=0){
$result = mysql_query("SELECT * FROM `menu`
WHERE `menu_lang`='" . ADMIN_LANG . "'
AND `menu_parent`='$parentNode'
ORDER BY `menu_rank` ASC, `menu_id` ASC");
$tree = array();
while ($row = mysql_fetch_array($result)){
$tree[$row[menu_id]] = CreateTree($row[menu_id]);
}
return $tree;
}

$keys = CreateTree();
echo "<pre>";
print_r($keys);
?>


آزمایشات اولیه رو خوب پشت سر گذاشته... فکر میکنم مشکلی نداشته باشه... دارم بیشتر روش کار میکنم...

امید هنوز توی صورت مسئله موندی؟! ;-)
همین که بهش فکر میکنی ارزشمنده !

oxygenws
یک شنبه 25 آذر 1386, 02:57 صبح
نه، با صورت مسئله مشکلی ندارم، با حل تو مشکل داشتم. خوب این دومی کاملا مفهومه.

یه مشکل به نظرم داره و اون اینه که این کد از توابع بازگشتی استفاده می کنه که ممکنه در شرایطی رم رو پر کنه و به قول معروف stack overflow بشه. خیلی راحت می تونی این کد رو (که شرایط پیچیده ای هم نداره) با یک while یا do-while بنویسی. ضمن اینکه صدا زدن متوالی توابع سرعت رو میاره پایین.

و دو مورد جانبی دیگه:

- از fetch_array استفاده نکن، حافظهء زیادی مصرف می کنه.

- و آخر اینکه عبارت $row[menu_id] زیاد درست نیست و بهتره به جاش از این استفاده کنی:

$row['menu_id']

موفق باشی

Nabi
یک شنبه 25 آذر 1386, 04:16 صبح
یه مشکل به نظرم داره و اون اینه که این کد از توابع بازگشتی استفاده می کنه که ممکنه در شرایطی رم رو پر کنه و به قول معروف stack overflow بشه. خیلی راحت می تونی این کد رو (که شرایط پیچیده ای هم نداره) با یک while یا do-while بنویسی. ضمن اینکه صدا زدن متوالی توابع سرعت رو میاره پایین.
گرفتم داستان چی شد، در این مورد خاص، فکر کنم با دو تا حلقه تو در تو بشه یه کارایی کرد. گرچه من کمی سعی کردم ولی دیدم سوادم کشش نداره بیخیالش شدم ! شما اگر بیکار بودی و نوشتی استفاده میکنیم. (همین کد دوم که احسان نوشته. تست کردم کاملاً چیزیه که دنبالش بودم.)


- از fetch_array استفاده نکن، حافظهء زیادی مصرف می کنه.و معادل مناسب...؟


- و آخر اینکه عبارت $row[menu_id] زیاد درست نیست و بهتره به جاش از این استفاده کنی:

$row['menu_id']
به جنبه مثبت قضیه اشاره نکردی، اونم اصرار به استفاده از `` در مورد اسم تیبل ها و فیلدها و '' برای مقادیر اونها در کوئری... چیزی که در اکثر کدها مشاهده نمیکنم. شاید هم من اشتباه میکنم که استفاده میکنم !
در کل از این نکات ریز و اصطلاحاً نانوشته و شاید در ظاهر بی اهمیت خیلی خوشم میاد. چون فقط حاصل تجربیات خاک گود خورده هاست... و جایی دیگه پیدا نمیشه و مجموعه اینهاست که یک کار رو حرفه ای جلوه میده. اگر بازم از این موارد دیدی ممنون میشم گوشزد کنی.

تشکر
نبی

oxygenws
یک شنبه 25 آذر 1386, 04:42 صبح
و معادل مناسب...؟
اگر نیاز به اسامی سر ستون های جداول پایگاه داده *داری* از fetch_assoc و اگه *نداری* از fetch_row.


گرفتم داستان چی شد، در این مورد خاص، فکر کنم با دو تا حلقه تو در تو بشه یه کارایی کرد. گرچه من کمی سعی کردم ولی دیدم سوادم کشش نداره بیخیالش شدم ! شما بیکار بودی نوشتی استفاده میکنیم. (همین کد دوم که احسان نوشته. تست کردم کاملاً چیزیه که دنبالش بودم.)
نه، یک حلقه کافیه. و توش تقریبا همینایی که تو کد احسان هست باید باشه (یه کم باید بالا پایین بشه)
درسته، کدش کار می کنه، اما من می ترسم چون مسلما نمی تونی تمام شرایط رو تست کنی. این کد *ممکنه* یه جایی تو رو بزنه زمین، که اون موقع اصلا نمی دونی از کجا خوردی!!! :)


اگر بازم از این موارد دیدی ممنون میشم گوشزد کنی.
چشم، شروع می کنم :)
- تا جایی که می تونی از سینگل کوت استفاده کن. حتی شاید سینگل کوت به همراه نقطه (concat) سریع تر و بهتر باشه.
- اون مورد define بود که تو کد دوم درست شده... اگر define ه، دیگه نسبت دهی اش به متغیر چی بود!
- قبل از define یه علامت @ بذار. فقط برای احتیاط.
- گهگداری کامنت از خود کد مهم تره!!! :دی
- اگر دقیقا نمی دونی pconnect چیه، ازش استفاده نکن.
- در کل، توی کد دوم، برای افزایش سرعت، بهتره reference آرایه رو بگیری، اینو مطالعه کن:
http://us2.php.net/manual/en/functions.returning-values.php
(البته تو ذهنم هست که PHP5 آرایه ها رو به طور پیشفرض در حالت reference رد و بدل می کرد، بازم شک دارم و حداقل برای compatibility بد نیست که باشه.)

- جدولت هم کلی مشکل داره:
-- نوع type و lang و target و status رو enum بذار.
-- نوع rank رو عددی بذار.
-- حداقل روی id و parent و rank و lang ایندکس بذار.

امیدوارم از این همه گیر، ناراحت نشده باشی :)
موفق باشی.

Nabi
دوشنبه 26 آذر 1386, 00:55 صبح
سلام ؛

اهم...!


درسته، کدش کار می کنه، اما من می ترسم چون مسلما نمی تونی تمام شرایط رو تست کنی. این کد *ممکنه* یه جایی تو رو بزنه زمین، که اون موقع اصلا نمی دونی از کجا خوردی!!! :)من که برنامه نویسی رو با سعی و خطا شروع کردم و تقریبا همونطور دارم ادامه میدم ... دیگه توی احتمالات و پیشبینی تمام حالت های ممکن خبره شدم ! فعلاً که این کد امتحان های سختی رو پشت سر گذاشته، اگر هم درآینده خروجی اشتباه بده اونوقت تصحیح میکنم. چاره دیگه ای نیست باید بهش اعتماد کرد!

- تا جایی که می تونی از سینگل کوت استفاده کن. حتی شاید سینگل کوت به همراه نقطه (concat) سریع تر و بهتر باشه.در این مورد مدرک مستند داری؟

- اون مورد define بود که تو کد دوم درست شده... اگر define ه، دیگه نسبت دهی اش به متغیر چی بود!منظورت رو دقیقاً نگردم به هر حال باید بگم که من define رو برای تعریف ثابت(constant) استفاده کردم، و در اصل این دستور مربوط به فایل language است که اونجا بر حسب زبان سایت مقدار دهی میشه و چون من کد رو برای قرار دادن در اینجا مختصر کردم این شد که میبینی.

- قبل از define یه علامت @ بذار. فقط برای احتیاط.اگر این احتیاط به منظور جلوگیری از تکرار احتمالی دستور و بروز خطاست، که در این صورت باید قبل خیلی از دستورات دیگه هم قرار بدیم، include, $POST, ... کمی شلوغ بازی یا وسواس نیست؟ با توجه به اینکه در مورد این پروژه مطمئن هستیم define فقط یکبار و فقط در یک فایل قراره اجرا بشه.

- اگر دقیقا نمی دونی pconnect چیه، ازش استفاده نکن.تا اونجا که سواد من کشش داره، mysql_pconnect یه اتصال دائم ایجاد میکنه. جایی خونده بودم که این نوع اتصال نیاز به بسته شدن نداره و در اتصالات بعدی از همون کانکشن استفاده میکنه. الان که به همون منبع مراجعه کردم کمی نظرم برگشت. یعنی به دلیل بسته نشدن اتصالات، ممکنه اتصالات باز زیاد بشن و موجب مشکل سازی برای سرور بشه. از طرف دیگه mysql_connect اتصال معمولیه که با خاتمه اسکریپت، قطع میشه (یا با تابع mysql_close).
در واقع در mysql_pconnect با باز شدن اولین صفحه اتصال برقرار میشه و برای صفحات بعدی از همون اتصال استفاده میکنه که موجب بالارفتن سرعت میشه اما ممکنه اتصالات بدون استفاده باقی بمونه که برای سرور مشکل ساز بشه. اما در mysql_connect، با هر بار باز شدن صفحه یک اتصال برقرار میشه و بلافاصله بسته میشه. شاید سرعت کمتری داشته باشه ولی بهینه تره.
البته شما استادید و من اینها رو بیشتر برای روشن شدن خودم و امضاء توسط شما مکتوب کردم. اگر برداشت های بالا صحیح باشه، اینطور میشه نتیجه گرفت که برای سایت های معمولی بهتره از همون mysql_connect استفاده بشه و البته نیازی هم نیست نگران بسته شدن ارتباط و استفاده از mysql_close باشیم. این نتیجه گیری صحیحه؟

- در کل، توی کد دوم، برای افزایش سرعت، بهتره reference آرایه رو بگیری، اینو مطالعه کن:
http://us2.php.net/manual/en/functio...ing-values.phpاز اون به این رسیدم که کاملتر بود:
http://us2.php.net/manual/en/language.references.whatdo.php
در این باره یه اطلاعات سطحی داشتم ولی هنوز بهش مسلط نیستم. یعنی دقیقاً نمیدونم کجا و چه موقع از & باید استفاده کرد. سعی میکنم مطالعم رو بیشتر کنم.


-- نوع type و lang و target و status رو enum بذار.الان که در مورد enum تحقیق کردم متوجه مزیت هاش شدم، ولی عجیبه که در هیچ cms یی حتی اونهایی که معروفند همچین نوع فیلدی رو ندیده بودم. شاید من هم به اونها نگاه کردم !

-- نوع rank رو عددی بذار.اتفاقاً قبل از اینکه بگی، موقع sort کردن متوجه مشکلی شدم که فهمیدم باید int بشه.

-- حداقل روی id و parent و rank و lang ایندکس بذار.الان که تحقیق کردم متوجه شدم این index گذاری برای بالابردن سرعت و کارایی mysql است. و شامل PRIMARY, UNIQUE, INDEX, FULLTEXT میشه. ممکنه بگی هر کدوم چه خاصیتی دارند و کجا باید استفاده بشن و بهتره روی چه فیلدهایی اعمال بشن؟

امیدوارم از این همه گیر، ناراحت نشده باشی :)برعکس! بسیار هم خوشحال شدم. تمام امروز رو به تحقیق بر روی مواردی که بهش اشاره کردید اختصاص دادم و به اندازه تمام عمر گذشتم (با کمی غلو) چیز یاد گرفتم ! http://qsmile.com/qsimages/38.gif

در مورد سایر موارد هم بازم تشکر
نبی

oxygenws
دوشنبه 26 آذر 1386, 03:32 صبح
در این مورد مدرک مستند داری؟
۱- http://us2.php.net/manual/en/language.types.string.php#language.types.string.sy ntax.single

Note: Parsing variables within strings uses more memory than string concatenation. When writing a PHP script in which memory usage is a concern, consider using the concatenation operator (.) rather than variable parsing.

۲- کلا سرعت پردازش سینگل کوت بیشتر از دابل کوت است، چون داخل سینگل هیچ چی پردازش نمی شه (جز \')


منظورت رو دقیقاً نگردم به هر حال باید بگم که من define رو برای تعریف ثابت(constant) استفاده کردم، و در اصل این دستور مربوط به فایل language است که اونجا بر حسب زبان سایت مقدار دهی میشه و چون من کد رو برای قرار دادن در اینجا مختصر کردم این شد که میبینی.
تو کد اولی که گذاشتی، اومدی بعدا LANG رو ریختی توی $lang!!!! یعنی یک *ثابت* رو ریختی تو یک *متغیر*!!!!!!!!!


اگر این احتیاط به منظور جلوگیری از تکرار احتمالی دستور و بروز خطاست، که در این صورت باید قبل خیلی از دستورات دیگه هم قرار بدیم، include, $POST, ... کمی شلوغ بازی یا وسواس نیست؟ با توجه به اینکه در مورد این پروژه مطمئن هستیم define فقط یکبار و فقط در یک فایل قراره اجرا بشه.
نه، وسواس نیست، قبل از $_POST بذاری، برنامه ات ممکنه مشکل امنیتی پیدا کنه و قبل از include نباید بذاری و می تونی از include_once استفاده کنی!!!!


البته شما استادید و من اینها رو بیشتر برای روشن شدن خودم و امضاء توسط شما مکتوب کردم. اگر برداشت های بالا صحیح باشه، اینطور میشه نتیجه گرفت که برای سایت های معمولی بهتره از همون mysql_connect استفاده بشه و البته نیازی هم نیست نگران بسته شدن ارتباط و استفاده از mysql_close باشیم. این نتیجه گیری صحیحه؟
درسته، برای سایت شما، همون connect بهتره :)
اگر احیانا سرور اختصاصی داشتی برای همین برنامه ات، اون موقع میشه تازه یک کمی pconnet رو بررسی کرد و شاید یه ۱۰ درصدی تصمیم بگیری از اون استفاده کنی :)


الان که در مورد enum تحقیق کردم متوجه مزیت هاش شدم، ولی عجیبه که در هیچ cms یی حتی اونهایی که معروفند همچین نوع فیلدی رو ندیده بودم. شاید من هم به اونها نگاه کردم !
احتمالا چون هنر دست مهاجران SQL Server هست :) چون تو SQL Server این موهبت (و یه سری فیچر خیلی خوب دیگه) رو نداریم :)


الان که تحقیق کردم متوجه شدم این index گذاری برای بالابردن سرعت و کارایی mysql است. و شامل PRIMARY, UNIQUE, INDEX, FULLTEXT میشه. ممکنه بگی هر کدوم چه خاصیتی دارند و کجا باید استفاده بشن و بهتره روی چه فیلدهایی اعمال بشن؟
تو یه تاپیک مجزا بپرس. ضمنا در این مورد *فقط* ایندکس بذار. یعنی INDEX!

موفق باشی.

Farhadi
جمعه 30 آذر 1386, 08:36 صبح
سلام

عید همگی مبارک.

ممنون امید جان، واقعا نکات آموزنده ای بود. استفاده کردم.

این هم کد غیر بازگشتی :



<?
$dbhost = "localhost"; // database host
$dbuser = "root"; // database username
$dbpass = ""; // database password
$dbname = "test"; // database name
mysql_connect($dbhost, $dbuser, $dbpass);
mysql_select_db($dbname);

define ("ADMIN_LANG", 'en');

function CreateTree(){
$tree = array();
$result = mysql_query("SELECT * FROM `menu`
WHERE `menu_lang`='" . ADMIN_LANG . "'
ORDER BY `menu_rank` ASC, `menu_id` ASC");
while ($row = mysql_fetch_assoc($result)){
if (!isset($tree[$row['menu_id']])) $tree[$row['menu_id']] = array();
$tree[$row['menu_parent']][$row['menu_id']] = &$tree[$row['menu_id']];
}
return $tree[0];
}

$keys = CreateTree();
echo "<pre>";
print_r($keys);
echo "</pre>";
?>


راستی شما چیکار میکنید که کد هاتون رنگی میشه.
چرا کد من سیاه و سفیده.

Nabi
جمعه 30 آذر 1386, 23:04 عصر
تو کد اولی که گذاشتی، اومدی بعدا LANG رو ریختی توی $lang!!!! یعنی یک *ثابت* رو ریختی تو یک *متغیر*!!!!!!!!!درسته ولی دلیلش همون بود که گفتم. کد صفحه قبل از ادغام چندین فایل بود که من عیناً اونها رو بهم چسبوندم...

قبل از $_POST بذاری، برنامه ات ممکنه مشکل امنیتی
چرا؟!

درسته، برای سایت شما، همون connect بهتره :)
اگر احیانا سرور اختصاصی داشتی برای همین برنامه ات، اون موقع میشه تازه یک کمی pconnet رو بررسی کرد و شاید یه ?? درصدی تصمیم بگیری از اون استفاده کنی :)
mysql_close نمیخواد دیگه؟

در مورد مابقی توضیحات، فقط تشکر.
نبی

Nabi
جمعه 30 آذر 1386, 23:25 عصر
سلام
عید همگی مبارک.
ممنون امید جان، واقعا نکات آموزنده ای بود. استفاده کردم.
این هم کد غیر بازگشتی :


سلام ؛
عید شما هم مبارک. یه جمله خفن: "روی شما به سرخی انار ، شب شما به شیرینی هندوانه ، لبتان مانند پسته خندان ، عمرتان به بلندای شب یلدا و غمهایتان به کوتاهی روزش باد"

دست شما هم درد نکنه زحمت کشیدید. آزمایش اولیه رو درست پشت سر گذاشت. اما نمیدونم وقت میکنم اون آزمایشات خفنی که روی کد قبلی پیاده کردم روی این کد هم پیاده کنم که با خیال راحت تر ازش استفاده کنم یا نه...
در هر حال محبت کردید.



راستی شما چیکار میکنید که کد هاتون رنگی میشه.
چرا کد من سیاه و سفیده.

پارتیمون قویه ;-)

بجای [ code ] برای پی اچ پی از [ php ] استفاده کن، و برای اچ تی ام ال از [ html ]

پ.ن: راستی یاد یه چیزی افتادم. در مورد کاربرانی که قدیم ثبت نام کردند ادیتور اینجا کاملاً معمولیه، اما کاربران جدید ادیتور پیشرفته براشون ظاهر میشه! اینو وقتی امروز مجبور شدم آیدی جدید باز کنم متوجه شدم. اون تگهایی هم که بالا معرفی کردم خود ایتور میزنه...

تشکر
نبی

oxygenws
شنبه 01 دی 1386, 00:57 صبح
چرا؟!
با این کار سرت رو کردی توی برف که Notice ها رو نبینی!! و notice *می تونه* خطر امنیتی ایجاد کنه.


mysql_close نمیخواد دیگه؟
از من نپرس، برو تو راهنمای PHP ببین!


پ.ن: راستی یاد یه چیزی افتادم. در مورد کاربرانی که قدیم ثبت نام کردند ادیتور اینجا کاملاً معمولیه، اما کاربران جدید ادیتور پیشرفته براشون ظاهر میشه! اینو وقتی امروز مجبور شدم آیدی جدید باز کنم متوجه شدم. اون تگهایی هم که بالا معرفی کردم خود ایتور میزنه...
میشه دسترسی هر دو هویت ات رو به این خاطر بست :) قوانین سایت رو بخون و یه سر هم به کنترل پنل خودت بزن تا تنظیمات کاربری رو ببینی!

Nabi
یک شنبه 02 دی 1386, 21:18 عصر
از من نپرس، برو تو راهنمای PHP ببین!

پرسیدم، جواب داد:
Using mysql_close() isn't usually necessary, as non-persistent open links are automatically closed at the end of the script's execution.



میشه دسترسی هر دو هویت ات رو به این خاطر بست :) قوانین سایت رو بخون و یه سر هم به کنترل پنل خودت بزن تا تنظیمات کاربری رو ببینی!

باز که خشن شدی! اصولا با حذف کردن و مسدود کردن قرارداد داری! اون آیدی برای من نبود ...


تشکر

sajedmalayeri
جمعه 23 آبان 1393, 15:07 عصر
دوستان این کار ها به ما چه کمکی میکنه ؟؟؟

id1385
جمعه 23 آبان 1393, 15:29 عصر
کافیه یه کلید تعریف کنی و اونو برابر 0 یا -1 قرار بدی بعد هرچی زیر مجموعه اضافه می شه آیدی والد رو بهش اختصاص بدی
تا بی نهایت می تونی زیر مجموعه و مجموعه درست کنی

شکل زیر نمونست