BindParam এবং bindValue মধ্যে পার্থক্য কি?


উত্তর:


190

উত্তরটি ডকুমেন্টেশনে রয়েছে 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'

667

এর জন্য ম্যানুয়াল এন্ট্রি থেকে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'

9
উজ্জ্বল, ধন্যবাদ! প্রশ্ন - আপনি কেন একে অপরকে ব্যবহার করতে চান? কেবলমাত্র কার্যকর () সময়ে বাইন্ড প্যারামিটার মূল্যায়ন করা কখন কার্যকর বা প্রয়োজনীয় হবে?
কোল্ডব্ল্যাকিস

32
@ কোল্ডব্ল্যাকাইস যদি আপনি বিভিন্ন তথ্য দিয়ে একাধিকবার ক্যোয়ারী চালাচ্ছেন। bindValueআপনার প্রত্যেকবার ডেটা পুনরায় বাঁধতে হবে With সঙ্গে bindParamআপনি শুধু পরিবর্তনশীল আপডেট করা দরকার চাই। ব্যবহারের মূল কারণটি bindValueহ'ল স্থায়ী ডেটা, যেমন আক্ষরিক স্ট্রিং বা সংখ্যা।
একাকী দিন

1
উদাহরণস্বরূপ, আপনি ফাংশন রিটার্ন মানগুলির সাথে bindValue ব্যবহার করতে চান: $ stmt-> bindValue (': status', strtolver ((status), PDO :: PARAM_STR);
payforbychrist

1
উত্সাহিত করতে চেয়েছিলেন, তবে এটি is
is6 হওয়ায়

219

এখানে আমি কিছু ভাবতে পারি:

  • এর সাথে bindParam, আপনি কেবল ভেরিয়েবলগুলি পাস করতে পারবেন; মান না
  • এর সাহায্যে bindValue, আপনি উভয়কেই পাস করতে পারেন (মানগুলি স্পষ্টতই এবং ভেরিয়েবলগুলি)
  • bindParamকেবলমাত্র ভেরিয়েবলগুলির সাথে কাজ করে কারণ এটি "রেফারেন্স" দ্বারা ইনপুট / আউটপুট হিসাবে প্যারামিটারগুলি দেওয়ার অনুমতি দেয় (এবং পিএইচপি-তে কোনও মান একটি বৈধ "রেফারেন্স" নয়) : এটি ড্রাইভারের সাথে দরকারী যে (ম্যানুয়ালটি উদ্ধৃত করে):

আউটপুট প্যারামিটার হিসাবে ডেটা ফেরত এমন স্টোরেজ প্রক্রিয়াগুলির অনুরোধকে সমর্থন করে এবং কিছু ইনপুট / আউটপুট পরামিতি হিসাবে যা উভয়ই ডেটা প্রেরণ করে এবং তা গ্রহণ করার জন্য আপডেট হয়।

কিছু ডিবি ইঞ্জিনের সাহায্যে, সঞ্চিত পদ্ধতিতে প্যারামিটার থাকতে পারে যা উভয় ইনপুট (পিএইচপি থেকে প্রক্রিয়াতে একটি মান প্রদান) এবং আউটপুট (স্টোরড প্রোক থেকে পিএইচপি-তে কোনও মান ফেরত দেওয়া) জন্য ব্যবহৃত হতে পারে; এই পরামিতিগুলি আবদ্ধ করতে, আপনাকে বিন্দুপ্রাম ব্যবহার করতে হবে, এবং বাইন্ডভ্যালু নয়।


@ প্যাস্কালমার্টিন আমি যা জানতে চেয়েছিলাম ঠিক তা কি আপনি বিন্দুপ্রামের সাথে মানগুলি বাঁধতে পারেন? চিয়ার্স।
ইয়াহুদা

1
এর সঠিক অর্থ কী, ভেরিয়েবলগুলি হ'ল এবং মানগুলি কী তা এখনও আমার কোনও ধারণা নেই। আমি একটি স্থানধারকের সাথে একটি মান আবদ্ধ করতে বাইন্ডারাম ব্যবহার করি এবং বাইন্ডভ্যালু দিয়ে আমিও এটি করতে পারি! - আমার উদাহরণে কমপক্ষে ...
রিচার্ড

29

থেকে প্রস্তুত বিবৃতি এবং সঞ্চিত পদ্ধতি

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();

27

সর্বাধিক সাধারণ উদ্দেশ্যে, আপনার ব্যবহার করা উচিত bindValue

bindParam দুটি কৌশলযুক্ত বা অপ্রত্যাশিত আচরণ রয়েছে:

  • bindParam(':foo', 4, PDO::PARAM_INT) কোনও চলক (রেফারেন্স হিসাবে) পাস করার জন্য এটি কার্যকর হয় না passing
  • bindParam(':foo', $value, PDO::PARAM_INT)$valueচলমান পরে স্ট্রিং পরিবর্তন হবে execute()। এটি অবশ্যই সূক্ষ্ম ত্রুটিগুলি হতে পারে যা ধরতে অসুবিধা হতে পারে।

সূত্র: http://php.net/manual/en/pdostatement.bindparam.php#94711


4

আপনাকে আর লড়াই করতে হবে না, যখন সেখানে কোনও উপায় থাকার মতো উপায় রয়েছে:

$stmt = $pdo->prepare("SELECT * FROM someTable WHERE col = :val");
$stmt->execute([":val" => $bind]); 

4

আচরণের মাধ্যমে মুখস্থ করার জন্য এটিকে দৃষ্টিকোণে রাখার সহজ উপায় (পিএইচপি এর শর্তাবলী):

  • bindParam: উল্লেখ
  • bindValue: পরিবর্তনশীল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.