PDA

View Full Version : مشکل منوی داینامیک(فراخوانی شده از دیتابیس- php)



lili.lrp
دوشنبه 02 دی 1392, 13:56 عصر
سلام:
من یه منوی داینامیک درست کردم که اطلاعات و از دیتابیس میخونه و یه جدول توی پنل ادمین درست کردم که ادمین بتونه این امکان و داشته باشه خودش یه منو اضافه کنه و همینطور لینک دادن به این منوها طبق صفحاتی که قبلا درست شده انجام میشه یعنی ادمین از یک drop menu که توش صفحاتی که قبلا آماده شده و لود میشه لینک منو و انتخاب میکنه.
مشکلم الان اینه که وقتی یه منوی parent میذارم و براش sub-menu میذارم اولین اطلاعات وارد شده رو درست نشون میده ولی بعدی ها نه یعنی sub-menu آیدی منوی parent بالاتر و میگیره.
یه مشخصات کلی از جدول های دیتابیسم میدم:
1- جدولی که متنم توی اون قرار داره و فیلدهاش اینه : id , pagename, pagesubject, title,img, text, keyword, description
2-جدول اسم صفحات(به جای اسم صفحات در جدول متن آیدی صفحات وارد میشه): id,pagename
3-جدول منو : menu_id , menu_name
4-جدول زیر منوها: subid,sub_menu,menu_id,link
کد فرمم :



کد:
<form action="newpage.php" method="post">
<a id="close">
<img src="images/1370474235_cross-button.png" width="16" height="16" style="cursor:pointer;"/>
</a>
<div id="maintbl" >

<div id="lefttbl">
<input type="text" name="parent" id="parent" class="inp4" value="parent"/>
<br /><br />
<input type="text" name="child1" id="child1" class="inp4" />

<br /> <br /><br />
<select name="url" id="url" class="page">

<?php while($rowpg=mysql_fetch_assoc($sqlpagename)){
echo"<option id='pagename' value='{$rowpg['id']}'>{$rowpg['pagename']}</option>";
}

?>

</select>کد insert:

