আমি PDO ব্যবহার করে কীভাবে নুল মান সন্নিবেশ করব?


105

আমি এই কোডটি ব্যবহার করছি এবং হতাশার বাইরে:

try {
    $dbh = new PDO('mysql:dbname=' . DB . ';host=' . HOST, USER, PASS);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $dbh->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES 'utf8'");
}
catch(PDOException $e)
{
    ...
}
$stmt = $dbh->prepare('INSERT INTO table(v1, v2, ...) VALUES(:v1, :v2, ...)');
$stmt->bindParam(':v1', PDO::PARAM_NULL); // --> Here's the problem

PDO::PARAM_NULL, null, '', তাদের সমস্ত ব্যর্থ এবং এই ত্রুটি নিক্ষেপ:

মারাত্মক ত্রুটি : / opt / ... তে রেফারেন্স দিয়ে প্যারামিটার 2 পাস করতে পারে না

উত্তর:


138

আমি কেবল পিডিও শিখছি, তবে আমার মনে হয় আপনার ব্যবহার করা উচিত bindValue, নাbindParam

bindParamরেফারেন্সের জন্য, একটি পরিবর্তনশীল লাগে এবং কল করার সময় কোনও মান টান না bindParam। আমি পিএইচপি ডক্সে একটি মন্তব্যে এটি পেয়েছি:

bindValue(':param', null, PDO::PARAM_INT);

সম্পাদনা: পিএস আপনি এটি করতে প্ররোচিত হতে পারেন bindValue(':param', null, PDO::PARAM_NULL);তবে এটি সবার জন্য কার্যকর হয়নি (রিপোর্ট করার জন্য আপনাকে উইল শেভার ধন্যবাদ জানায়))


আমি নিশ্চিত যে এই দুজনের মধ্যে পার্থক্য নেই, তবে আমি কিছু তদন্ত করব। ধন্যবাদ, আপনার উত্তরটিও দুর্দান্ত ছিল।
নাচো

3
আমি মনে করি এটি আমার চেয়ে ভাল উত্তর হতে পারে (যদি তা সত্যিই কাজ করে)
জো ফিলিপস

2
আমার মাইএসকিএল 5.1.53 তে PDO :: PARAM_NULL নিয়ে সমস্যা হয়েছিল, কিন্তু PDO :: PARAM_INT নাল মান সহ দুর্দান্ত কাজ করেছে।
শেভ করবে

2
ওডিন: আমি মনে করি সবচেয়ে গুরুত্বপূর্ণ অংশটি তিনটি প্যারামিটার পাস করা :)। ইগ এর প্রশ্নে তিনি PDO :: PARAM_NULL কে টাইপের পরিবর্তে মান হিসাবে (এবং কোনও ধরণের
কোনওভাবেই

1
এফওয়াইআই: বেশিরভাগ ক্ষেত্রে আপনি bindValue()ওভার ব্যবহারের ক্ষেত্রে পুরোপুরি ভাল আছেন bindParam(); সবকিছুর জন্য, শুধু NULLমানের জন্য নয় । আমি কোনও একক ক্ষেত্রে ভাবতে পারি না যেখানে আপনাকে পিএইচপি ভেরিয়েবলের একটি রেফারেন্সে প্যারামিটারটি আবদ্ধ করতে হবে - তবে এটিই bindParam()হয়।
low_rents

48

ব্যবহার করার সময় bindParam()আপনাকে অবশ্যই একটি পরিবর্তনশীল হিসাবে পাস করতে হবে, ধ্রুবক নয়। সুতরাং এই লাইনের আগে আপনাকে একটি ভেরিয়েবল তৈরি করতে হবে এবং সেট করতে হবেnull

$myNull = null;
$stmt->bindParam(':v1', $myNull, PDO::PARAM_NULL);

আপনি চেষ্টা করলে আপনি একই ত্রুটি বার্তা পাবেন:

$stmt->bindParam(':v1', 5, PDO::PARAM_NULL);

আপনি এটি অধিকার পেয়েছেন, আমি ঠিক বুঝতে পেরেছিলাম যে আমি আমার কোডটিতে আগে এটি করেছি, ull নাল = পিডিও :: PARAM_NULL; ধন্যবাদ।
নাচো

1
আপনি যদি যাইহোক স্থানধারক তৈরি করতে চলেছেন তবে এই ক্ষেত্রে বিনডওয়ালু () ব্যবহার করা ভাল। bindParam () মূলত একটি ক্যোয়ারী চালানো এবং তারপরে ভেরিয়েবলগুলি পরিবর্তন করে আবার পরামিতিগুলি আবদ্ধ না করে পুনরায় সম্পাদন করার উদ্দেশ্যে তৈরি। bindValue () অবিলম্বে বাঁধাই করে, বাইন্ডারাম () কেবলমাত্র সঞ্চালনের সময়।
হুগো জিংক

1
আমি দেখতে পেয়েছি যে নালটি অবশ্যই $ myNull = নাল রেখায় ছোট হাতের হতে হবে। $ myNull = NULL কার্যকর হয়নি।
র্যাফেল 75

28

মাইএসকিউএলে INTEGERকলামগুলি (যা হতে পারে NULL) ব্যবহার করার সময় , PDO এর কিছু (আমার কাছে) অপ্রত্যাশিত আচরণ থাকে।

আপনি যদি ব্যবহার করেন তবে আপনাকে $stmt->execute(Array)আক্ষরিক উল্লেখ করতে হবে NULLএবং NULLপরিবর্তনশীল উল্লেখ দ্বারা দিতে পারবেন না । সুতরাং এটি কাজ করবে না:

// $val is sometimes null, but sometimes an integer
$stmt->execute(array(
    ':param' => $val
));
// will cause the error 'incorrect integer value' when $val == null

তবে এটি কাজ করবে:

// $val again is sometimes null, but sometimes an integer
$stmt->execute(array(
    ':param' => isset($val) ? $val : null
));
// no errors, inserts NULL when $val == null, inserts the integer otherwise

পিএইচপি 5.4.1 এর সাথে মাইএসকিউএল 5.5.15 এ চেষ্টা করেছেন


1
$ stmt-> এক্সিকিউট (অ্যারে (': পরম' =>! খালি ($ ভাল)? $ ভাল: নাল))); ব্যবহার করুন! খালি কারণ খালি স্ট্রিংয়ের জন্য আপনি
ডাটাবেসও

