PDA

View Full Version : سوال: ذخیره یک رکورد، درصورتی که آن رکورد در جدول وجود نداشته باشد به وسیله php



ms-368
شنبه 09 بهمن 1395, 23:11 عصر
سلام
من چند وقتیه که به php علاقه مند شدم، کار اصلیم طراحی صفحات css,html هست ولی خب در کنارش میخام php هم یاد بگیرم
چند روزیه دارم روی یه کد کوچیک کار میکنم
کار این کد اینه که میره به یه صفحه و اطلاعاتشو دانلود میکنه و از چندتا کلاس های html اون استفاده میکنه و اونارو توی جدول بانک اطلاعاتی ذخیره میکنه
خب من یکم خودم با آموزش های توی نت تونستم ردیفش کنم اما به یه مشکل جدی برخوردم که تمام تلاشمو برد زیر سوال
اونم اینه که هربار صفحه رفرش میشه، دوباره مقادیر همون کلاس های صفحه مورد نظرمو میریز توی دیتابیش، یعنی با هر رفرش یا باز کردن صفحه یک چند رککورد تکراری
اومدم برای اینکه رکورد تکراری نشه اونو تبدیل کردم به رکورد کلیدی یا همون Primary اما اینبار در هر بار رفرش میگه که رکورد کلیدی نمیتونه ۲ مقدار مثه هم بگیره

کد من:


<?php
global $idimdb;
$idimdb = get_field('film_name');
mysql_connect("localhost", "root", "")//اطلاعات اتصال
or die(mysql_error());
mysql_select_db("mostafa")//نام دیتابیس
or die(mysql_error());
$get_query = mysql_query("SELECT * FROM `imdb`");
$fetch_result = mysql_fetch_array($get_query);
$postTitle = $fetch_result['rate'];
if ($posttime == null){
$idimdb = get_field('film_name');
$url = file_get_contents("http://www.imdb.com/title/$idimdb/");
$first_step = explode( '<span itemprop="ratingValue">' , $url );
$second_step = explode("</span>" , $first_step[1] );
$rate = $second_step[0];
mysql_query("INSERT INTO imdb (id_i, rate) VALUES('$idimdb', '$rate')")
or die(mysql_error());
}

while ($fetch_result = mysql_fetch_array($get_query))
{
$postTitle2 = $fetch_result['rate'];
if ($postTitle2 == $rate)
{
echo "$postTitle2";
}
}
mysql_close;

?>

اینم محتویات جدول که هر دفعه اضاف میشه

144338

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

intheway
شنبه 09 بهمن 1395, 23:30 عصر
سلام. از کلمه کلیدی IGNORE بعد از Insert استفاده کنید . با این کار در صورتی که Primary Key بخواد Duplicate بشه بجای Error ، هشدار Warning خواهید داشت که با توجه با تنظمات میتونه بجای نمایش در فایلی مث error_log ذخیره بشه...
روش دیگر مدیریت دستی خطایی هست که میگیرید . در این مورد من پیشنهاد میکنم بجای استفاده مستقیم از اکستنشن mysqli از PDO برای ارتباطات دیتابیس استفاده کنید تا بتونید به راحتی هر خطا در هر سطحی رو با بلاک های Try Catch به چنگ بیارید و از برنامه نویسی بیش تر لذت ببرید! موفق باشید

ms-368
شنبه 09 بهمن 1395, 23:57 عصر
سلام. از کلمه کلیدی IGNORE بعد از Insert استفاده کنید . با این کار در صورتی که Primary Key بخواد Duplicate بشه بجای Error ، هشدار Warning خواهید داشت که با توجه با تنظمات میتونه بجای نمایش در فایلی مث error_log ذخیره بشه...
روش دیگر مدیریت دستی خطایی هست که میگیرید . در این مورد من پیشنهاد میکنم بجای استفاده مستقیم از اکستنشن mysqli از PDO برای ارتباطات دیتابیس استفاده کنید تا بتونید به راحتی هر خطا در هر سطحی رو با بلاک های Try Catch به چنگ بیارید و از برنامه نویسی بیش تر لذت ببرید! موفق باشید
ممنون
ولی به کارم نمیاد
چون ممکنه صفحه روزانه بالای ۱۰۰۰ بار توسط بازدیکننده ها بخاد باز شه و اینجور یعنی ۱۰۰۰ بار وارنینگ
در کل به نظر خودم بهتره از یه جلقه استفاده کنم و بهش بگم جستجو کنه که فلان رکورد وجود داره یا خیر و اگه وجود نداشت اونو اضاف کنه ولی اگه وجود داشت دیگه کار نکنه و فقط رکورد رو نشون بده

