PDA

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



vioming
چهارشنبه 26 فروردین 1394, 01:07 صبح
با سلام

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



$sql = "SELECT * FROM `documents` inner join `persons` on documents.person_id = persons.id where documents.register_id=$_SESSION[id] AND documents.date between '".$mDate1."' and '".$mDate2."';";



و این ارور رو دریافت میکنم
Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AND documents.date between '1350/1/1' and '1393/12/29'' at line 1


وقتی این یک تیکه کد زیر رو
where documents.register_id=$_SESSION[id] ANDhttp://joomlaforum.ir/images/smilies/33.gif

به دستور بالا اضافه کردم این ارور گرفتم

-سیّد-
چهارشنبه 26 فروردین 1394, 09:27 صبح
بی‌زحمت دستور زیر رو بلافاصله بعد از دستوری که نوشتید اضافه کنید:

echo $sql;
تا ببینیم دقیقاً چه query ای داره به mysql فرستاده می‌شه.
حدس من اینه که توی session شما متغیر id وجود نداره و در نتیجه مقدارش خالی می‌مونه و query رو خراب می‌کنه.

j_naroogha@yahoo.com
چهارشنبه 26 فروردین 1394, 09:59 صبح
شما echo sql بزن
بعد متن رو داخل phpmyadmin اجرا کن تا بهتر بتونی تشخیص بدی....

vioming
چهارشنبه 26 فروردین 1394, 11:58 صبح
من کاری که شما فرموده بودید رو هم انجام دادم و این تکه کد رو قرار دادم echo $sql; و خروجی چیزی شد که در پایین میبینید


SELECT * FROM `documents` inner join `persons` on documents.person_id = persons.id where documents.register_id= AND documents.date between '1350/1/1' and '1393/12/29';Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AND documents.date between '1350/1/1' and '1393/12/29'' at line 1

این ارور مطمئنن حاصل یک بی دقتی در نحوه ی تایپ کردنه دستوراته چون از ارور معلومه :لبخندساده:

متغیرهای سشن تنظیم شده و زمانی که من در برنامه لاگین میکنم موجوده چون من از فریم ورک کیک پی اچ پی استفاده میکنم و به یک سری از دلایل مجبور شدم در یکی از صفحاتش php فلت بزنم که فعلا مشکل syntaxii دارم
اگر کسی از دوستان تیم ویور داره بگه یوزر و پس بدم یه نگاهی بندازه

-سیّد-
چهارشنبه 26 فروردین 1394, 12:58 عصر
من کاری که شما فرموده بودید رو هم انجام دادم و این تکه کد رو قرار دادم echo$sql; و خروجی چیزی شد که در پایین میبینید


SELECT * FROM `documents` inner join `persons` on documents.person_id = persons.id where documents.register_id= AND documents.date between '1350/1/1' and '1393/12/29';Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AND documents.date between '1350/1/1' and '1393/12/29'' at line 1

این ارور مطمئنن حاصل یک بی دقتی در نحوه ی تایپ کردنه دستوراته چون از ارور معلومه :لبخندساده:

متغیرهای سشن تنظیم شده و زمانی که من در برنامه لاگین میکنم موجوده چون من از فریم ورک کیک پی اچ پی استفاده میکنم و به یک سری از دلایل مجبور شدم در یکی از صفحاتش php فلت بزنم که فعلا مشکل syntaxii دارم
اگر کسی از دوستان تیم ویور داره بگه یوزر و پس بدم یه نگاهی بندازه
نه نیازی به تیم ویور نیست. همونطور که حدس زده بودم، مشکل از اینجاس که مقدار id توی session ذخیره نشده و این مشکل پیش میاد.
ببینید یه کم دقت کنید به پیغام خطایی که بهتون می‌ده:

near 'AND documents.date between '1350/1/1' and '1393/12/29''
وقتی می‌گه اشکال near فلان جا هست، یعنی از اونجا به بعد رو نتونسته بفهمه. خوب اون می‌شه کجا؟
SELECT * FROM `documents` inner join `persons` on documents.person_id = persons.id where documents.register_id= AND documents.date between '1350/1/1' and '1393/12/29';
خوب پس باید یه مقدار قبلش رو نگاه کنید. مشکل رو می‌بینید؟ گفتید
documents.register_id=هیچی
که دلیلش اینه که متغیر $_SESSION[id] که اونجا استفاده کردید، مقدارش «هیچی» بوده.
برای این که این مشکل پیش نیاد، چند تا راه هست. یکیش اینه که قبل از اجرای این دستور، یه if بذارید که چک کنه آیا توی session مقدار id وجود داره یا نه:

if (!isset($_SESSION['id'])) ...
یه راه دیگه اینه که مقدار مورد نظر رو داخل کوتیشن قرار بدید که در این صورت اون query که زدید تبدیل می‌شه به:

SELECT * FROM `documents` inner join `persons` on documents.person_id = persons.id where documents.register_id='' AND documents.date between '1350/1/1' and '1393/12/29
و دیگه مشکل syntax نخواهید داشت. ولی ممکنه کدتون مشکل منطقی پیدا کنه.
و در نهایت راه حل درست و اساسیش اینه که به جای این که مستقیم query رو اینطوری بسازید، از روش‌های بهتر استفاده کنید، مثل PDO (http://php.net/manual/en/book.pdo.php).