PDA

View Full Version : اشکال در کد جاوا اسکریپت



saeidejafari
چهارشنبه 18 اردیبهشت 1387, 11:47 صبح
من مجبورم که تو ی برنامم قبل از تگ ها html کد جاوا بنویسم:لبخند: چون قبل از اینکه کدهای html اجرا بشه کدهای php زیادی رو اجرا می کنه . این کدهای جاوا هم حتما باید قبل از کدهای php اجرا بشن .تا اینجای قضیه که مشکلی نداشتم و برنامه هم اجرا شد و خوب هم کار کرد ولی در بالای صفحه یک خط خالی میندازه و محتوای صفحه رو نشون می ده.
میشه این خط رو حذف کرد؟:متفکر:

saeidejafari
شنبه 21 اردیبهشت 1387, 10:01 صبح
یعنی کسی تا حالا به این جور مشکلی بر نخورده:عصبانی::عصبانی++:

twelve
شنبه 21 اردیبهشت 1387, 10:28 صبح
ای بابا چرا خود کشی؟!! خب سوالتون مبهمه که دوستان جوابی ندادند.


ولی در بالای صفحه یک خط خالی میندازه و محتوای صفحه رو نشون می ده.منظورتون از این خط واضح تر میگید؟ چی رو نشون میده ؟ اشکال از جاوا اسکریپت و زمان اجرا شدنشه؟!

saeidejafari
یک شنبه 22 اردیبهشت 1387, 12:39 عصر
یعنی مثل اینکه من یه کد <br> اول برنامه نوشته باشم یه enter اول صفحه می زنه و خروجی برنامه رو بعدش نشون میده یعنی لوگوی سایت و بقیه محتویات رو یه خط پایین می بره. توی view source صفحه که می رم قبل از تگ html یه space هست
اشکال از جاوا اسکریپت و زمان اجرا شدنشه؟!نمی دونم ولی وقتی کدهای جاوا اسکریپت رو حذف می کنم اون فاصله حذف میشه و در نتیجه اون خط خالی هم حذف میشه خودم میگم که مشکل زمان اجرا شدن جاوا اسکریپته.

twelve
یک شنبه 22 اردیبهشت 1387, 13:03 عصر
پس کد جاوا رو اینجا کپی مرحمت کنید!

svm-webmaster
یک شنبه 22 اردیبهشت 1387, 18:27 عصر
توی view source صفحه که می رم قبل از تگ html یه space هست
تو خود کدهای هم این space را می بینید؟ اگر بله آن را پاک کنید اگر نه کدهای را قرار دهید.

saeidejafari
دوشنبه 23 اردیبهشت 1387, 08:48 صبح
نه توی کد هیچ space ی نیست.


<script language="javascript" type="text/javascript">




var u = document.URL;

var a=u.toLowerCase();
a.toLowerCase();
</script>
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<p>salam</p>
</body>
</html>


اگه ممکنه همین کد ساده ای که گذاشتم رو اجرا کنید (البته این کد کد واقعی نیست)متوجه مشکل من خواهید شد یه چیزی هم که تازه متوجه شدم اینه که اگه browser فایر فاکس باشه اون خط رو نمیاره توی IE این مشکل داره!! :گیج:

twelve
دوشنبه 23 اردیبهشت 1387, 11:40 صبح
آخه دل انگیز جان چرا خودتو عذاب میکنی ؟!!
این <head> واسه اینه که هر چیزی رو ما قراره بذاریمش توی سربرگ صفحه در این تگ بذاریم!!! از جمله تگ <script> !!!!

saeidejafari
دوشنبه 23 اردیبهشت 1387, 11:46 صبح
متوجه ام .آخه <head> من زمانی صدا زده می شه که قبل از اون کلی کد php اجرا میشه.در واقع مسیر یابی های برنامه و توابعی که باید include بشن و ...جاوا اسکریپت من هم باید قبل از phpها اجرا بشه. توی تایپیک اولم گفتم که!

twelve
دوشنبه 23 اردیبهشت 1387, 11:46 صبح
یه چیزی یادم رفت بگم ، اینکه بهتره کدهای جاوا رو توی فانکشن قرار بدی و اگر هم خواستی اسکریپتهای خاصی رو به محض باز شدن صفحه اجرا کنی ، با window.onload تابع مربوطه رو صدا بزنی ...

twelve
دوشنبه 23 اردیبهشت 1387, 11:49 صبح
متوجه ام .آخه <head> من زمانی صدا زده می شه که قبل از اون کلی کد php اجرا میشه.در واقع مسیر یابی های برنامه و توابعی که باید include بشن و ...جاوا اسکریپت من هم باید قبل از phpها اجرا بشه. توی تایپیک اولم گفتم که!

