PDA

View Full Version : سوال: فراخوانی متغییر از تابع اجرا شده



vafa
چهارشنبه 23 تیر 1389, 16:16 عصر
برای نمایش کومبو باکس های وابسته به هم(مادر-فرزند) به صورت ابتکاری چند خط کد نوشته ام ولی این قسمت آخرش گیر کردم.
امیدوارم کمکم کنید.
لطفا مشاهده فرمایید: http://pixelstore.ir/fn.html
در صورت فراخوانی تابع level_calculator، تابع دوم یعنی shop_query فراخوانده می شود.
در تابع shop_query یک case وجود دارد به نام read_parent که شرط آن دو خروجی دارد
خروجی دوم، متغییر $id را برنمی گرداند.
علتش را میدانم ولی راه کار درستش را نه.

ممنون می شوم راهنمایی فرمایید.

امیـرحسین
چهارشنبه 23 تیر 1389, 20:27 عصر
ابتدا جواب سوالتون. شما id رو به تابع دوم ندادید که وجود داشته باشه.

شما چند تا غیر جذاب کردید.
اول اینکه برای فرستادن format از ثابت تعریف نشده استفاده کردید. بجاش از string ساده استفاده کنید:
function shop_query("...", "read_parent");
//....
case "get_id_name":
//....
دوم اینکه برای ایزوله کردن از کوئری استفاده کنید. بهتره بجای اینکه خود کوئری رو مستقیما بفرستید و در تابع اجراش کنید، کلیدهای لازم رو بفرستید. اینجوری کنترل تابع خیلی ساده تره. این کد رو با کد خودتون مقایسه کنید:
<?php

function level_calculator($id){
function shop_query($id, "read_parent");
}

function shop_query($id,$format){

$host ="localhost";
$user ="vafa";
$password ="jhgfdsa";
$database ="shop";

$conn = mysql_connect("$host", "$user", "$password");
mysql_set_charset('utf8',$conn);
if (!$conn) {
echo "ÎØÇ ÏÑ ÇÑÊÈÇØ ÈÇ ÇíÇå ÏÇÏå : " . mysql_error();
exit;
}

if (!mysql_select_db("$database")) {
echo "ÇíÇå ÏÇÏå ãæÑÏ äÙÑ æÌæÏ äÏÇÑÏ " . mysql_error();
exit;
}


switch($format){
case "get_id_name":
$query = "SELECT * FROM tree WHERE blah_blah_id=$id";
// ...
break;

case "get_product_id":
break;

case "get_customer":
break;

case "get_products":
break;

case "get_name":
break;

case "read_parent":
$query = "SELECT * FROM tree WHERE parent_id=$id";
$result = mysql_query($query);

$nrows = mysql_num_rows($result);
if ($nrows>=1){
echo "\n\t\t<select name='type' id='type' class='en text'>\n";
for ($i=0;$i<$nrows;$i++) {
$row = mysql_fetch_assoc($result);
extract($row);
echo "\t\t\t<option onmouseout=\"getData('http://w7u-pc/shop/combobox.php?value=$id','combo";
if ($id<=9) {echo "1";}
if ($id>9 and $id<99) {echo "2";}
if ($id>99 and $id<999){echo "3";}
echo "')\" value='$id'>$cat_name</option>\n";
}
echo "\t\t</select>\n";
}
else{
echo "get pruduct with mother cat id=$id";
}
break;
}
}
?>
سوم اینکه کدهاتون رو اینجا بذارید بجای اینکه لینک به فایل بدید چون فردا که اون فایل پاک شه، این تاپیک به هیچ درد نمیخوره.

vafa
چهارشنبه 23 تیر 1389, 23:48 عصر
ممنون از راهنماییتون
علت اینکه کوری رو به شکل متغیر به تابع می دادم، راحت تر کردن و باز تر بودن فراخوانی اصلاعات از دیتابیس بود
ولی الان که بهش فکر می کنم می بینم فرقی نمی کنه چون باید توی case هام اختصاصا تعریفش کنم.
مشکلم رو البته طور دیگه ای حل کردم و اصرارم برای استفاده از یک تابع برای گزارش گیری از دیتابیس رو بی خیال شدم و در همون تابع level_calculator همه کار هارو انجام دادم.
اینطوری:

function level_calculator($id){
shop_db_connect();
$result = mysql_query("SELECT * FROM tree WHERE parent_id=$id");
$nrows = mysql_num_rows($result);
if ($nrows>=1){
echo "somthing...";
}
}
else{
$result = mysql_query("SELECT * FROM product WHERE cat_id=$id");
$nrows = mysql_num_rows($result);
for ($i=0;$i<$nrows;$i++) {
$row = mysql_fetch_assoc($result);
extract($row);
echo "some other things!...";
}
}
}

خیلی ساده بود ولی پیچیده کرده بودمش
یک سوال، در حالت قبلی، با global کردن متغیر هم جواب نمی داد. چرا؟
مگر نه اینکه global در همه توابع قابل دسترسیه؟