মধ্যে পার্থক্য কি PDOStatement::bindParam()
এবং PDOStatement::bindValue()
?
মধ্যে পার্থক্য কি PDOStatement::bindParam()
এবং PDOStatement::bindValue()
?
উত্তর:
উত্তরটি ডকুমেন্টেশনে রয়েছে bindParam
:
PDOStatement :: bindValue () এর বিপরীতে, চলকটি একটি রেফারেন্স হিসাবে আবদ্ধ এবং কেবল PDOStatement :: execute () বলা হওয়ার সময় মূল্যায়ন করা হবে।
এবং execute
প্যারামিটার চিহ্নিতকারীগুলিতে পিএইচপি ভেরিয়েবলগুলি আবদ্ধ করতে PDOStatement :: bindParam () কল করুন: সীমাবদ্ধ ভেরিয়েবলগুলি তাদের মানটিকে ইনপুট হিসাবে পাস করে এবং তাদের সাথে সম্পর্কিত প্যারামিটার চিহ্নিতকারীগুলির আউটপুট মান গ্রহণ করে
উদাহরণ:
$value = 'foo';
$s = $dbh->prepare('SELECT name FROM bar WHERE baz = :baz');
$s->bindParam(':baz', $value); // use bindParam to bind the variable
$value = 'foobarbaz';
$s->execute(); // executed with WHERE baz = 'foobarbaz'
অথবা
$value = 'foo';
$s = $dbh->prepare('SELECT name FROM bar WHERE baz = :baz');
$s->bindValue(':baz', $value); // use bindValue to bind the variable's value
$value = 'foobarbaz';
$s->execute(); // executed with WHERE baz = 'foo'
এর জন্য ম্যানুয়াল এন্ট্রি থেকেPDOStatement::bindParam
:
[সহ
bindParam
] অসদৃশPDOStatement::bindValue()
, পরিবর্তনশীল একটি রেফারেন্স হিসাবে আবদ্ধ এবং শুধুমাত্র যে সময়PDOStatement::execute()
বলা হয় মূল্যায়ন করা হবে ।
সুতরাং, উদাহরণস্বরূপ:
$sex = 'male';
$s = $dbh->prepare('SELECT name FROM students WHERE sex = :sex');
$s->bindParam(':sex', $sex); // use bindParam to bind the variable
$sex = 'female';
$s->execute(); // executed with WHERE sex = 'female'
অথবা
$sex = 'male';
$s = $dbh->prepare('SELECT name FROM students WHERE sex = :sex');
$s->bindValue(':sex', $sex); // use bindValue to bind the variable's value
$sex = 'female';
$s->execute(); // executed with WHERE sex = 'male'
bindValue
আপনার প্রত্যেকবার ডেটা পুনরায় বাঁধতে হবে With সঙ্গে bindParam
আপনি শুধু পরিবর্তনশীল আপডেট করা দরকার চাই। ব্যবহারের মূল কারণটি bindValue
হ'ল স্থায়ী ডেটা, যেমন আক্ষরিক স্ট্রিং বা সংখ্যা।
এখানে আমি কিছু ভাবতে পারি:
bindParam
, আপনি কেবল ভেরিয়েবলগুলি পাস করতে পারবেন; মান নাbindValue
, আপনি উভয়কেই পাস করতে পারেন (মানগুলি স্পষ্টতই এবং ভেরিয়েবলগুলি)bindParam
কেবলমাত্র ভেরিয়েবলগুলির সাথে কাজ করে কারণ এটি "রেফারেন্স" দ্বারা ইনপুট / আউটপুট হিসাবে প্যারামিটারগুলি দেওয়ার অনুমতি দেয় (এবং পিএইচপি-তে কোনও মান একটি বৈধ "রেফারেন্স" নয়) : এটি ড্রাইভারের সাথে দরকারী যে (ম্যানুয়ালটি উদ্ধৃত করে):আউটপুট প্যারামিটার হিসাবে ডেটা ফেরত এমন স্টোরেজ প্রক্রিয়াগুলির অনুরোধকে সমর্থন করে এবং কিছু ইনপুট / আউটপুট পরামিতি হিসাবে যা উভয়ই ডেটা প্রেরণ করে এবং তা গ্রহণ করার জন্য আপডেট হয়।
কিছু ডিবি ইঞ্জিনের সাহায্যে, সঞ্চিত পদ্ধতিতে প্যারামিটার থাকতে পারে যা উভয় ইনপুট (পিএইচপি থেকে প্রক্রিয়াতে একটি মান প্রদান) এবং আউটপুট (স্টোরড প্রোক থেকে পিএইচপি-তে কোনও মান ফেরত দেওয়া) জন্য ব্যবহৃত হতে পারে; এই পরামিতিগুলি আবদ্ধ করতে, আপনাকে বিন্দুপ্রাম ব্যবহার করতে হবে, এবং বাইন্ডভ্যালু নয়।
থেকে প্রস্তুত বিবৃতি এবং সঞ্চিত পদ্ধতি
bindParam
এক সময়ের বাইন্ডিং সহ একাধিক সারি সন্নিবেশ করানোর জন্য ব্যবহার করুন :
<?php
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
$stmt->bindParam(1, $name);
$stmt->bindParam(2, $value);
// insert one row
$name = 'one';
$value = 1;
$stmt->execute();
// insert another row with different values
$name = 'two';
$value = 2;
$stmt->execute();
সর্বাধিক সাধারণ উদ্দেশ্যে, আপনার ব্যবহার করা উচিত bindValue
।
bindParam
দুটি কৌশলযুক্ত বা অপ্রত্যাশিত আচরণ রয়েছে:
bindParam(':foo', 4, PDO::PARAM_INT)
কোনও চলক (রেফারেন্স হিসাবে) পাস করার জন্য এটি কার্যকর হয় না passingbindParam(':foo', $value, PDO::PARAM_INT)
$value
চলমান পরে স্ট্রিং পরিবর্তন হবে execute()
। এটি অবশ্যই সূক্ষ্ম ত্রুটিগুলি হতে পারে যা ধরতে অসুবিধা হতে পারে।সূত্র: http://php.net/manual/en/pdostatement.bindparam.php#94711
আপনাকে আর লড়াই করতে হবে না, যখন সেখানে কোনও উপায় থাকার মতো উপায় রয়েছে:
$stmt = $pdo->prepare("SELECT * FROM someTable WHERE col = :val");
$stmt->execute([":val" => $bind]);