পিডিও মাইএসকিএল: কীভাবে সন্নিবেশ সফল হয়েছিল তা কীভাবে জানবেন


96

আমি একটি রেকর্ড সন্নিবেশ করতে পিডিও ব্যবহার করছি (মাইএসকিএল এবং পিএইচপি)

$stmt->bindParam(':field1', $field1, PDO::PARAM_STR);
$stmt->bindParam(':field2', $field2, PDO::PARAM_STR);
$stmt->execute();

এটি সফলভাবে sertedোকানো হয়েছে কিনা তা জানার কোনও উপায় আছে, উদাহরণস্বরূপ, যদি এটি নকল হওয়ায় রেকর্ডটি প্রবেশ করানো হয়নি?

সম্পাদনা করুন: অবশ্যই আমি ডাটাবেসটি দেখতে পারি, তবে আমি প্রোগ্রামেটিক প্রতিক্রিয়া বলতে চাইছি।

উত্তর:


141

PDOStatement->execute()সাফল্যের সত্য। এছাড়াও PDOStatement->errorCode()আপনি যা ত্রুটি পরীক্ষা করতে পারেন।


4
এক্সিকিউট () মানটিকে আপনি কীভাবে দেখেন?
ম্যাল্লো

29
এর মতো আর কোনও নয়, $ value = $ stmt-> execute (); যদি ($ মান) {// সত্য} অন্যথায় false // মিথ্যা}
fলাফুর ওয়েজ

23
বা আপনি কেবল করতে পারেনif ($stmt->execute()) { //true }
গ্যাভিন

4
কি PDOStatement->execute()এবং PDOStatement->errorCode()সম্পূর্ণভাবে একে অপরের সাথে সামঞ্জস্যপূর্ণ? সত্য কি ফিরে আসে যখন PDOStatement->errorCode()কিছু আছে কি PDOStatement->execute()? নাকি PDOStatement->execute()প্রত্যাবর্তন মিথ্যা তবে PDOStatement->errorCode()কিছুই নেই?
datasn.io

4
নতুন রেকর্ড was
োকানো

26

প্রদত্ত যে PDO- র জন্য সবচেয়ে প্রস্তাবিত ত্রুটি মোড ERRMODE_EXCEPTION, কোনও সরাসরি execute()ফলাফল যাচাইকরণ কাজ করবে না । কোড এক্সিকিউশন এমনকি অন্যান্য উত্তরে প্রদত্ত শর্তে পৌঁছাবে না।

সুতরাং, পিডিওতে ক্যোয়ারি এক্সিকিউশন ফলাফলটি পরিচালনা করার জন্য তিনটি সম্ভাব্য পরিস্থিতি রয়েছে:

  1. সাফল্যটি বলতে, কোনও যাচাইকরণের দরকার নেই। আপনার প্রোগ্রামের প্রবাহ কেবল রাখুন।
  2. অপ্রত্যাশিত ত্রুটিটি পরিচালনা করতে, একই সাথে রাখুন - তাত্ক্ষণিকভাবে কোনও হ্যান্ডলিং কোডের প্রয়োজন নেই। একটি ডাটাবেস ত্রুটির ক্ষেত্রে একটি ব্যতিক্রম ছুঁড়ে দেওয়া হবে এবং এটি সাইট-প্রশস্ত ত্রুটি হ্যান্ডলারের উপর বুদবুদ হবে যা পরিণামে একটি সাধারণ 500 ত্রুটি পৃষ্ঠাতে দেখা দেবে will
  3. ডুপ্লিকেট প্রাইমারি কী এর মতো প্রত্যাশিত ত্রুটিটি হ্যান্ডেল করতে এবং যদি এই নির্দিষ্ট ত্রুটিটি পরিচালনা করতে আপনার কাছে একটি নির্দিষ্ট দৃশ্য থাকে তবে try..catchঅপারেটরটি ব্যবহার করুন ।

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

সুতরাং, সংক্ষেপে: একটি নিয়মিত কোডে আপনার কোনও হ্যান্ডল করার কোনও প্রয়োজন নেই। আপনার কোডটি ঠিক তেমন রাখুন:

$stmt->bindParam(':field1', $field1, PDO::PARAM_STR);
$stmt->bindParam(':field2', $field2, PDO::PARAM_STR);
$stmt->execute();
echo "Success!"; // whatever

সাফল্যের সাথে এটি আপনাকে তাই বলে দেবে, ত্রুটিতে এটি আপনাকে নিয়মিত ত্রুটি পৃষ্ঠাটি দেখাবে যা আপনার অ্যাপ্লিকেশনটি এই জাতীয় অনুষ্ঠানের জন্য প্রদর্শিত হচ্ছে।

কেবলমাত্র যদি ত্রুটিটি রিপোর্ট করা ব্যতীত আপনার কোনও হ্যান্ডলিংয়ের পরিস্থিতি থাকে তবে কোনও try..catchঅপারেটরে আপনার sertোকানো বিবৃতি রাখুন , এটি আপনি প্রত্যাশা করেছিলেন যে ত্রুটি ছিল কিনা তা পরীক্ষা করে তা পরিচালনা করে; বা - যদি ত্রুটিটি অন্যরকম ছিল - সাইট-ওয়াইড ত্রুটি হ্যান্ডলারটি নিয়মিতভাবে পরিচালনা করা সম্ভব করার জন্য, ব্যতিক্রমটি আবার ছুঁড়ে দিন। নীচে PDO- র সাথে ত্রুটি পরিচালনা করার বিষয়ে আমার নিবন্ধের উদাহরণ কোডটি রয়েছে :

try {
     $pdo->prepare("INSERT INTO users VALUES (NULL,?,?,?,?)")->execute($data);
} catch (PDOException $e) {
    if ($e->getCode() == 1062) {
        // Take some action if there is a key constraint violation, i.e. duplicate name
    } else {
        throw $e;
    }
}
echo "Success!";

উপরের কোডে আমরা কিছু ব্যবস্থা নেওয়ার জন্য নির্দিষ্ট ত্রুটির জন্য যাচাই করছি এবং অন্য কোনও ত্রুটির জন্য ব্যতিক্রমটিকে পুনরায় নিক্ষেপ করছি (উদাহরণস্বরূপ কোনও টেবিল নেই) যা প্রোগ্রামারকে জানানো হবে।

আবার যখন - কেবল কোনও ব্যবহারকারীকে কিছু বলার জন্য "আপনার সন্নিবেশ সফল হয়েছিল" কোনও শর্তের প্রয়োজন নেই।


"সাফল্য" এর অর্থ কী? এর অর্থ কী কোনও নতুন সারি sertedোকানো হয়েছে, বা এর অর্থ কোনও ত্রুটি নেই?
মার্টিন এজে

INSERT ক্যোয়ারির জন্য এটি বেশ প্রায় একই।
আপনার সাধারণ অনুভূতি

আপনি ঠিক বলেছেন .. query()ফাংশন সম্পর্কে কি আমাকে বলতে পারেন ? আমি কি এর query()পরিবর্তে ট্র্যাচ-ক্যাচ ব্যবহার করতে পারি prepared()->execute()?
মার্টিন এজে

4
আপনার প্রথম স্থানটিতে প্রবেশের জন্য কোয়েরি () ব্যবহার করা উচিত নয়। সন্নিবেশ মানে ইনপুট রয়েছে এবং ইনপাউট মানে এটি প্রস্তুত করা উচিত।
আপনার সাধারণ অনুভূতি

4
মাইএসকিউএল ব্যবহার করে, আমি $ ই> getCode () সবসময় কারণ 23000. যদি $ ই> errorInfo [1] == 1062 তা যাচাই করতে সন্নিবেশ ব্যর্থ চেক করতে, ছিল
tronman


9

যদি একটি আপডেট ক্যোয়ারী বর্তমান ডাটাবেস রেকর্ডের সাথে মানগুলির সাথে কার্যকর হয় তবে কোনও সারি প্রভাবিত না হয়ে $stmt->rowCount()ফিরে আসবে 0if( rowCount() == 1 )সাফল্যের জন্য যদি আপনার পরীক্ষা করতে হয় তবে আপনি ভাবেন যে আপডেট ব্যর্থ হয়েছে যখন এটি ব্যর্থ হয় নি তবে মানগুলি ইতিমধ্যে ডাটাবেসে ছিল তাই কোনও পরিবর্তন হয়নি।

$stmt->execute();
if( $stmt ) return "success";

লঙ্ঘন করা এমন একটি অনন্য কী ক্ষেত্রের সাথে রেকর্ড আপডেট করার চেষ্টা করার সময় এটি আমার পক্ষে কার্যকর হয়নি। ক্যোয়ারীটি সাফল্য ফিরে পেয়েছে তবে অন্য একটি ক্যোয়ারী পুরানো ক্ষেত্রের মান দেয়।


4
আপনি যদি রেকর্ডটি সন্নিবেশ করানোর প্রয়োজন হয় তবে সবচেয়ে ভাল উপায়টি এটির মতো চেক করা ............................. ..... .................. if($stmt->execute() && ($stmt->rowCount()>0))
jave.web

4

আপনি সারি গণনা পরীক্ষা করতে পারেন

    $sqlStatement->execute( ...);
    if ($sqlStatement->rowCount() > 0)
    {
        return true;
    }

দস্তাবেজগুলির কাছে ফিরে আসা একটি রেফারেন্স সর্বদা @YourCommonSense এ সহায়ক। এটি বলছে "এই আচরণটি সমস্ত ডাটাবেসের জন্য গ্যারান্টিযুক্ত নয় এবং পোর্টেবল অ্যাপ্লিকেশনগুলির জন্য নির্ভর করা উচিত নয়।" তবে এটি প্রথমে নির্বাচন করতে সীমাবদ্ধ এবং দ্বিতীয়ত মাইএসকিএল-র জন্য সমর্থিত, যা এই পোস্টের বিষয়।
23:37

আপনার ব্রাউজারের অ্যাড্রেস বারে কেবল "পিডো রোউকাউন্ট" টাইপ করুন এবং প্রথম লিঙ্কটি ক্লিক করুন। এটি কোনও মন্তব্যের চেয়ে কম টাইপ করে নেয়
আপনার প্রচলিত

4
@ ক্রাফ্টর সঠিক এটি বলেছে যে সারিউমাউন্ট () SELECTঅনুসন্ধানের জন্য অবিশ্বাস্য হতে পারে (এবং সেখানেও ডক্স একাধিক অনুসন্ধান সম্পর্কে কথা বলে )। এটি সম্পর্কে DELETE, INSERTবা UPDATE, যা কাজ করা ভাল বলে মনে হচ্ছে (প্রশ্নটি একটি INSERTপ্রশ্নের বিষয়ে ছিল ) সম্পর্কে কিছুই বলে না । যাইহোক, আমি পিডিওতে নতুন এবং যদি আমার ভুল হয় এবং কারও অন্য উল্লেখ থাকে তবে দয়া করে সেগুলি এখানে লিখুন। আমি উপরের 3 টি কমান্ডের প্রকৃত অসুবিধা আছে কিনা তা জানতে আগ্রহী।
StanE

1

অটো ইনক্রিমেন্ট সহ প্রাথমিক কী হিসাবে আইডি ব্যবহার করুন

$stmt->execute();
$insertid = $conn->lastInsertId();

ইনক্রিমেন্টাল আইডি সর্বদা প্রথম রেকর্ডে শূন্যের চেয়ে বড় থাকে যার অর্থ এটি পিএইচপি-র শূন্যের চেয়ে বড় আইডি কোজের সত্যিকারের মানটি সর্বদা ফিরিয়ে দেবে

if ($insertid)
   echo "record inserted successfully";
else
   echo "record insertion failed";

আমার টেবিলে যদি আমার স্বয়ংক্রিয় বর্ধিত ক্ষেত্রের প্রয়োজন না হয় তবে কী হবে?
আপনার কমন সেন্স

কারা? আপনি? আরআরএসএফএফুল এপিআই সহ যা এত ব্যাপকভাবে ব্যবহৃত হচ্ছে স্বয়ংক্রিয় ইনক্রিমেন্ট আইডি বাধ্যতামূলক।
জাম্পার আরবিকে

কারও কেন প্রাথমিক ও অটো ইনক্রিমেন্ট বা অন্য কোনও ক্রম কলাম থাকবে না? যদি যাচাইকরণের পদ্ধতি প্রয়োজন হয় তবে যে কোনও অনুক্রমিক কলাম যুক্ত করুন। যদি এই সমাধানটি আপনার পক্ষে না হয় তবে এটি যুক্ত করবেন না। এটি আমার কাছে খুব সুন্দর, আমি সবসময় কিছু ক্রমিক এবং স্বতঃবৃদ্ধি কলাম ব্যবহার করি, তাই আমার জিজ্ঞাসা সফল হয়েছিল কিনা তা পরীক্ষা করার আমার কাছে সবসময় উপায় রয়েছে।
স্যামুয়েল রমজান

0

PDOStatement-> execute () একটি ব্যতিক্রম ছুঁড়ে ফেলতে পারে

সুতরাং আপনি যা করতে পারেন তা হ'ল

try
{
PDOStatement->execute();
//record inserted
}
catch(Exception $e)
{
//Some error occured. (i.e. violation of constraints)
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.