خب شما جاوا اسکریپت رو با php تولید و اجرا کن

saeidejafari
دوشنبه 23 اردیبهشت 1387, 12:35 عصر
بهتره بگم که برای چی دارم خود کشی می کنم تا از طریق جاوا اسکریپت بنویسمش. من می خوام یک سری از مقادیری که توسط کاربر وارد می شه رو چک می کنم تا اگه داده ی نا مربوطی رو وارد کرد اونو به صفحه error ببرم. برای همینم باید قبل از رسیدن داده ها به سرور اونا رو چک کنم. من از اول همین کارو کرده بودم یعنی توی php نوشتم و مشکلی هم نداشتم برنامه هم داشت درست کار می کرد (به نظر من تابع php هم قبل از رسیدن داده ها به سرور اجرا می شد اینو هم می دونم که php سرور سایده و جاوا اسکریپت کلاینت ساید) . یکی اومد و کاسه کوزه ی ما رو به هم ریخت و گفت:"هر چی که توی php نوشته بشه طرف سرور اجرا می شه تو باید تابع رو توی جاوا اسکریپت بنویسی" به خاطر همینم دارم سعی می کنم از طریق جاوا اسکریپت بنویسم.
به نظر شما این درسته که هر چیزی که توی php نوشته بشه داره طرف سرور اجرا میشه؟
حالا اگه مطمئن بشم که اگه توی php که می نویسم دادها به سرور نمی رسه که قضیه حله

twelve
دوشنبه 23 اردیبهشت 1387, 14:41 عصر
من می خوام یک سری از مقادیری که توسط کاربر وارد می شه رو چک می کنم تا اگه داده ی نا مربوطی رو وارد کرد اونو به صفحه error ببرم.همین ارسال به صفحه error یعنی اینکه بايد از php و برنامه نويسي سمت سرور استفاده کني يعني تابعي رو با php بنويسي که صحت اطلاعات رو کنترل کنه و در صورت درست بودن اونها عمليات رو ادامه بده ...

برای همینم باید قبل از رسیدن داده ها به سرور اونا رو چک کنماين جملت نقطه مقابل جمله قبليته ، اگر قبل از پردازش سرور ميخواي کنترل کني بايد از جاوا اسکريپت استفاده کني ، به عبارتي قبل از سابميت شدن فرمت براي اينکار هم تابع جاوا اسکريپتي بنويس که ورودي ها رو با Regex چک کنه و در صورت مغايرت داشتن با مقادير صحيح يا پیغام بده يا location رو به صفحه error ببره اين تابع رو هم بايد در رويداد click دکمه سابميت صدا کني و اصلا هم نياز به اجرای زود تر وجود نداره ....



به نظر من تابع php هم قبل از رسیدن داده ها به سرور اجرا می شد
درست نیست! توابع PHP به سرور apache که میرسن پردازش میشن


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



حالا اگه مطمئن بشم که اگه توی php که می نویسم دادها به سرور نمی رسه که قضیه حله


کلاينت سايد کارآمد تر ، حرفه اي تر و User Friendly تره ...

saeidejafari
سه شنبه 24 اردیبهشت 1387, 09:18 صبح
همین ارسال به صفحه error یعنی اینکه بايد از php و برنامه نويسي سمت سرور استفاده کني يعني تابعي رو با php بنويسي که صحت اطلاعات رو کنترل کنه و در صورت درست بودن اونها عمليات رو ادامه بده ...

ولی من همین کارو با جاوا اسکریپت انجام دادم و درست کار کرد.
آخه مشکل اینه که فقط متغیر های post رو نمی خوام چک کنم GETها و هر چیزی که در نوار آدرس تایپ میشه رو هم باید چک کنم.برای همینم نمی تونم توی رویداد click دکمه سابمیت بنویسم در ضمن این برنامه با memory چند لایه نوشته شده.
یه سوال:یکی از این متغیر ها id هست که فقط مقدار عددی رو میگیره که من قبل از اینکه این تابع( چک کردن مقادیر) رو با php بنویسم اگه کاربر برای متغیر id مقدار حرفی(مثلا tt) رو وارد می کرد این پیغام رو می داد

Unknown column 'tt' in 'where clause'
ولی بعد از اینکه تابع رو نوشتم و اجرا کردم اگه کاربر حرف (یا مقدار نادرستی) رو وارد می کرد به همون صفحه ERROR می رفت .برای همینه که من می گم php داره قبل از رسیدن به سرور اجرا می شه.
برای من فرقی نداره با php یا جاوا اسکریپت بنویسم چون به نظر من در هر دو حالت برنامه درست اجرا میشه حالا اگه حتما باید با جاوااسکریپت بنویسم مشکل من اینه که چطوری می تونم جاوا اسکریپت رو قبل از تگ html بنویسم و مشکلی نداشته باشه :گریه:

