توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : چک کردن وجود یک رکور با wpdb
mehran-b
August 5th, 2017, 23:35
سلام بر دوستان و اساتید
برای اینکه چک کنم توی ذیتابیس یک رکورد وجود داره یا خیر باید چه کدی از wpdb رو استفاده کنم؟
تشکر
mehran-b
August 6th, 2017, 13:40
سلام بر دوستان و اساتید
برای اینکه چک کنم توی ذیتابیس یک رکورد وجود داره یا خیر باید چه کدی از wpdb رو استفاده کنم؟
تشکر
دوستان خواهشا یه کمکی بدید چند روزه گیر کردم روی این مورد.
سپاس :63:
sazsaz
August 6th, 2017, 13:42
با تلگرام بنده تماس بگیر
T.Toosi
August 6th, 2017, 13:45
$chk = $wpdb->get_var( "SELECT id FROM users WHERE id=1" );
if($chk !== null) echo 'exist';
mehran-b
August 6th, 2017, 16:48
$chk = $wpdb->get_var( "SELECT id FROM users WHERE id=1" );
if($chk !== null) echo 'exist';
این کد توی foreach در کمال ناباوری درست کار نمیکنه.
تابعی که باهاش توی دیتابیس میخوام رکورد هامو ست کنم الان این شکلیه:
<?function nap_add_post_to_db($post_links = array(), $source_name) { if(!empty($post_links)) :
global $wpdb; $table_name = NAPTABLE; foreach($post_links as $link) : if(is_null($wpdb->get_var("SELECT id FROM $table_name WHERE link='$link'"))) $wpdb->query($wpdb->prepare("INSERT INTO $table_name (link, source_name) VALUES (%s, %s)", $link, $source_name)); endforeach; endif; }?>
کد خوب همون طور که مشخصه باید درست عمل کنه ولی درست عمل نمیکنه.
AtrafNet
August 6th, 2017, 18:03
کدتون رو دیدم ظاهراً می خواید کوئری INSERT رو اگر ردیف مورد نظر وجود نداشت اجرا کنید درسته؟
اگه اینطوره به جای بررسی وجود ردیف مورد نظر در جدول می تونید از $wpdb->replace استفاده کنید که توضیحی که خود وردپرس در بخش CODEX دربارش نوشته اینه:
Replace a row in a table if it exists or insert a new row in a table if the row did not already exist.
یعنی اگر ردیف مورد نظر وجود داشته باشه با ویرایش جدید جایگزین میشه اگرم نباشه خودکار خودش INSERT انجام میده.
تو این لینک اسمشو سرچ کنید هست: https://codex.wordpress.org/Class_Reference/wpdb
mehran-b
August 6th, 2017, 18:28
کدتون رو دیدم ظاهراً می خواید کوئری INSERT رو اگر ردیف مورد نظر وجود نداشت اجرا کنید درسته؟
اگه اینطوره به جای بررسی وجود ردیف مورد نظر در جدول می تونید از $wpdb->replace استفاده کنید که توضیحی که خود وردپرس در بخش CODEX دربارش نوشته اینه:
Replace a row in a table if it exists or insert a new row in a table if the row did not already exist.
یعنی اگر ردیف مورد نظر وجود داشته باشه با ویرایش جدید جایگزین میشه اگرم نباشه خودکار خودش INSERT انجام میده.
تو این لینک اسمشو سرچ کنید هست: https://codex.wordpress.org/Class_Reference/wpdb
به مورد خوبی اشاره کردید. الان تابع من به این شکل (https://pastebin.com/rvi6Rh9n) شده.
حالا مشکل اینه که مثلا یه آرایه 20 تایی بدی به تابع 7 تاش یا 8 تاش ثبت میشه توی دیتابیس.
والا موندم مشکل از کجاست.
AtrafNet
August 6th, 2017, 18:47
به مورد خوبی اشاره کردید. الان تابع من به این شکل (https://pastebin.com/rvi6Rh9n) شده.
حالا مشکل اینه که مثلا یه آرایه 20 تایی بدی به تابع 7 تاش یا 8 تاش ثبت میشه توی دیتابیس.
والا موندم مشکل از کجاست.
مطمئنید آرایه 20 تا آیتم داره؟ با print_r تست کردید؟
قبلاً چنین اتفاقی برای وجود یه سری کاراکتر های خاص تو بعضی آیتم ها برام پیش میامد تو آیتم ها کاراکتر های خاصی هم وجود نداره؟
می خواید یه بار با حلقه for به صورت همون 20 تایی که گفتید اجرا کنید اصولاً اگه ID وجود نداشته باشه باید اخطار بده.
خروجی $wpdb->replace هم بررسی کنید که false نباشه چون اگر درست انجام بشه عدد تعداد ردیف هایی که تغییر کردن رو پس میده ولی اگه خروجی اش false باشه یعنی مشکلی هست.
فکر کنم با تابع $wpdb->print_error() میشه ارور آخرین کوئری اجرا شده رو نمایش داد.
mehran-b
August 6th, 2017, 19:33
مطمئنید آرایه 20 تا آیتم داره؟ با print_r تست کردید؟
قبلاً چنین اتفاقی برای وجود یه سری کاراکتر های خاص تو بعضی آیتم ها برام پیش میامد تو آیتم ها کاراکتر های خاصی هم وجود نداره؟
می خواید یه بار با حلقه for به صورت همون 20 تایی که گفتید اجرا کنید اصولاً اگه ID وجود نداشته باشه باید اخطار بده.
خروجی $wpdb->replace هم بررسی کنید که false نباشه چون اگر درست انجام بشه عدد تعداد ردیف هایی که تغییر کردن رو پس میده ولی اگه خروجی اش false باشه یعنی مشکلی هست.
فکر کنم با تابع $wpdb->print_error() میشه ارور آخرین کوئری اجرا شده رو نمایش داد.
خروجی $wpdb->replace همش یک هست یعنی 20 تا 1 خروجیش میشه.
اون مورد ثبت نشدن 20 رکورد مربوط به استرکچر دیتابیسم بود که روی VARCHAR گذاشته بودم که خوب از 255 کاراکتر بالا زده بود بعضی لینک ها ثبت نمیشد که کردمش TEXT حل شد.
در کل اروری در کار نیست ولی بازم مشکل داره و رکورد های تکراری ست میکنه.
لینک ها چون فارسی ان به شکل rawurlencode هستند مشکلی داره؟
AtrafNet
August 6th, 2017, 19:52
خروجی $wpdb->replace همش یک هست یعنی 20 تا 1 خروجیش میشه.
اون مورد ثبت نشدن 20 رکورد مربوط به استرکچر دیتابیسم بود که روی VARCHAR گذاشته بودم که خوب از 255 کاراکتر بالا زده بود بعضی لینک ها ثبت نمیشد که کردمش TEXT حل شد.
در کل اروری در کار نیست ولی بازم مشکل داره و رکورد های تکراری ست میکنه.
لینک ها چون فارسی ان به شکل rawurlencode هستند مشکلی داره؟
شاید به خاطر همین فارسی و rawurlencode بودن لینک ها نتونستید از روشی که جناب طوسی دادن استفاده کنید چون طوری که من در کد اول شما دیدم شما برای پیدا کردن row مورد نظر در کوئری جلوی WHERE از شرط یکسان بودن محتوای لینک ها استفاده کردید میگم شاید چون لینک ها طولانیه و فارسی انکد شده هستن نمی تونه مقایسه درستی انجام بده و یکسان پیدا نمیکنه.
چون معمولاً تو این شرایط از ID برای پیدا کردن row های موجود استفاده میکنن اما اگه شما به ID دسترسی ندارید به نظرم اگه یه مقدار منحصر به فرد بهتری نسبت به لینک که انگلیسی باشه و کوتاه بهتر عمل کنه.
درباره wpdb->replace هم به نظرم ممکنه یه تغییر کوچکی در محتوای لینک های جدید احساس کرده که یکسان اضافه کرده مثلاً فکر کنید یه فاصله اضافی تو لینک ها هم می تونه ردیف جدید حساب بشه البته مسلماً فاصله های قبل و بعد و سایر عمل های بررسی ورودی رو انجام دادید ولی پیشنهاد میکنم یه بار محتویات row های یکسان اضافه شده رو با هم مقایسه کنید ببینید واقعاً یکسان هستن یا نه.
mehran-b
August 7th, 2017, 01:07
شاید به خاطر همین فارسی و rawurlencode بودن لینک ها نتونستید از روشی که جناب طوسی دادن استفاده کنید چون طوری که من در کد اول شما دیدم شما برای پیدا کردن row مورد نظر در کوئری جلوی WHERE از شرط یکسان بودن محتوای لینک ها استفاده کردید میگم شاید چون لینک ها طولانیه و فارسی انکد شده هستن نمی تونه مقایسه درستی انجام بده و یکسان پیدا نمیکنه.
چون معمولاً تو این شرایط از ID برای پیدا کردن row های موجود استفاده میکنن اما اگه شما به ID دسترسی ندارید به نظرم اگه یه مقدار منحصر به فرد بهتری نسبت به لینک که انگلیسی باشه و کوتاه بهتر عمل کنه.
درباره wpdb->replace هم به نظرم ممکنه یه تغییر کوچکی در محتوای لینک های جدید احساس کرده که یکسان اضافه کرده مثلاً فکر کنید یه فاصله اضافی تو لینک ها هم می تونه ردیف جدید حساب بشه البته مسلماً فاصله های قبل و بعد و سایر عمل های بررسی ورودی رو انجام دادید ولی پیشنهاد میکنم یه بار محتویات row های یکسان اضافه شده رو با هم مقایسه کنید ببینید واقعاً یکسان هستن یا نه.
با تشکر از همه اساتید به خاطر وقتی که گذاشتند.
در نهایت تکنیکی که زدم این بود که SHA256 هر لینک رو ساختم بعد توی یه ستون به شکل primary ذخیره کردم حالا دیگه اصلا احتیاج به چک کردن موجود بودن رکورد نیست چون رکورد primary که همان رشته انکود شده است برای هر لینک یکتاست.