ممنون میشم کد بهم بدید چون با توضیح به هیچوجه متوجه نمیشم

ممنون

intheway
یک شنبه 10 بهمن 1395, 09:54 صبح
ممنون
ولی به کارم نمیاد
چون ممکنه صفحه روزانه بالای ۱۰۰۰ بار توسط بازدیکننده ها بخاد باز شه و اینجور یعنی ۱۰۰۰ بار وارنینگ
در کل به نظر خودم بهتره از یه جلقه استفاده کنم و بهش بگم جستجو کنه که فلان رکورد وجود داره یا خیر و اگه وجود نداشت اونو اضاف کنه ولی اگه وجود داشت دیگه کار نکنه و فقط رکورد رو نشون بده

ممنون میشم کد بهم بدید چون با توضیح به هیچوجه متوجه نمیشم

ممنون

بنده و دوستان دیگه اینجا نیومدیم که به هم کد بدیم / بگیریم . اینجا هستیم تا در جهت صحیحی گام برداریم و تبادل ایده و تجربه کنیم.به فرض من بخوام کد به شما بدم باز مشکل شما برطرف نمیشه مشکل اصلی اینجاست که شما میخواید به ازای هر درخواست/بازدید یک یا چندین درخواست به سایت IMDB بفرستید. باید بدونید که این کار نه تنها از دید برنامه نویسی اصولی نیست و لود صفحات شما رو وابسته به لود صفحاتی دیگر میکنه بلکه سایت IMDB هم بعد از درخواست های مکرری که شما به این طریق ایجاد میکنید IP شمارو بلاک خواهد کرد.. اگر تصمیم دارید یک Crawler بنویسید باید از چیزی مشابه CronJobs در لینوکس یا Task Schedule در سرور ویندوز استفاده کنید. موفق باشید

ms-368
یک شنبه 10 بهمن 1395, 10:19 صبح
بنده و دوستان دیگه اینجا نیومدیم که به هم کد بدیم / بگیریم . اینجا هستیم تا در جهت صحیحی گام برداریم و تبادل ایده و تجربه کنیم.به فرض من بخوام کد به شما بدم باز مشکل شما برطرف نمیشه مشکل اصلی اینجاست که شما میخواید به ازای هر درخواست/بازدید یک یا چندین درخواست به سایت IMDB بفرستید. باید بدونید که این کار نه تنها از دید برنامه نویسی اصولی نیست و لود صفحات شما رو وابسته به لود صفحاتی دیگر میکنه بلکه سایت IMDB هم بعد از درخواست های مکرری که شما به این طریق ایجاد میکنید IP شمارو بلاک خواهد کرد.. اگر تصمیم دارید یک Crawler بنویسید باید از چیزی مشابه CronJobs در لینوکس یا Task Schedule در سرور ویندوز استفاده کنید. موفق باشید

ممنون
ولی من از شما لقمه آماده نخواستم دوست عزیز ، من کد رو نوشتم و نیاز به یه جلقه دارم که جلوی ایجاد رکورد تکراری رو بگیره
با جستجوهایی هم که انجام دادم نتونستم این مشکل رو حل کنم چون همونطور که در پست اول توضیح دادم تازه به سمت php رفتم و شما باید بدونید با یه کاربر مبتدی طرف هستید
پس دخواست کردن یک کد برای تصحیح کد دیگه به نظرم اشتباه نمیاد، و همونطور که در جریانید این تاپیک برچسب"سوال" خورده و باید انتظار چنین درخواست هایی رو داشته باشید
در مورد IMDB هم بنده نمیخام که هر بار صفحه رو به وسیله file_get_contents لود کنم، خودمم میدونم اشتباهه عزیز
اما برای گرفتن اطلاعات فقط برای بار اول و اضاف کردن در بانک اطلاعاتی بهش نیاز دارم
و البته من نمیخام از imdb سواستفاده کنم و روزانه هزارن درخواست بفرستم، نه
من شاید جمعا در طول یکسال ۲۰۰ درخواست هم ندارم چون که من برای یک وبلاگ سینمایی (نقد و بررسی سریال های روز به زبان انگلیسی) دارم این کد رو آماده میکنم و فقط هم به اطلاعاتی نظیر کارگردان،بازیگران،سال تولید و ... نیاز دارم که فقط یکبار ذخیره میشن و دیگه نیاز به لود صفحه imdb ندارم چون دفعات بعد مستقیما از بانک اطلاعاتی فراخانی میشن.
در هر صورت بازم ممنون بابت راهنمایی.

