ডাব্লুপিডিবি সন্নিবেশ করুন বা উপস্থিত থাকলে আপডেট


21

আমি সাধারণত ডাব্লুপিডিবি বা এসকিউএল এর সাথে পরিচিত পাগল নই তবে আমার প্রকল্পের জন্য আমার একটি কাস্টম টেবিল রয়েছে এবং আমি এটিতে কিছু মেটাডেটা নির্ধারণের চেষ্টা করছি। আমি যদি "পছন্দ" করতে চাই তা হ'ল যদি একটি সারি বিদ্যমান থাকে তবে এটি আপডেট করুন এবং যদি এটি sertোকানো না হয়। আমি ডাব্লুপিডিবি কোডেক্সে সন্নিবেশ এবং আপডেট উভয়ই পড়েছি তবে সত্যই "উভয়ই" বা "পরিস্থিতি" হিসাবে যায় নি। আমি ভেবেছিলাম যে আমি আপডেটের সাথে কাজ করতে পারি, তাই আমার কোডটি এখন পর্যন্ত এইরকম দেখাচ্ছে:

$wpdb->update(
    $wpdb->prepare(
        $wpdb->prefix.'item_info',
        array(
            'post_id'       => $post_id,
            'item_stock'    => $item_stock
        ),
        array('post_id' => $post_id)
    )
);

ওয়ার্ডপ্রেসের কোনও "আইএফ উপস্থিত থাকলে আপডেট, ইএলএসই সন্নিবেশ" এর মতো কিছু আছে বা এটি অর্জনের জন্য আমার কি কাস্টম এসকিউএল চালানো দরকার, বা আমার টেবিলে কোনও আইডি উপস্থিত রয়েছে কিনা তা দেখার জন্য আমাকে প্রথমে ডাটাবেসটি জিজ্ঞাসা করতে হবে তখনই সিদ্ধান্ত নেওয়ার সিদ্ধান্ত নিয়েছে এটা না sertোকানো?

উত্তর:


23

প্রথমত, আপনি prepareভুলভাবে ব্যবহার করছেন । আপনার মনে হয় $wpdb->updateএর মতো যুক্তিগুলি মোড়ানো রয়েছে $wpdb->prepare। যে কাজ করবে না। বাস্তবে, আপনি updateএকটি একক যুক্তি - আউটপুট কেটে যাচ্ছেন prepare। নিম্নলিখিতগুলির মতো সাধারণ কিছু চেষ্টা করে দেখুন এবং এটি কেন কাজ করবে না তা আপনি দেখতে পাবেন:

$post_id = 123;
$item_stock = 567;
var_dump(
  $wpdb->prepare(
    $wpdb->prefix.'item_info',
    array(
        'post_id'       => $post_id,
        'item_stock'    => $item_stock
    ),
    array('post_id' => $post_id)
  )
);

এবং আপনার জন্য $wpdb->update()দৌড়েprepare

দ্বিতীয়ত, এটি যদি আমি থাকতাম তবে আমি সহায়তাকারী ফাংশনটি ছেড়ে দিয়ে একটি সঠিক ON DUPLICATE KEY UPDATEকোয়েরি লিখি :

$sql = "INSERT INTO {$wpdb->prefix}item_info (post_id,item_stock) VALUES (%d,%s) ON DUPLICATE KEY UPDATE item_stock = %s";
// var_dump($sql); // debug
$sql = $wpdb->prepare($sql,$post_id,$item_stock,$item_stock);
// var_dump($sql); // debug
$wpdb->query($sql);

এটি ধরে নেওয়া হয় যে post_idএকটি UNIQUEসূচক বাPRIMARY KEY । যদি আপনার টেবিলের কাঠামোটি আমি যা মনে করি তা হয় তবে এটি ডাটাবেসটিকে পরিচালনা করতে দিন।


এটি অত্যন্ত উন্মুক্তভাবে কার্যকর ছিল ... আপনার সময়ের জন্য s_ha_dum ধন্যবাদ!
জ্যাক

আমার জন্য মিথ্যা রিটার্ন প্রস্তুত করুন - অন্য কোনও ডিবি ত্রুটি নেই। যদি পিএইচপিএমইডমিনে ম্যানুয়ালি ক্যোয়ারী চালিত হয় তবে এটি প্রত্যাশার মতো কাজ করে। ভেরিয়েবলগুলি কী হওয়া উচিত তাও যাচাই করা হয়েছে .. কোনও ধারণা?
ট্রেইনোসিস

1
পোস্ট_আইডি যদি মূল কী না হয় তবে কী হবে?
মাইক Kormendy

18

আপনি চেষ্টা করেছেন $wpdb->replace? ডব্লিউপি কোডেক্স অনুসারে:

সারণি উপস্থিত থাকলে সারণীতে একটি প্রতিস্থাপন করুন বা সারিটি ইতিমধ্যে উপস্থিত না থাকলে কোনও সারণীতে একটি নতুন সারি প্রবেশ করান।

আমি কিছু প্লাগিনে নিজেকে চেষ্টা করেছি এবং অনন্য আইডি সদৃশ ত্রুটি ইত্যাদি এড়ানোর চেষ্টা করার সময় এটি কাজ করে

কোডেক্সে আরও তথ্য


কাস্টম ক্যোয়ারী না করার সময় এটি আমার পক্ষে কাজ করেছে - প্রতিস্থাপনের জন্য ধন্যবাদ) ()
ট্রেনোসিস

এটি প্রশ্নের সঠিক উত্তর।
টাইলার জোনস

6
এটি লক্ষণীয় যে $wpdb->replaceপুরো রেকর্ডের একটি ধ্বংসাত্মক ওভাররাইট, যেখানে অ্যারেতে $wpdb->updateঅন্তর্ভুক্ত নির্দিষ্ট ক্ষেত্রগুলি কেবল আপডেট করে$data
ম্যাথিউল্লি

0

সারিটি আগে উপস্থিত রয়েছে কিনা তা আপনার পরীক্ষা করা উচিত।

সম্ভবত আপনি যে সারির আপডেট করার চেষ্টা করছেন তার জন্য আইডি বা প্রাথমিক কীটি পাওয়ার চেষ্টা করতে চাইবেন, $wpdb->updateযদি তা না হয় বা $wpdb->insertনা করে


14
আইডি বা প্রাথমিক কী উপস্থিত আছে কিনা তা পরীক্ষা করে দেখার একটি উদাহরণ সত্যই এটি একটি দরকারী উত্তর হিসাবে তৈরি করবে। এটি প্রায়শই প্রশ্নের পুনরাবৃত্তি করার মতো।
জেক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.