سلام بر دوستان و اساتید
برای اینکه چک کنم توی ذیتابیس یک رکورد وجود داره یا خیر باید چه کدی از wpdb رو استفاده کنم؟
تشکر
سلام بر دوستان و اساتید
برای اینکه چک کنم توی ذیتابیس یک رکورد وجود داره یا خیر باید چه کدی از wpdb رو استفاده کنم؟
تشکر
ویرایش توسط mehran-b : August 6th, 2017 در ساعت 13:39
با تلگرام بنده تماس بگیر
کد PHP:
$chk = $wpdb->get_var( "SELECT id FROM users WHERE id=1" );
if($chk !== null) echo 'exist';
این کد توی foreach در کمال ناباوری درست کار نمیکنه.
تابعی که باهاش توی دیتابیس میخوام رکورد هامو ست کنم الان این شکلیه:
کد خوب همون طور که مشخصه باید درست عمل کنه ولی درست عمل نمیکنه.کد PHP:
<?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; }?>
کدتون رو دیدم ظاهراً می خواید کوئری INSERT رو اگر ردیف مورد نظر وجود نداشت اجرا کنید درسته؟
اگه اینطوره به جای بررسی وجود ردیف مورد نظر در جدول می تونید از $wpdb->replace استفاده کنید که توضیحی که خود وردپرس در بخش CODEX دربارش نوشته اینه:
یعنی اگر ردیف مورد نظر وجود داشته باشه با ویرایش جدید جایگزین میشه اگرم نباشه خودکار خودش INSERT انجام میده.کد:Replace a row in a table if it exists or insert a new row in a table if the row did not already exist.
تو این لینک اسمشو سرچ کنید هست: https://codex.wordpress.org/Class_Reference/wpdb
به مورد خوبی اشاره کردید. الان تابع من به این شکل شده.
حالا مشکل اینه که مثلا یه آرایه 20 تایی بدی به تابع 7 تاش یا 8 تاش ثبت میشه توی دیتابیس.
والا موندم مشکل از کجاست.
مطمئنید آرایه 20 تا آیتم داره؟ با print_r تست کردید؟
قبلاً چنین اتفاقی برای وجود یه سری کاراکتر های خاص تو بعضی آیتم ها برام پیش میامد تو آیتم ها کاراکتر های خاصی هم وجود نداره؟
می خواید یه بار با حلقه for به صورت همون 20 تایی که گفتید اجرا کنید اصولاً اگه ID وجود نداشته باشه باید اخطار بده.
خروجی $wpdb->replace هم بررسی کنید که false نباشه چون اگر درست انجام بشه عدد تعداد ردیف هایی که تغییر کردن رو پس میده ولی اگه خروجی اش false باشه یعنی مشکلی هست.
فکر کنم با تابع $wpdb->print_error() میشه ارور آخرین کوئری اجرا شده رو نمایش داد.
خروجی $wpdb->replace همش یک هست یعنی 20 تا 1 خروجیش میشه.
اون مورد ثبت نشدن 20 رکورد مربوط به استرکچر دیتابیسم بود که روی VARCHAR گذاشته بودم که خوب از 255 کاراکتر بالا زده بود بعضی لینک ها ثبت نمیشد که کردمش TEXT حل شد.
در کل اروری در کار نیست ولی بازم مشکل داره و رکورد های تکراری ست میکنه.
لینک ها چون فارسی ان به شکل rawurlencode هستند مشکلی داره؟
شاید به خاطر همین فارسی و rawurlencode بودن لینک ها نتونستید از روشی که جناب طوسی دادن استفاده کنید چون طوری که من در کد اول شما دیدم شما برای پیدا کردن row مورد نظر در کوئری جلوی WHERE از شرط یکسان بودن محتوای لینک ها استفاده کردید میگم شاید چون لینک ها طولانیه و فارسی انکد شده هستن نمی تونه مقایسه درستی انجام بده و یکسان پیدا نمیکنه.
چون معمولاً تو این شرایط از ID برای پیدا کردن row های موجود استفاده میکنن اما اگه شما به ID دسترسی ندارید به نظرم اگه یه مقدار منحصر به فرد بهتری نسبت به لینک که انگلیسی باشه و کوتاه بهتر عمل کنه.
درباره wpdb->replace هم به نظرم ممکنه یه تغییر کوچکی در محتوای لینک های جدید احساس کرده که یکسان اضافه کرده مثلاً فکر کنید یه فاصله اضافی تو لینک ها هم می تونه ردیف جدید حساب بشه البته مسلماً فاصله های قبل و بعد و سایر عمل های بررسی ورودی رو انجام دادید ولی پیشنهاد میکنم یه بار محتویات row های یکسان اضافه شده رو با هم مقایسه کنید ببینید واقعاً یکسان هستن یا نه.
در حال حاضر 1 کاربر در حال مشاهده این موضوع است. (0 کاربران و 1 مهمان ها)