function menu(){

if(isset($_POST['addto'])){
$parent=$_POST['parent'];
$child1=$_POST['child1'];
$url=$_POST['url'];
$menuquery=mysql_query("SELECT * FROM `menu`");
while($rowmenu=mysql_fetch_assoc($menuquery)){
$menu_id=$rowmenu['menu_id'];}


و کد فراخوانی منو و اطلاعات:


<div id="menuleft">
<ul class="parul">
<?php

$query = mysql_query("SELECT * FROM `menu` ");
while($row = mysql_fetch_assoc($query)){ ?>
<li class="sub"><?php echo $row['menu_name'];?>
<ul class="uch">
<?php
$city_query = mysql_query("SELECT * FROM `sub_menu` WHERE `menu_id`=".$row['menu_id']);
while($r1 = mysql_fetch_array($city_query)){ ?>
<li class="child"><a href="<?php echo $r1['link'];?>"><?php echo $r1['sub_menu'];?></a></li>
<?php } ?>
</ul>
</li>
<?php } ?>
</ul>
</div>

ممنون میشم اگه راهنماییم کنید

a_mzadeh
دوشنبه 02 دی 1392, 14:47 عصر
سلام؛
پیشنهاد من این هست که شما این سه مورد رو به ترتیب چک کنی:
۱. اینکه آیا داده‌ها تو دیتابیس درست ثبت می‌شن یا نه (id مربوط به parent درست هست یا نه)
۲. اینکه زمان load داده‌ها به درستی خونده میشن یا نه و اینکه داده‌ها به درستی به دست کلاینت میرسن یا نه.
۳. در مرحله آخر اگر باز هم مشکل وجود داشت، ممکنه اشکال از css ها باشه که submenu ها در parent‌ اولی نمایش میده.

موفق باشی

lili.lrp
دوشنبه 02 دی 1392, 15:13 عصر
ممنون از راهنماییتون.
id مربوط به parent به درستی ذخیره میشه ولی برفرض اگر id منوی parent 14 باشه توی جدول زیر منوها زیر منوی مربوط به این parent هر کاری میکنم یا 0 نشون میده یا 13 توی نمایش مشکلی نداره ولی خب به تربیبی که توی دیتابیس هست و منو و زیر منو و به هم ربط میده

a_mzadeh
دوشنبه 02 دی 1392, 15:18 عصر
راستش من متوجه این قسمت نشدم:

توی جدول زیر منوها زیر منوی مربوط به این parent هر کاری میکنم یا 0 نشون میده یا 13
ولی اگر اون چیزی که من برداشت می‌کنم درست باشه، احتمالا تو insert مقادیر parentID مشکلی وجود داره. این مشکل از دو تا چیز ممکنه به وجود اومده باشه، ۱. ممکن هست که اصلا داده درست به سرور ارسال نشده باشه، برای اطمینان شما میتونی متغیرهای post و get خودت رو یک جا لاگ کنی و چک کنی که آیا داده‌ها درست به سرور ارسال میشن یا نه. ۲. ممکن هست مشکل از کد sql باشه.

lili.lrp
دوشنبه 02 دی 1392, 15:24 عصر
این کد insert که یکمی تغییرش دادم ولی بازم نمیشه:

function menu(){

if(isset($_POST['addto'])){
$parent=$_POST['parent'];
$child1=$_POST['child1'];
$url=$_POST['url'];
$menuquery=mysql_query("SELECT * FROM `menu`");
$rowmenu=mysql_fetch_assoc($menuquery);
$query = mysql_query("SELECT * FROM `sub_menu`");
$r1 = mysql_fetch_array($query);
$id=$r1['menu_id'];
if($id == $rowmenu['menu_id']){
$menu_id= $rowmenu['menu_id'];
}

mysql_query("INSERT INTO `menu` (`menu_name`)VALUES('$parent')")or die(mysql_error());
mysql_query("INSERT INTO `sub_menu` (`sub_menu`,`menu_id`,`link`)VALUES('$child1','$me nu_id','$url') ")or die(mysql_error());

}
}

a_mzadeh
دوشنبه 02 دی 1392, 15:28 عصر
احتمالا مشکل از این قسمت کد باشه:

$id=$r1['menu_id']; if($id == $rowmenu['menu_id']){ $menu_id= $rowmenu['menu_id']; }
عبارت‌های زیر رو اجرا کن ببین کوئری همون چیزی هست که باید باشه:


echo "INSERT INTO `menu` (`menu_name`)VALUES('$parent')";
echo
"INSERT INTO `sub_menu` (`sub_menu`,`menu_id`,`link`)VALUES('$child1','$me nu_id','$url') ";
exit;

lili.lrp
دوشنبه 02 دی 1392, 15:45 عصر
اجرا کرد $menu_id ازش ایراد میگیره منم فکر میکنم ایراد از:

$id=$r1['menu_id']; if($id == $rowmenu['menu_id']){ $menu_id= $rowmenu['menu_id']; }
باشه ولی نمیدونم که چیکار کنم کهتشخیص بده توی جدول زیر منوها بفهمه که الان آیدی parent چنده که زیرمنو بهش ربط بدهی یعنی دقیقا ثبت آیدی منو که در جدول منوها هست در جدول sub_menu درست ذخیره بشه

a_mzadeh
دوشنبه 02 دی 1392, 15:54 عصر
کدت چند تا ایراد داره، باید اینطوری باشه:


if(isset($_POST['addto'])){
$parent=$_POST['parent'];
$child1=$_POST['child1'];
$url=$_POST['url'];

$sw = true;
$menuquery=mysql_query("SELECT * FROM `menu`");
while ($sw && $rowmenu=mysql_fetch_assoc($menuquery)) {
$query = mysql_query("SELECT * FROM `sub_menu`");
while ($sw && $r1=mysql_fetch_array($query)) {
$id=$r1['menu_id'];
if($id == $rowmenu['menu_id']){
$menu_id= $rowmenu['menu_id'];
$sw = false;
}
}
}

mysql_query("INSERT INTO `menu` (`menu_name`)VALUES('$parent')")or die(mysql_error());
mysql_query("INSERT INTO `sub_menu` (`sub_menu`,`menu_id`,`link`)VALUES('$child1','$me nu_id','$url') ")or die(mysql_error());
}

marys_farahani
دوشنبه 02 دی 1392, 16:07 عصر
چند تا سوال ؟؟ شما مشکلتون در خروجی هست یعنی نمیتونید زیر منوها رو نشان بدید یا هنگام اینسرت مشکل دارید اول این مشخص کنید بعد تا چند مرحله میشه زیر منو وارد کرد اینم بگید من براتون یه کوئری مینویسم .

lili.lrp
دوشنبه 02 دی 1392, 16:37 عصر
از $menu_id ایراد میگیره Undefined

lili.lrp
دوشنبه 02 دی 1392, 16:40 عصر
چند تا سوال ؟؟ شما مشکلتون در خروجی هست یعنی نمیتونید زیر منوها رو نشان بدید یا هنگام اینسرت مشکل دارید اول این مشخص کنید بعد تا چند مرحله میشه زیر منو وارد کرد اینم بگید من براتون یه کوئری مینویسم .
ببینید توی خروجی هر چیزی که توی دیتابیس هست نشون میده من امتحان کردم وقتی دستی اطلاعات و وارد دیتابیس میکنم توی خروجی درست نشون میده اما زمانیکه از طریق کد insert وارد دیتابیس میکنم توی جدول menu اطلاعات وارد میشه ولی توی جدول sub_menu آیدی صحیح ووارد نمیکنه مثلا اگه menu_id توی جدول menu 3 باشه توی جدول sub_menu مقدار menu_id و به جای 3 عدد 0 نشون میده

marys_farahani
دوشنبه 02 دی 1392, 16:44 عصر
ببینید توی خروجی هر چیزی که توی دیتابیس هست نشون میده من امتحان کردم وقتی دستی اطلاعات و وارد دیتابیس میکنم توی خروجی درست نشون میده اما زمانیکه از طریق کد insert وارد دیتابیس میکنم توی جدول menu اطلاعات وارد میشه ولی توی جدول sub_menu آیدی صحیح ووارد نمیکنه مثلا اگه menu_id توی جدول menu 3 باشه توی جدول sub_menu مقدار menu_id و به جای 3 عدد 0 نشون میده


اول منو رو insert میکنی بعد کوئری select میزنی و ای دی میگیری و هنگام وارد کردن sub menu به جای menu_id -> ای دی منو اصلی رو میگذاری درسته ؟؟ روند کارت اینطوریه ؟؟

چون اول باید منو اصلی ایجاد بشه بعد ای دی بگیری بریزی به جایی منو ای دی ثانویه ؟ همزمان نمیتونی اینها رو اینسرت کنی

lili.lrp
دوشنبه 02 دی 1392, 16:48 عصر
بله میخوام اول منوی اصلی وارد بشه بعد زیر منو و menu_id از جدول منو وارد جدول sub_menu هم بشه یه طوریکه مشخص بشه زیر منو تعلق به کدوم منوی اصلیه

a_mzadeh
دوشنبه 02 دی 1392, 16:50 عصر
از $menu_id ایراد میگیره Undefined
دلیلش اینه که وارد شرط نمیشه و متغیرت مقدار نمیگیره، کدی که من گذاشتم و چک کردی؟

marys_farahani
دوشنبه 02 دی 1392, 16:51 عصر
بله میخوام اول منوی اصلی وارد بشه بعد زیر منو و menu_id از جدول منو وارد جدول sub_menu هم بشه یه طوریکه مشخص بشه زیر منو تعلق به کدوم منوی اصلیه


برو اونجایی که ای دی منو اصلی رو میخواد بریزه برای زیر منو ببین اصلا محتوا داره ؟؟ بعد اگه درست بود نگاه کن که هنگام اینسرت کردن برای دیتابیس مقداری رو درست نوشتی مثلا جا به جا ننوشتی


INSERT INTO `sub_menu` (`sub_menu`,`menu_id`,`link`)VALUES('submenu','men uid','$link') "


همینطوری مرحله به مرحله تست کن.

lili.lrp
دوشنبه 02 دی 1392, 16:54 عصر
من به یه چیزی توجه نکرده بودم شما گفتید که همزمان نیمشه insert کرد کدهام و به این شکل تغییر دادم ولی الان فقط آیدی اولین منوی اصلی و از جدول menu نشون میده فکر کنم while نیاز داره نمیدونم دقیقا while و باید کجا ازش استفاد کنم


if(isset($_POST['addto'])){
$parent=$_POST['parent'];
mysql_query("INSERT INTO `menu` (`menu_name`)VALUES('$parent')")or die(mysql_error());
$menuquery=mysql_query("SELECT * FROM `menu`");
$rowmenu=mysql_fetch_assoc($menuquery);
$child1=$_POST['child1'];
$url=$_POST['url'];
$menu_id=$rowmenu['menu_id'];

mysql_query("INSERT INTO `sub_menu` (`sub_menu`,`menu_id`,`link`)VALUES('$child1','$me nu_id','$url') ")or die(mysql_error());


}

lili.lrp
دوشنبه 02 دی 1392, 16:58 عصر
درست شد:

if(isset($_POST['addto'])){
$parent=$_POST['parent'];
mysql_query("INSERT INTO `menu` (`menu_name`)VALUES('$parent')")or die(mysql_error());
$menuquery=mysql_query("SELECT * FROM `menu`");
while($rowmenu=mysql_fetch_assoc($menuquery)){
$child1=$_POST['child1'];
$url=$_POST['url'];
$menu_id=$rowmenu['menu_id'];}

mysql_query("INSERT INTO `sub_menu` (`sub_menu`,`menu_id`,`link`)VALUES('$child1','$me nu_id','$url') ")or die(mysql_error());


}

marys_farahani
دوشنبه 02 دی 1392, 16:58 عصر
شما در اینجا دارید منوها اصلی انتخاب میکنید . و همه رو میریزد دارید یه ارایه



$menuquery=mysql_query("SELECT * FROM `menu`"); $rowmenu=mysql_fetch_assoc($menuquery);



در صورتی که باید شرط بزارید که فقط اون منو خاص رو براتون برگردون WHERE id = $id چون داری واسه یه منو خاص زیرمجموعه ایجاد میکنی درسته ؟؟

اگه این برای پنل ادمینتونت هست ؟

lili.lrp
دوشنبه 02 دی 1392, 17:00 عصر
بله برای پنل ادمینه. کاری که کردم غیر اصولیه؟

marys_farahani
دوشنبه 02 دی 1392, 17:06 عصر
بله برای پنل ادمینه. کاری که کردم غیر اصولیه؟


بله کارتون یکم غیراصولیه
شما باید برای ایجاد زیر منو ای دی منو اصلی رو داشته باشید .


الان متوجه شدی باید چیکار کنی یا سردرگم شدی ؟ میخوایی اون تیکه کدت برام بفرستی برات درست کنم؟

lili.lrp
دوشنبه 02 دی 1392, 17:09 عصر
وقتی شرط و توی query میذارم بازم باید while باشه یا نه دیگه نیازی نیست؟

lili.lrp
دوشنبه 02 دی 1392, 17:12 عصر
الان متوجه شدی باید چیکار کنی یا سردرگم شدی ؟ میخوایی اون تیکه کدت برام بفرستی برات درست کنم؟
بله همینجا براتون کدم و بذارم؟؟ :ناراحت:

marys_farahani
دوشنبه 02 دی 1392, 17:12 عصر
وقتی شرط و توی query میذارم بازم باید while باشه یا نه دیگه نیازی نیست؟


وقتی ای دی رو داشته باشی دیگه while نیازی نیست . چون برنامه میفهمهکه این زیر منو قرار برای کدوم منو ایجاد بشه منو اصلی که قرار برایش زیر منو ایجاد کنی یکی هست پس while نمیخواد . فقط باید ای دی رو ذخیره کنی تو فرم و بعد برای ایجاد زیرمنو صداش بزنی و ازش استفاده کنی.

marys_farahani
دوشنبه 02 دی 1392, 17:16 عصر
من منوهام اینطوری و همه رو تو یه جدول ایجاد میکنیم


id---------------- name_menu------------ parent_id

----0 ------------------- منو 01 ---------------------1
----1 ------------------- زیر منو 01 -----------------2
----0 ------------------- منو 02 --------------------3
----3 ------------------- زیر منو 02 ----------------4



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

به نظرم دو تا جدول داشتی که نیازی به این کار نیست . :چشمک:

lili.lrp
دوشنبه 02 دی 1392, 17:18 عصر
ببخشید میشه بگید چطوری براش شرط بذارم؟

if(isset($_POST['addto'])){
$parent=$_POST['parent'];
mysql_query("INSERT INTO `menu` (`menu_name`)VALUES('$parent')")or die(mysql_error());
$menuquery=mysql_query("SELECT * FROM `menu`");
$rowmenu=mysql_fetch_assoc($menuquery);
$child1=$_POST['child1'];
$url=$_POST['url'];
$menu_id=$rowmenu['menu_id'];

mysql_query("INSERT INTO `sub_menu` (`sub_menu`,`menu_id`,`link`)VALUES('$child1','$me nu_id','$url') ")or die(mysql_error());


}

lili.lrp
دوشنبه 02 دی 1392, 17:19 عصر
راست میگید اصلا نیازی نبود که دوتا جدول بذارم ولی نیمتونم جدول و از دیتابیسم پاک کنم!:خجالت:

marys_farahani
دوشنبه 02 دی 1392, 17:27 عصر
راست میگید اصلا نیازی نبود که دوتا جدول بذارم ولی نیمتونم جدول و از دیتابیسم پاک کنم!:خجالت:


زمانی که داری منوها رو به ادمین نشان میدی قطعا میریزشون داخل یه گرید یا جدول

خوب قعطا برای رفتن و زیر منو ساختن یه دکمه گذاشتی دیگه که طرف روش زد یا یه div باز بشه یا بره تو یه صفحه دیگه و اونجا بتونه زیر منو رو تایپ کنه و دکمه ایجاد رو بزنه درسته ؟؟؟

حالا رو اون دکمه داره ارسال میکنه کاربر رو برای ایجاد زیر منو ای دی رو هم پاس بده مثلا اینطوری
onclick="add( this.id)"


و با یه فانکشن جی کوئری بگیریش و حتی ارسال کنی برای فایل مورد نظر




<script>
function add(id)
{
$.post('pathfile.php',{ajaxid:id},function(data){
if(data == 1)
{
alert('زیر منو با موفقیت ایجاد شد.');
}
else
{
alert('خطا در ذخیره سازی دوباره تلاش کنید');
}
})
}
</script>


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

lili.lrp
دوشنبه 02 دی 1392, 17:36 عصر
ممنون متوجه منظورتون شدم خیلی ممنون از کمکتون :لبخندساده:

marys_farahani
دوشنبه 02 دی 1392, 17:40 عصر
ممنون متوجه منظورتون شدم خیلی ممنون از کمکتون :لبخندساده:


خدا رو شکر. موفق باشی :تشویق: