PDA

View Full Version : سوال: شماره موبايل اشتباهي



numberone1
دوشنبه 02 اسفند 1389, 17:45 عصر
سلام
توي فرم سايتم يه فيلد هست براي موبايل وقتي كاربر پرش ميكنه درست به ديتابيس ارسال ميشه ولي توي همه موارد اين شماره ثبت ميشه
2147483647
خيلي عجيبه!!! هيچ عملياتي خاصي روش انجام نميدم فقط چك ميكنم كه خالي نباشه اگه خالي بود مساوي نال ميذارم اگر نال بشه درست مقدار نال ارسال ميشه به ديتابيس ولي اگر كاربر شماره موبايلشو بده همين شماره كه نوشتم بالا تو ديتابيس ثبت ميشه!!:متعجب:


if (!empty($_GET['mobile'])) {
$mobile = sanitizeString($_GET['mobile']);
} else {
$mobile = NULL;
}

mohsen24000
دوشنبه 02 اسفند 1389, 19:03 عصر
شما باید مشکلتون رو در تابع sanitizeString که بکاربردید پیدا کنید

Dead Space
دوشنبه 02 اسفند 1389, 19:47 عصر
احتمال داره شما در بانک مثلا طول فیلد شماره موبایل رو ۱۰ داده باشی ولی در برنامه طرف ۱۱ رقم وارد می کنه در نتیجه زمانی که وارد رکورد میشه به اون صورت در میاد

numberone1
دوشنبه 02 اسفند 1389, 20:46 عصر
شما باید مشکلتون رو در تابع sanitizeString که بکاربردید پیدا کنید

اين تابع شامل اينهاست

$var = strip_tags($var);
$var = htmlentities($var);
$var = stripslashes($var);
return mysql_real_escape_string($var);
فكر نميكنم اينها روي اعداد تاثير خاصي بذاره
من خودم هم تست كردم مثلا شماره موبايل خودم و وارد كردم ولي بازم همين شماره عينا چاپ شد

numberone1
دوشنبه 02 اسفند 1389, 20:49 عصر
احتمال داره شما در بانک مثلا طول فیلد شماره موبایل رو ۱۰ داده باشی ولی در برنامه طرف ۱۱ رقم وارد می کنه در نتیجه زمانی که وارد رکورد میشه به اون صورت در میاد
نه طولش 20 كاراكتره و ماكس فرم هم 20 هست
ضمن اينكه مشكل اينه كه من هر شماره اي ميزنم هيچ فرقي نميكنه فقط همين شماره تو ديتابيس ثبت ميشه من اگر 10 تا 1 هم بزنم باز همين شماره ثبت ميشه انگار يه جائي تو كش ذخيره شده

mtchabok
دوشنبه 02 اسفند 1389, 21:35 عصر
مطمئن باش که یه جایی از کدتت ایرادی داره چونکه این ثابت بودن عدد و ثبت شدن در جدول فقط یه معنی میده و اونم اشتباه در وارد کردن اطلاعات در فیلد مورد نظر و یا اشتباه تایپی در نام متغیرها که خیلی هم اتفاق می افته .

numberone1
دوشنبه 02 اسفند 1389, 21:38 عصر
مطمئن باش که یه جایی از کدتت ایرادی داره چونکه این ثابت بودن عدد و ثبت شدن در جدول فقط یه معنی میده و اونم اشتباه در وارد کردن اطلاعات در فیلد مورد نظر و یا اشتباه تایپی در نام متغیرها که خیلی هم اتفاق می افته .
آخه جائي ديگه نيست كه
يه بار بعد زدن submit با گت ارسال ميشه مقدار موبايل بعد از sanitizestring هم با كوئري به ديتابيس وارد ميشه
هيچ پردازشي به جز اينا روش انجام ندادم
بعد آخه مشكل اينه كه هر كاربري با هر يوزري وقتي موبايل وارد ميكنه در هر صورت اين شماره وارد ديتابيس ميشه :متعجب:

numberone1
دوشنبه 02 اسفند 1389, 21:52 عصر
مشكل بين الملليه اين عدد و توي گوگل سرچ كردم ديدم بقيه هم با همين مشكل مواجه شدن


