PDA

View Full Version : کد PHP درون کد جاواسکریپت



sobhan01
چهارشنبه 04 شهریور 1394, 17:26 عصر
<script>
for (var counter = 0; counter <= '<?php $last_id?>'; counter++) {

var Count_php = '<?php $counter=0;?>';
marker('<?php $data["lat"][$counter]?>','<?php $data["lng"][$counter]?>');
Count_php = '<?php $counter++;?>';
alert('<?php $counter ?>');


}
</script>

بنظرتون مشکل کد من کجاست؟

-سیّد-
پنج شنبه 05 شهریور 1394, 00:50 صبح
اجازه بدین اول کدتون رو فرمت کنم:


<script>
for (var counter = 0; counter <= '<?php $last_id?>'; counter++) {
var Count_php = '<?php $counter=0;?>';
marker('<?php $data["lat"][$counter]?>','<?php $data["lng"][$counter]?>');
Count_php = '<?php $counter++;?>';
alert('<?php $counter ?>');
}
</script>


خوب حالا اجازه بدین بخونمش بعد جواب می‌دم! :)

...

خوب خوندم!
هدف چیه؟ این که یه کد جاوااسکریپت تولید بشه که خودش داینامیک هست. در نتیجه می‌خوایم توسط php این کد رو تولید کنیم.
شما این کد رو روی سرور اجرا کردید و خروجی رو نگاه کردید؟ اگه این کار رو بکنید، می‌بینید اینطوری خروجی می‌ده:


for (var counter = 0; counter <= ''; counter++) {
var Count_php = '';
marker('<br />
<b>Notice</b>: Undefined variable: data in <b>C:\xampp\htdocs\test\nums\10.php</b> on line <b>3</b><br />
','<br />
<b>Notice</b>: Undefined variable: data in <b>C:\xampp\htdocs\test\nums\10.php</b> on line <b>3</b><br />
');
Count_php = '';
alert('');
}


اگر فرض کنیم متغیرهای last_id و data رو بالاتر تعریف کردید، خروجی اینطوری می‌شه:

for (var counter = 0; counter <= ''; counter++) {
var Count_php = '';
marker('','');
Count_php = '';
alert('');
}


خوب مشخصه که این کد توی جاوا اسکریپت اشکال داره. اولین اشکالش اینه که شما یه for گذاشتید، توی شرط خروجش متغیر counter رو که عدد هست رو با یه String مقایسه کردید. پس اون کوتیشن‌ها اونجا اضافی هستن.
دومین نکته اینه که هر مقداری که به متغیر last_id داده باشید، اینجا چیزی نوشته نمی‌شه و خالی می‌مونه! اشکال کار کجاس؟ اینه که شما توی تگ php تون چیزی رو توی خروجی ننوشتید. یعنی یه تگ php باز کردید و فقط گفتید:

<?php $last_id?>
خوب انتظار که ندارید php با دیدن این دستور، مقدار متغیر last_id رو توی خروجی بنویسه؟ برای این که مقدارش رو بنویسه باید یا echo کنید (یا print)، یا از روش میانبر <?= استفاده کنید:


<?php echo $last_id ?>
یا
<?= $last_id ?>

همینطور در مورد بقیه‌ی جاهایی که می‌خواستید خروجی بدید هم باید همین کار رو بکنید.

نکته‌ی بعد اینه که شما منطق php رو با منطق javascript با هم قاطی کردید! اگه خوب به روند کار دقت کنید، قضیه رو متوجه می‌شید. وقتی که شما آدرس مورد نظرتون رو توی مرورگر وارد می‌کنید و enter می‌زنید، مرورگر یه درخواست به سرور شما (apache که روش php نصبه) می‌فرسته. apache نگاه می‌کنه می‌بینه فایل درخواستی شما از نوع php هست، برای همین می‌ده دست php می‌گه این فایل مال تو! php شروع می‌کنه فایل شما رو خط به خط اجرا کردن، و در نتیجه‌ی این اجرا، یه سری خروجی تولید می‌شه. این خروجی به مرورگر فرستاده می‌شه و مرورگر اون رو تحلیل می‌کنه و به کاربر نمایش می‌ده. حالا اگه توی این خروجی javascript هم باشه، توی مرورگر و سمت client اجرا می‌شه، نه سمت سرور.
پس شد این: کدهای php شما سمت سرور اجرا می‌شن، اجراش تموم می‌شه، خروجی ساخته می‌شه و برای مرورگر فرستاده می‌شه (البته ممکنه تیکه تیکه برای مرورگر فرستاده بشه و یه ضرب همه‌اش با هم فرستاده نشه). بعد کدهای جاوا اسکریپت توی مرورگر سمت client اجرا می‌شن.

حالا شما با این منطق یه بار کدت رو نگاه کن. شما توی حلقه‌ای که توی جاوا اسکریپت گذاشتی، متغیر php ات رو زیاد کردی. خوب این منطق اشکال داره، چون توی کد php شما سمت سرور هیچ حلقه‌ای وجود نداره و در نتیجه اون متغیر counter توی php فقط یک بار ++ می‌شه و مقدارش به صورت ثابت توی خروجی میاد. حالا مرورگر حلقه‌ی for جاوا اسکریپت شما رو اجرا می‌کنه که توش یه عدد ثابت به جای اون متغیر php هست. یعنی اون خط ۲ تا مونده به آخر که توش متغیر php رو ++ کردید، فقط یک بار سمت سرور اجرا می‌شه و مقدار متغیر رو برابر یک می‌کنه. بعد این عدد ثابت یک توی خروجی میاد دست مرورگر و حلقه‌ی جاوا اسکریپت شما اگه ۱۰۰ بار هم اجرا بشه، همیشه مقدار یک alert می‌شه.