1
@ শেহজাদনিজমণি যদি কলামের ধরণটি পূর্ণসংখ্য হয় তবে তার উদাহরণ হিসাবে হ্যাঁ। তবে অন্যথায় এর isset()সাথে আরও ভাল সম্পর্কযুক্ত NULL। একটি খালি স্ট্রিংয়েরও একটি মান।
StanE

8

যাদের এখনও সমস্যা আছে (রেফারেন্সের মাধ্যমে প্যারামিটার 2 পাস করতে পারবেন না), নাল মান সহ একটি ভেরিয়েবল সংজ্ঞায়িত করুন, কেবল পিডিওতে নাল পাস করবেন না:

bindValue(':param', $n = null, PDO::PARAM_INT);

আশাকরি এটা সাহায্য করবে.


6

আমারও একই সমস্যা ছিল এবং আমি এই সমাধানটি বাইন্ডপ্রামের সাথে কাজ করে দেখলাম:

    bindParam(':param', $myvar = NULL, PDO::PARAM_INT);

3

আপনি সন্নিবেশ করতে চান NULLশুধুমাত্র যখন valueহয় emptyবা '', কিন্তু সন্নিবেশ valueযখন এটি পাওয়া যায়।

ক) পোস্ট পদ্ধতি ব্যবহার করে ফর্ম ডেটা প্রাপ্ত করে এবং সেই মানগুলির সাথে ফাংশন সন্নিবেশ কল করে।

insert( $_POST['productId'], // Will be set to NULL if empty    
        $_POST['productName'] ); // Will be to NULL if empty                                

খ) কোনও ক্ষেত্র যদি ব্যবহারকারী পূরণ না করে এবং মূল্যায়ন করে যে যদি ক্ষেত্রটি পূরণ না করে NULL

public function insert( $productId, $productName )
{ 
    $sql = "INSERT INTO products (  productId, productName ) 
                VALUES ( :productId, :productName )";

    //IMPORTANT: Repace $db with your PDO instance
    $query = $db->prepare($sql); 

    //Works with INT, FLOAT, ETC.
    $query->bindValue(':productId',  !empty($productId)   ? $productId   : NULL, PDO::PARAM_INT); 

    //Works with strings.
    $query->bindValue(':productName',!empty($productName) ? $productName : NULL, PDO::PARAM_STR);   

    $query->execute();      
}

উদাহরণ হিসেবে বলা যায়, ব্যবহারকারী না ইনপুট কিছু হয়, তাহলে productNameফর্মের ক্ষেত্র, তারপর $productNameহবে SETকিন্তু EMPTY। সুতরাং, আপনার এটি পরীক্ষা করা দরকার কিনা empty()এবং এটি যদি হয় তবে সন্নিবেশ করান NULL