intheway
یک شنبه 10 بهمن 1395, 11:37 صبح
ممنون
ولی من از شما لقمه آماده نخواستم دوست عزیز ، من کد رو نوشتم و نیاز به یه جلقه دارم که جلوی ایجاد رکورد تکراری رو بگیره
با جستجوهایی هم که انجام دادم نتونستم این مشکل رو حل کنم چون همونطور که در پست اول توضیح دادم تازه به سمت php رفتم و شما باید بدونید با یه کاربر مبتدی طرف هستید
پس دخواست کردن یک کد برای تصحیح کد دیگه به نظرم اشتباه نمیاد، و همونطور که در جریانید این تاپیک برچسب"سوال" خورده و باید انتظار چنین درخواست هایی رو داشته باشید
در مورد IMDB هم بنده نمیخام که هر بار صفحه رو به وسیله file_get_contents لود کنم، خودمم میدونم اشتباهه عزیز
اما برای گرفتن اطلاعات فقط برای بار اول و اضاف کردن در بانک اطلاعاتی بهش نیاز دارم
و البته من نمیخام از imdb سواستفاده کنم و روزانه هزارن درخواست بفرستم، نه
من شاید جمعا در طول یکسال ۲۰۰ درخواست هم ندارم چون که من برای یک وبلاگ سینمایی (نقد و بررسی سریال های روز به زبان انگلیسی) دارم این کد رو آماده میکنم و فقط هم به اطلاعاتی نظیر کارگردان،بازیگران،سال تولید و ... نیاز دارم که فقط یکبار ذخیره میشن و دیگه نیاز به لود صفحه imdb ندارم چون دفعات بعد مستقیما از بانک اطلاعاتی فراخانی میشن.
در هر صورت بازم ممنون بابت راهنمایی.


بجای حلقه و اینها..اینو امتحان کنید . ضرر نمی کنید.
فقط id_i رو در حالت مشاهده structure جدول در phpMyAdmin تیکش رو بزنید
و روی Uniqe کلیک بکنید.بعد از INSERT IGNORE INTO بجای INSERT INTO استفاده کنید.
من دسترسی به ایزار برنامه نویسی ندارم و دلیلی هم نمی بینم دستام رو به ده اخط کد آغشته کنم..

ms-368
یک شنبه 10 بهمن 1395, 12:25 عصر
بجای حلقه و اینها..اینو امتحان کنید . ضرر نمی کنید.
فقط id_i رو در حالت مشاهده structure جدول در phpMyAdmin تیکش رو بزنید
و روی Uniqe کلیک بکنید.بعد از INSERT IGNORE INTO بجای INSERT INTO استفاده کنید.
من دسترسی به ایزار برنامه نویسی ندارم و دلیلی هم نمی بینم دستام رو به ده اخط کد آغشته کنم..

دوست عزیز مثل اینکه جواب داد
خیلی خیلی ممنون بابت راهنمایی
در مورد چک کردن اینکه آیا رکورد در جدول وجود داره باید چیکار انجام بدم؟
اگه کد رو یکبار دیگه نگاه کنید متوجه میشیدی که با هر بار اجرای کد، file_get_contents اجرا میشه و دلیلی هم نداره هر دفعه بخاد این صفحه اجرا بشه چون فقط بار اول که اطلاعات در دیتابیس وجود نداره باید اجرا بشه و دفعات بعدی سرعت میاد پایین
من از if استفاده کردم ولی مثه اینکه باید تک تک رکورد های مربوط به id_i چک بشن تا اگه رکورد مورد نظر وجود داشت دیگه file_get_contents اجرا نشه
ممنون میشم راهنمایی کنید.