raravaice
سه شنبه 24 اردیبهشت 1387, 09:47 صبح
من می گم php داره قبل از رسیدن به سرور اجرا می شه.
یعنی میخوای بگی داره سمت کلاینت اجرا میشه یا توی روتر های بین راه؟!
شک نکن که کذبه.;)
همش سمت سرور اجرا میشه.



مشکل من اینه که چطوری می تونم جاوا اسکریپت رو قبل از تگ html بنویسم و مشکلی نداشته باشه

اگر شما بخوای با جاوا اسکریپت به هر یک از المانهای داخل صفحه دسترسی پیدا کنی حتما باید بین body یا head نوشته بشه که هر دو تا بین html قرار دارن و اگر هم میخوای از head یا هر جای دیگه به کنترلی دسترسی داشته باشی حتما باید بعد از body.onload باشه تا بتونه پیداش کنه!
حالا چرا تنها راه حل اینه؟!
چرا php رو با javascript قاطی میکنی ؟! اینا ربطی به هم ندارن غیر از اینکه شما یه سری مقادیر رو بین این دو جا بجا کنی.
صورت مسئله رو واضح بگو حتی شده نمونه سورس کامل جاوا اسکریپتت رو بزار تا دوستان کمکت کنن.

موفق باشید

twelve
سه شنبه 24 اردیبهشت 1387, 14:36 عصر
یکی از این متغیر ها id هست که فقط مقدار عددی رو میگیره که من قبل از اینکه این تابع( چک کردن مقادیر) رو با php بنویسم اگه کاربر برای متغیر id مقدار حرفی(مثلا tt) رو وارد می کرد این پیغام رو می داد


این Id که میگی احتمالا پارامتر Query String هست درسته ؟
ببین هر فرایندی که صفحه رو رفرش کنه (مثل فشردن دکمه سابمیت) و دوباره بار گذاری کنه از سمت سرور انجام میشه ، فرستادن پارامتر ID شما هم صفحه رو رفرش میکنه و نتیجه ای رو بر میگردونه (خطا هم خودش یه نتیجه پردازشی سمت سروره )

saeidejafari
چهارشنبه 25 اردیبهشت 1387, 11:08 صبح
این Id که میگی احتمالا پارامتر Query String هست درسته ؟

بله درسته

ببین هر فرایندی که صفحه رو رفرش کنه (مثل فشردن دکمه سابمیت) و دوباره بار گذاری کنه از سمت سرور انجام میشه ، فرستادن پارامتر ID شما هم صفحه رو رفرش میکنه و نتیجه ای رو بر میگردونه (خطا هم خودش یه نتیجه پردازشی سمت سروره )
پس با این اوصاف تابع php نمی ذاره که مقدار id توی سرور اجرا بشه چون اگه می ذاشت اجرا بشه که اون خطای unknow column ... رو می داد.درست ميگم؟

saeidejafari
شنبه 28 اردیبهشت 1387, 08:50 صبح
این همه برنامه نویس وب یعنی برای هیچکدومتون پیش نیومده که بخواین جاوااسکریپت رو قبل از تگ html بنویسید؟

raravaice
شنبه 28 اردیبهشت 1387, 10:13 صبح
این همه برنامه نویس وب یعنی برای هیچکدومتون پیش نیومده که بخواین جاوااسکریپت رو قبل از تگ html بنویسید؟

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

موفق باشید

vahid4134
شنبه 28 اردیبهشت 1387, 13:36 عصر
بله درسته

پس با این اوصاف تابع php نمی ذاره که مقدار id توی سرور اجرا بشه چون اگه می ذاشت اجرا بشه که اون خطای unknow column ... رو می داد.درست ميگم؟