পিএইচপি 5.5.17 এ পরীক্ষিত

শুভকামনা,


3
অথবা, আপনি IFNULL()কোয়েরি স্ট্রিংয়ে মাইএসকিউএল এর ফাংশন ব্যবহার করতে পারেন । এটি পছন্দ করুন:$sql = "INSERT INTO products ( productId, productName ), VALUES ( IFNULL(:productId, NULL), IFNULL(:productName, NULL) )";
স্টারলিফ 1

আপনার পরিষ্কার পরিচ্ছন্নতা আমি পছন্দ করি। আমি কেবল এটি পরীক্ষা করেছি, তবে ব্যবহারকারী যখন ইনপুটটিতে কিছু না লেখেন তখন দুর্ভাগ্যক্রমে এটি NULL এর পরিবর্তে খালি স্ট্রিং সন্নিবেশ করায়। এটি কেবল পছন্দের বিষয়, তবে খালি স্ট্রিংয়ের পরিবর্তে আমার কাছে NULL রয়েছে।
আরিয়ান অ্যাকোস্টা

0

এটা চেষ্টা কর.

$stmt->bindValue(':v1', null, PDO::PARAM_NULL); // --> insert null

1
এত পুরানো প্রশ্নের উত্তর দেওয়ার চেষ্টা করার আগে আপনার অন্যান্য উত্তরগুলি প্রথমে পড়া উচিত। এটি ইতিমধ্যে উত্তর দেওয়া হতে পারে।
আপনার কমন সেন্স

0

অন্যান্য উত্তরের উপর ভিত্তি করে তবে এই সমাধানটি কীভাবে ব্যবহার করতে হবে সে সম্পর্কে আরও কিছুটা স্পষ্টতার সাথে।

উদাহরণস্বরূপ যদি আপনার কাছে একটি সময়ের মানের জন্য খালি স্ট্রিং থাকে তবে আপনি এটিকে শূন্য হিসাবে সংরক্ষণ করতে চান:

  if($endtime == ""){
    $db->bind(":endtime",$endtime=NULL,PDO::PARAM_STR);
  }else{
    $db->bind("endtime",$endtime);
  }

লক্ষ্য করুন যে সময়ের মানগুলির জন্য আপনি PARAM_STR ব্যবহার করবেন, সময়কে স্ট্রিং হিসাবে সংরক্ষণ করা হয়।


-1

আমার ক্ষেত্রে আমি ব্যবহার করছি:

  • SQLite,

  • অজানা সংখ্যক ক্ষেত্র পরিচালনা করতে স্থানধারীদের সাথে বিবৃতি প্রস্তুত করা,

  • AJAX অনুরোধ ব্যবহারকারী দ্বারা প্রেরিত যেখানে সমস্ত কিছু স্ট্রিং এবং NULLমান এবং এর মতো কোনও জিনিস নেই

  • বিদেশী কী বাধা (গ্রহণযোগ্য মান) NULLলঙ্ঘন করে না বলে আমার মারাত্মকভাবে এস toোকানো দরকার ।

অনুমান, এখন ব্যবহারকারী পোস্টের সাথে পাঠায়: $_POST[field1]মান value1যা খালি স্ট্রিং হতে পারে ""বা "null"বা "NULL"

প্রথমে আমি বিবৃতি দিচ্ছি:

$stmt = $this->dbh->prepare("INSERT INTO $table ({$sColumns}) VALUES ({$sValues})");

যেখানে {$sColumns}স্টেহ এর মত field1, field2, ...এবং {$sValues}আমার স্থানধারক ?, ?, ...

তারপরে আমি $_POSTকলামের নামগুলি সম্পর্কিত একটি অ্যারেতে আমার সম্পর্কিত তথ্য সংগ্রহ করি $values এবংNULL এর সাথে প্রতিস্থাপন করি :

  for($i = 0; $i < \count($values); $i++)
     if((\strtolower($values[$i]) == 'null') || ($values[$i] == ''))
        $values[$i] = null;

এখন, আমি কার্যকর করতে পারি:

$stmt->execute($values);

এবং অন্যান্য বাইপাস বিদেশী কী বাধাগুলির মধ্যে।

অন্যদিকে, যদি খালি স্ট্রিংটি আরও অর্থবোধ করে তবে আপনাকে পরীক্ষা করতে হবে যে ক্ষেত্রটি কোনও বিদেশী কী এর অংশ কিনা না (আরও জটিল)।

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