I had someone ask me the other day why they were getting 2147483647 as the value for some operation. Any time you see this number, it should be a red flag that you are hitting the ceiling of the values that can be the 4 byte integer.
So here in this classic newbie mistake, grooming a phone number by casting it to an integer.
$phone = '6195551234'; echo (http://www.bradino.com/php-functions/echo/) (int) $phone;



Will result in 2147483647.
You also see 2147483647 sometimes in database records where the field type is INT and the value you are inserting is greater than 2147483647. Hope this helps!

mtchabok
دوشنبه 02 اسفند 1389, 21:53 عصر
از قابلیت trace استفاده کن ... یعنی اینکه فاصله از زمان گرفتن شماره موبایل تا ثبت در جدول رو کمتر کن یعنی به صورت مستقیم شماره موبایل رو در جدول ذخیره کن و اگه درست ثبت نشد پس مشکل از جدولت هس و در غیر اینصورت همینطور این روش رو ادامه بده تا مشکلساز رو پیدا کنی .
چونکه این کدهایی که گذاشتی بدون مشکل هستن و حتی روی سرور خودم امتحانشون کردم ولی درست کار میکنن ...
sql جدولت رو واسمون بزار شاید ایراد از جدولت باشه ؟

eshpilen
دوشنبه 02 اسفند 1389, 21:57 عصر
یه نکتهء جالب! عددی که گذاشتی همونطور که حدس زدم یکی از توانهای 2 هست (البته یکی کمتر). 2 به توان 31 میشه 2147483648.
این نشون میده که موقعی که عدد رو به فیلد جدول وارد میکنی یه بلایی سرش میاد! فکر میکنم فیلدی که شما برای ذخیرهء شمارهء موبایل درنظر گرفتی بیش از حد کوچیک هست و شمارهء موبایل توش جا نمیشه؛ بنابراین MySQL بجاش بزرگترین عددی رو که در اون فیلد جا میشه درج میکنه که برابر همون عدد کذایی هست.
راه حل اینه که از یک ستون رشته ای یا یک فیلد عددی که جای اعداد بزرگ تاحد شمارهء موبایل رو داشته باشه بجاش استفاده کنی.

numberone1
دوشنبه 02 اسفند 1389, 21:59 عصر
از قابلیت trace استفاده کن ... یعنی اینکه فاصله از زمان گرفتن شماره موبایل تا ثبت در جدول رو کمتر کن یعنی به صورت مستقیم شماره موبایل رو در جدول ذخیره کن و اگه درست ثبت نشد پس مشکل از جدولت هس و در غیر اینصورت همینطور این روش رو ادامه بده تا مشکلساز رو پیدا کنی .
چونکه این کدهایی که گذاشتی بدون مشکل هستن و حتی روی سرور خودم امتحانشون کردم ولی درست کار میکنن ...
sql جدولت رو واسمون بزار شاید ایراد از جدولت باشه ؟
مستقيم كه وارد كردم به تيبل مشكلي نداره
نوع فيلد و از int به varchar تغيير دادم ولي باز هم همين عدد و رو چاپ ميكنه
من توي گوگل سرچ كردم . اين عدد مثل اينكه يه عدد خاصيه . يك معني خاص ميده
ببين اينجا رو http://en.wikipedia.org/wiki/2147483647
trace رو هم الان امتحان ميكنم

numberone1
دوشنبه 02 اسفند 1389, 22:06 عصر
مقدار فيلد و توي ديتابيس به varchar 200 تغيير دادم و شماره موبايل درست چاپ شد
مرسي از راهنمائي هاتون

amir001
دوشنبه 02 اسفند 1389, 23:32 عصر
نوع فیلد را همون vchar با طول مثلا 20 بذار اما در کوئری چک کن که حتما عدد را بین ' ' کوتیشن قرار داده باشی. باید عدد را حتما جوری در کوئری قرار بدی که رشته در نظر گرفته بشه.

اگر خواستی طول فیلدت کم باشه و بتونی عدد را ذخیره کنی میتونی عدد را رمز نگاری کنی و توی دیتابیس ذخیره کنی. مثلا اگر به base64 تبدیل کنی به حروف انگلیسی تبدیل میشه.

eshpilen
سه شنبه 03 اسفند 1389, 01:14 صبح
base64 بطور دقیق رمزنگاری نیست، بلکه یک نوع انکدینگ هست. البته برای مخدوش/ناخوانا کردن ظاهری هم بعضی جاها کاربرد داره.
ضمنا طول رو کم نمیکنه بلکه زیاد میکنه.

eshpilen
سه شنبه 03 اسفند 1389, 01:19 صبح
اين عدد مثل اينكه يه عدد خاصيه . يك معني خاص ميده
ببين اينجا رو http://en.wikipedia.org/wiki/2147483647


The number 2,147,483,647 is also the maximum value for a 32-bit (http://en.wikipedia.org/wiki/32-bit) signed integer (http://en.wikipedia.org/wiki/Integer_%28computer_science%29) in computing (http://en.wikipedia.org/wiki/Computing). It is therefore the maximum value for variables declared as int in many programming languages running on popular CPUs (http://en.wikipedia.org/wiki/Central_processing_unit), and the maximum possible score (or amount of money) for many video games (http://en.wikipedia.org/wiki/History_of_video_game_consoles_%28fifth_generation %29). The appearance of the number often reflects an error, overflow (http://en.wikipedia.org/wiki/Arithmetic_overflow) condition, or missing value.

UnnamE
سه شنبه 03 اسفند 1389, 02:50 صبح
http://www.webmaster-forums.net/serverside-scripting/2147483648-phpmysql-problem

sattaryekta
سه شنبه 03 اسفند 1389, 12:04 عصر
احتمالا از یک فیلد یا متغیر عددی با طول کم داری استفاده میکنی!