دوست عزیز شما دای همه چیز رو با هم دیگه قاطی می کنی. من یک مثال می زنم
من یک صفحه دارم که توش email وجود داره حالا می خوام این رو از طرف کاربر چک کنم که اگر ایمیل معتبر نبود بهش اخطار بده. خوب میام و وقتی submit رو زد چک می کنم که مقدار درست باشه اگر نبود نمی زارم که سابمیت عمل کنه. اگر درست بود می زارم ارسال بشه وقتی ارسال شد دیگه رفت واسه سرور. سرور یک پردازش می کنه بعد اطلاعات رو برای تو می فرسته. یعنی اگر حتی تو قبل از کدهای php کد جاوااسکریپت بزاری کدهای php اجرا میشه چون باید اجرا بشه و بعد نتیحه رو به apache میده و apache به مرورگر تو.
اما یک نکته ای رو مد نظر داشته باش که چک کردن اطلاعات در کلاینت ساید فقط باعث یوزر فرندلی بودن میشه هیچ تظمینی رو نداره. من به راحتی می تونم javascript مرورگر خودم رو دیسیبل کنم یا اصلا از یک فرم دیگه ای که دستساز درست کنم برای اسکریپت تو که با php هست اطلاعات بفرستم . اسکریپت تو که نمی دونه از کدوم فرم براش اطلاعات ارسال میشه.
در مورد اخطاری هم که داده شده این یک نوع bug توی اسکریپت تو هست چون مثلا تو نوشتی


$id=$_GET['id'];
$sql="select * from vahid where id=$id";


خوب وقتی که عدد توی get ارسال میشه درست کار می کنه مثلا اگر ۲ باشه میشه


select * from vahid where id=2


حالا اگر بنویسه tt اون وقت میشه


select * from vahid where id=tt


خوب اینجا mysql دنبال فیلد tt می گرده که وجود نداره برای رفع این باگ دو راه داری (همه این باگها باید روی سرور درست بشه نه کلاینت چون اعتباری به کلاینت نیست)
یا باید کدت رو به صورت


$id=(int)$_GET['id'];


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


$sql="select * from vahid where id='$id'";


بنویسی که به mysql بفهمونی که این یک رشته هست و خودش اگر لازم باشه به int تبدیل می کنه که البته روش اول صحیحتر هست

saeidejafari
یک شنبه 29 اردیبهشت 1387, 10:10 صبح
سلام دوستان!
از اینکه به تاپیک من توجه کردید و به من جواب دادید ممنون.:تشویق:مخصوصا از جناب twelve
من هنوز نفهمیدم که باید چیکار کنم برای همین سوالمو کامل تر می پرسم :
این فایل index.php پروژه است




<?php
session_start();
error_reporting("E_ALL");
include('admin/Functions.php');
include("include/includes.php");
include("include/classes.php");
include("include/Path.php");
$smarty->display('index.tpl');
?>

تمام صفحات سایت توی همین index.php تولید میشن و همین جا نمایش داده میشن در واقع توی path.php با توجه به متغیر های GET و POST مشخص میشه که چه عملی(action) باید انجام بشه و سپس چه محتویاتی باید نمایش داده بشه پس از اینکه عملیات انجام شد و محتویات هم مشخص شد فایل index.tpl صدا زده میشه که توی این فایل کدهای html (از جمله تگ html و head)و اسمارتی نوشته می شه .
از sql injection و javascript injection هم جلوگیری کردم ولی برای امنیت بیشتر می خوام url سایت (آدرس تایپ شده در نوار آدرس) رو چک کنم تا به غیر از مقادیر مجاز (که در برنامه استفاده شده) کسی نتونه مقدار دیگه ای رو وارد کنه (متغیر ها هم که یا GET یاPOST هستن) این کار رو هم باید حتما قبل از اجرا شدن مقادیر در سرور انجام بدم تا اگه کسی مقداری به غیر از مقادیر مجاز را به صورت دستی در نوار آدرس تایپ کرد توی سرور اجرا نشه و مشکلی پیش نیاد.
حالا بماند که این کار(چک کردن مقادیر و متغیر ها) منطقی هست یا نه.
تا اینجا که من از جواب های دوستان فهمیدم باید از جاوا اسکریپت برای چک کردن استفاده کنم نه php .
با توجه به توضیحاتی که دادم اگه بخوام این تابع جاوااسکریپت رو صدا بزنم باید کجا صدابزنم که مقادیر به سرور نرسه . اگه بخوام بین تگ head بذارمش که فایده ای نداره چون وقتی برنامه به فایل index.tpl می رسه همه پردازش هارو کرده .
برای همینه که می گم چاره ای جز اینکه جاوااسکریپت و قبل از تگ html بنویسم ندارم .
اگه راه حل بهتری دارید دریغ نکنید.

raravaice
یک شنبه 29 اردیبهشت 1387, 10:31 صبح
اگر اطلاعات مهمی رو قرار بررسی کنی همون سمت سرور این کارو بکن چون با Debuger های امروزی به راحتی میشه تغییرات بسزایی رو روی سورس شما به صورت RunTime ایجاد کرد که بشه اطلاعات رو اشتباه به سرور داد.پس به اهراز هویت اطلاعات در سمت کلاینت اکتفا نکن.

بهتره یه گریزی هم به تالار php سایت بزنی.

موفق باشید