পিএইচপি মাইএসকিউএলে কানেক্ট করার জন্য তিনটি আলাদা এপিআই সরবরাহ করে। এগুলি mysql
হ'ল (পিএইচপি 7 হিসাবে সরানো) mysqli
, এবং PDO
এক্সটেনশনগুলি।
mysql_*
ফাংশন খুব জনপ্রিয় ব্যবহার করা হয়, কিন্তু তাদের ব্যবহার আর উৎসাহিত করা হয় না। ডকুমেন্টেশন দলটি ডাটাবেস সুরক্ষার পরিস্থিতি নিয়ে আলোচনা করছে এবং ব্যবহারকারীদের সাধারণভাবে ব্যবহৃত এক্সট্রা / মাইএসকিএল এক্সটেনশান থেকে দূরে সরে যেতে শিক্ষিত করছে এটির একটি অংশ ( php.internals দেখুন: ext / mysql হ্রাস করা )।
এবং পরবর্তী পিএইচপি বিকাশকারী দল E_DEPRECATED
ব্যবহারকারীরা মাইএসকিউএলে সংযুক্ত হওয়ার পরে mysql_connect()
, mysql_pconnect()
বা অন্তর্নিহিত সংযোগ কার্যকারিতা কার্যকর করার সময় ত্রুটিগুলি তৈরি করার সিদ্ধান্ত নিয়েছে ext/mysql
।
ext/mysql
পিএইচপি 5.5 হিসাবে সরকারীভাবে অবচিত হয়েছিল এবং পিএইচপি 7 হিসাবে সরানো হয়েছে ।
রেড বক্সটি দেখুন?
আপনি যখন কোনও mysql_*
ফাংশন ম্যানুয়াল পৃষ্ঠায় যান, আপনি একটি লাল বাক্স দেখতে পাবেন, এটি ব্যাখ্যা করে যে এটি আর ব্যবহার করা উচিত নয়।
কেন
এখান থেকে সরে যাওয়া ext/mysql
কেবল সুরক্ষা সম্পর্কে নয়, মাইএসকিউএল ডাটাবেসের সমস্ত বৈশিষ্ট্যে অ্যাক্সেস পাওয়ার বিষয়েও।
ext/mysql
মাইএসকিউএল ৩.২৩ এর জন্য নির্মিত হয়েছিল এবং তখন থেকে কেবলমাত্র খুব কম সংযোজন হয়েছে যখন বেশিরভাগই এই পুরানো সংস্করণটির সাথে সামঞ্জস্য রেখে যা কোড বজায় রাখা কিছুটা কঠিন করে তোলে। অনুপস্থিত বৈশিষ্ট্যগুলি যা সমর্থন করে না ext/mysql
সেগুলির মধ্যে রয়েছে: ( পিএইচপি ম্যানুয়াল থেকে )।
mysql_*
ফাংশন ব্যবহার না করার কারণ :
- সক্রিয় বিকাশের অধীনে নয়
- পিএইচপি 7 হিসাবে সরানো হয়েছে
- একটি ওও ইন্টারফেসের অভাব রয়েছে
- অ-ব্লকিং, অ্যাসিনক্রোনাস অনুসন্ধানগুলিকে সমর্থন করে না
- প্রস্তুত বিবৃতি বা প্যারামিটারাইজড কোয়েরি সমর্থন করে না
- সঞ্চিত পদ্ধতিগুলি সমর্থন করে না
- একাধিক বিবৃতি সমর্থন করে না
- লেনদেন সমর্থন করে না
- মাইএসকিউএল 5.1 এর সমস্ত কার্যকারিতা সমর্থন করে না
উপরের পয়েন্টটি কোয়ান্টিনের উত্তর থেকে উদ্ধৃত হয়েছে
প্রস্তুত বিবৃতিগুলির সমর্থনের অভাব বিশেষত গুরুত্বপূর্ণ কারণ এগুলি পৃথক ফাংশন কলের সাহায্যে ম্যানুয়ালি এড়িয়ে যাওয়ার চেয়ে বাহ্যিক ডেটা থেকে বেরিয়ে আসার এবং উদ্ধৃত করার কম ত্রুটিযুক্ত প্রবণ পদ্ধতি provide
এসকিউএল এক্সটেনশনের তুলনা দেখুন ।
অবমূল্যায়ন সতর্কতা দমন করা
কোডে রূপান্তরিত হচ্ছে যদিও MySQLi
/ PDO
, E_DEPRECATED
সেটিং দ্বারা ত্রুটি দমন করা যাবে error_reporting
মধ্যে php.ini বাদ দেওয়ারE_DEPRECATED:
error_reporting = E_ALL ^ E_DEPRECATED
নোট করুন যে এটি অন্যান্য অবমূল্যায়ন সতর্কতাগুলিও আড়াল করবে , যা মাইএসকিউএল ব্যতীত অন্য কিছুর জন্য হতে পারে। ( পিএইচপি ম্যানুয়াল থেকে )
পিডিও বনাম মাইএসকিউএল নিবন্ধ : আপনার কোনটি ব্যবহার করা উচিত? দ্বারা Dejan Marjanovic আপনি নির্বাচন করতে সাহায্য করবে।
এবং আরও ভাল উপায় PDO
, এবং আমি এখন একটি সহজ PDO
টিউটোরিয়াল লিখছি ।
একটি সাধারণ এবং সংক্ষিপ্ত পিডিও টিউটোরিয়াল
প্র: আমার মনে প্রথম প্রশ্ন ছিল: `পিডিও` কী?
উ: " পিডিও - পিএইচপি ডেটা অবজেক্টস - একাধিক ডাটাবেসে অ্যাক্সেসের একটি অভিন্ন পদ্ধতি সরবরাহ করে এমন একটি ডাটাবেস অ্যাক্সেস স্তর।"

মাইএসকিউএলে সংযুক্ত হচ্ছে
সঙ্গে mysql_*
ফাংশন অথবা আমরা এটা বলতে পারি পুরাতন পথ (থামানো হয়েছে পিএইচপি 5.5 এবং পরবর্তী)
$link = mysql_connect('localhost', 'user', 'pass');
mysql_select_db('testdb', $link);
mysql_set_charset('UTF-8', $link);
সহ PDO
: আপনাকে যা করতে হবে তা হ'ল একটি নতুন PDO
অবজেক্ট তৈরি করা । কন্সট্রাকটর ডাটাবেসের উৎস উল্লেখ জন্য প্যারামিটার স্বীকার করে PDO
এর কন্সট্রাকটর বেশিরভাগই চার পরামিতি, যা হয় লাগে DSN
(তথ্য উৎস নাম) এবং ঐচ্ছিকরূপে username
, password
।
এখানে আমি মনে করি আপনি ব্যতীত সকলের সাথে পরিচিত DSN
; এটি নতুন PDO
। এ DSN
মূলত বিকল্পগুলির একটি স্ট্রিং PDO
যা কোন ড্রাইভারটি ব্যবহার করতে হবে এবং সংযোগের বিশদটি জানায়। আরও রেফারেন্সের জন্য, PDO মাইএসকিউএল ডিএসএন পরীক্ষা করুন ।
$db = new PDO('mysql:host=localhost;dbname=testdb;charset=utf8', 'username', 'password');
দ্রষ্টব্য: আপনি এটিও ব্যবহার করতে পারেন charset=UTF-8
তবে কখনও কখনও এটি ত্রুটির কারণ হয়ে থাকে তাই এটি ব্যবহার করা আরও ভাল utf8
।
যদি কোনও সংযোগ ত্রুটি থাকে তবে এটি এমন একটি PDOException
বস্তু ছুঁড়ে দেবে যা Exception
আরও হ্যান্ডেল করার জন্য ধরা পড়ে ।
ভাল পড়ুন : সংযোগ এবং সংযোগ ব্যবস্থাপনা ¶
আপনি চতুর্থ প্যারামিটারের অ্যারে হিসাবে কয়েকটি ড্রাইভার বিকল্পেও যেতে পারেন। আমি পরামিতিটি পাস করার পরামর্শ দিচ্ছি যা PDO
ব্যতিক্রম মোডে রাখে । কারণ কিছু PDO
ড্রাইভার দেশীয় প্রস্তুত বিবৃতি সমর্থন করে না, তাই PDO
প্রস্তুতের অনুকরণ করে। এটি আপনাকে ম্যানুয়ালি এই অনুকরণটি সক্ষম করতে দেয়। নেটিভ সার্ভার-সাইড প্রস্তুত বিবৃতিগুলি ব্যবহার করতে, আপনার এটি স্পষ্টভাবে সেট করা উচিত false
।
অন্যটি হ'ল প্রস্তুত এমুলেশনটি বন্ধ করা যা MySQL
ডিফল্টরূপে ড্রাইভারে সক্ষম হয় , তবে প্রস্তুত এমুলেশনটি PDO
নিরাপদে ব্যবহারের জন্য বন্ধ করা উচিত ।
আমি পরে ব্যাখ্যা করব কেন প্রস্তুত এমুলেশন বন্ধ করা উচিত। কারণ খুঁজে পেতে এই পোস্টটি দেখুন ।
এটি কেবলমাত্র তখনই ব্যবহারযোগ্য যদি আপনি কোনও পুরানো সংস্করণ ব্যবহার করেন MySQL
যা এর প্রস্তাবিত নয়।
আপনি কীভাবে এটি করতে পারেন তার উদাহরণ নীচে দেওয়া হল:
$db = new PDO('mysql:host=localhost;dbname=testdb;charset=UTF-8',
'username',
'password',
array(PDO::ATTR_EMULATE_PREPARES => false,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
আমরা PDO নির্মাণের পরে বৈশিষ্ট্যগুলি সেট করতে পারি?
হ্যাঁ , আমরা setAttribute
পদ্ধতিটি সহ PDO নির্মাণের পরে কিছু বৈশিষ্ট্যও সেট করতে পারি :
$db = new PDO('mysql:host=localhost;dbname=testdb;charset=UTF-8',
'username',
'password');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
ত্রুটি পরিচালনা
ত্রুটি পরিচালনা অনেক সহজ PDO
তুলনায় mysql_*
।
ব্যবহার করার সময় একটি সাধারণ অনুশীলন mysql_*
হ'ল:
//Connected to MySQL
$result = mysql_query("SELECT * FROM table", $link) or die(mysql_error($link));
OR die()
ত্রুটিটি হ্যান্ডেল করার কোনও ভাল উপায় নয় যেহেতু আমরা জিনিসটি হ্যান্ডেল করতে পারি না die
। এটি স্ক্রিপ্টটি আকস্মিকভাবে শেষ করবে এবং তারপরে স্ক্রিনটিতে ত্রুটিটি প্রতিধ্বনিত করবে যা আপনি সাধারণত আপনার শেষ ব্যবহারকারীদের কাছে দেখাতে চান না এবং রক্তাক্ত হ্যাকারদের আপনার স্কিমাটি আবিষ্কার করতে দেয়। পর্যায়ক্রমে, mysql_*
ফাংশনগুলির রিটার্ন মানগুলি ত্রুটিগুলি পরিচালনা করতে প্রায়ই mysql_error () এর সাথে ব্যবহার করা যেতে পারে ।
PDO
একটি ভাল সমাধান প্রস্তাব: ব্যতিক্রম। আমরা যা কিছু করি তা PDO
একটি try
- catch
ব্লকে মোড়ানো উচিত । PDO
ত্রুটি মোডের বৈশিষ্ট্যটি সেট করে আমরা তিনটি ত্রুটি মোডের মধ্যে একটিতে জোর করতে পারি । তিনটি ত্রুটি পরিচালনার মোড নীচে রয়েছে।
PDO::ERRMODE_SILENT
। এটি কেবল ত্রুটি কোডগুলি সেট করে এবং বেশ কয়েকটি একইরূপে কাজ করে mysql_*
যেখানে আপনাকে অবশ্যই প্রতিটি ফলাফল যাচাই করতে হবে এবং তারপরে $db->errorInfo();
ত্রুটির বিশদটি পেতে দেখুন।
PDO::ERRMODE_WARNING
উত্থাপন E_WARNING
। (রান-টাইম সতর্কতা (অ-মারাত্মক ত্রুটি) the স্ক্রিপ্ট কার্যকর করা থামেনি))
PDO::ERRMODE_EXCEPTION
: ব্যতিক্রম নিক্ষেপ। এটি PDO দ্বারা উত্থাপিত একটি ত্রুটি উপস্থাপন করে। PDOException
আপনার নিজের কোড থেকে একটি নিক্ষেপ করা উচিত নয় । পিএইচপি-তে ব্যতিক্রম সম্পর্কে আরও তথ্যের জন্য ব্যতিক্রমগুলি দেখুন । এটি খুব বেশি কাজ করে or die(mysql_error());
, যখন এটি ধরা পড়ে না। তবে এর বিপরীতে or die()
, PDOException
যদি আপনি এটি করা বেছে নেন তবে ক্যাপটিকে গ্রেপ্তার করে হ্যান্ডল করা যায়।
ভাল পড়া :
ভালো লেগেছে:
$stmt->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT );
$stmt->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING );
$stmt->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
এবং আপনি এটিকে মোড়ানো করতে পারেন try
- catch
নীচের মত:
try {
//Connect as appropriate as above
$db->query('hi'); //Invalid query!
}
catch (PDOException $ex) {
echo "An Error occured!"; //User friendly message/message you want to show to user
some_logging_function($ex->getMessage());
}
আপনার সাথে হ্যান্ডেল করতে হবে না try
- catch
এখনি। আপনি যে কোনও সময় এটি উপযুক্ত ধরতে পারেন তবে আমি আপনাকে দৃ strongly়ভাবে ব্যবহার করার পরামর্শ দিচ্ছি try
- catch
। এছাড়াও স্টাফগুলিকে কল করে এমন ফাংশনের বাইরে এটি ধরা আরও অর্থবোধ করতে পারে PDO
:
function data_fun($db) {
$stmt = $db->query("SELECT * FROM table");
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
//Then later
try {
data_fun($db);
}
catch(PDOException $ex) {
//Here you can handle error and show message/perform action you want.
}
এছাড়াও, আপনি এটি পরিচালনা করতে পারেন or die()
বা আমরা যেমন বলতে পারি mysql_*
, তবে এটি সত্যই বৈচিত্র্যযুক্ত হবে। আপনি উত্পাদন করতে বিপজ্জনক ত্রুটি বার্তাগুলি আড়াল করতে পারেন display_errors off
এবং কেবল আপনার ত্রুটি লগটি পড়ে।
এখন, উপরে সবকিছুর পড়ার পর, আপনি সম্ভবত চিন্তা করা হয় কি নরক হল যে যখন আমি শুধু সহজ পক্ষপাতী শুরু করতে চান SELECT
, INSERT
, UPDATE
, অথবা DELETE
বিবৃতি? চিন্তা করবেন না, আমরা এখানে যাচ্ছি:
ডেটা নির্বাচন করা হচ্ছে

সুতরাং আপনি যা করছেন তা mysql_*
হ'ল:
<?php
$result = mysql_query('SELECT * from table') or die(mysql_error());
$num_rows = mysql_num_rows($result);
while($row = mysql_fetch_assoc($result)) {
echo $row['field1'];
}
এখন PDO
, আপনি এটি এর মতো করতে পারেন:
<?php
$stmt = $db->query('SELECT * FROM table');
while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
echo $row['field1'];
}
অথবা
<?php
$stmt = $db->query('SELECT * FROM table');
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
//Use $results
দ্রষ্টব্য : আপনি যদি নীচের ( query()
) এর মতো পদ্ধতিটি ব্যবহার করে থাকেন তবে এই পদ্ধতিটি কোনও PDOStatement
অবজেক্ট ফেরত দেয় । সুতরাং আপনি যদি ফলাফলটি পেতে চান তবে উপরের মতো ব্যবহার করুন।
<?php
foreach($db->query('SELECT * FROM table') as $row) {
echo $row['field1'];
}
পিডিও ডেটাতে এটি ->fetch()
আপনার স্টেটমেন্ট হ্যান্ডেলের একটি পদ্ধতির মাধ্যমে প্রাপ্ত হয় । আনতে কল করার আগে, সেরা পদ্ধতিটি PDO কে বলবে যে আপনি কীভাবে ডেটা আনতে চান। নীচের বিভাগে আমি এটি ব্যাখ্যা করছি।
মোডগুলি আনুন
উল্লেখ্য ব্যবহার PDO::FETCH_ASSOC
মধ্যে fetch()
এবং fetchAll()
উপরে কোড। এটি PDO
কি হিসাবে ক্ষেত্রের নামগুলি সহ একসেসিয়েটিভ অ্যারে হিসাবে সারিগুলি ফিরিয়ে আনতে বলে । আরও অনেক আনতে মোড রয়েছে যা আমি একে একে ব্যাখ্যা করব।
প্রথমত, আমি কীভাবে আনতে হবে মোডটি নির্বাচন করবেন তা ব্যাখ্যা করছি:
$stmt->fetch(PDO::FETCH_ASSOC)
উপরের দিকে, আমি ব্যবহার করা হয়েছে fetch()
। আপনি এটি ব্যবহার করতে পারেন:
এখন আমি আনতে মোডে:
PDO::FETCH_ASSOC
: আপনার ফলাফলের সেটটিতে ফিরে আসার সাথে কলামের নাম অনুসারে একটি অ্যারে সূচিত করে
PDO::FETCH_BOTH
(ডিফল্ট): আপনার ফলাফলের সেটে প্রত্যাবর্তিত কলামের নাম এবং 0-সূচী কলাম নম্বর উভয় দ্বারা সূচকযুক্ত একটি অ্যারে প্রদান করে
আরও পছন্দ আছে! এগুলি সম্পর্কে PDOStatement
ড্যাচুয়েশন আনুন। ।
সারি গণনা পাওয়া :
mysql_num_rows
প্রত্যাবর্তিত সারিগুলির সংখ্যা পেতে ব্যবহার করার পরিবর্তে , আপনি একটি PDOStatement
এবং করতে rowCount()
পারেন যেমন:
<?php
$stmt = $db->query('SELECT * FROM table');
$row_count = $stmt->rowCount();
echo $row_count.' rows selected';
সর্বশেষ sertedোকানো আইডি পাচ্ছি
<?php
$result = $db->exec("INSERT INTO table(firstname, lastname) VAULES('John', 'Doe')");
$insertId = $db->lastInsertId();
Sertোকান এবং আপডেট করুন বা বিবৃতি মুছুন

আমরা mysql_*
ফাংশনে যা করছি তা হ'ল:
<?php
$results = mysql_query("UPDATE table SET field='value'") or die(mysql_error());
echo mysql_affected_rows($result);
এবং পিডোতে, এই একই জিনিসটি দ্বারা করা যেতে পারে:
<?php
$affected_rows = $db->exec("UPDATE table SET field='value'");
echo $affected_rows;
উপরের ক্যোয়ারিতে PDO::exec
একটি এসকিউএল বিবৃতি কার্যকর করুন এবং প্রভাবিত সারিগুলির সংখ্যা প্রদান করে।
সন্নিবেশ এবং মুছুন পরে আচ্ছাদিত করা হবে।
উপরের পদ্ধতিটি কেবল তখনই কার্যকর যখন আপনি কোয়েরিতে ভেরিয়েবল ব্যবহার করছেন না। তবে যখন আপনাকে কোনও ক্যোয়ারিতে একটি ভেরিয়েবল ব্যবহার করার দরকার হয়, কখনও কখনও উপরের মতো চেষ্টা করে নেবেন না এবং প্রস্তুত বিবৃতি বা প্যারামিটারাইজড স্টেটমেন্টটি রয়েছে।
বিবৃতি প্রস্তুত
প্র: প্রস্তুত বিবৃতি কী এবং আমার এগুলি কেন দরকার?
উ: প্রস্তুত বিবৃতিটি একটি পূর্ব-সংকলিত এসকিউএল বিবৃতি যা কেবলমাত্র সার্ভারে ডেটা প্রেরণ করে একাধিকবার কার্যকর করা যায়।
একটি প্রস্তুত বিবৃতি ব্যবহারের সাধারণ কর্মপ্রবাহটি নিম্নরূপ ( উইকিপিডিয়া থেকে তিনটি 3 দফায় উদ্ধৃত ):
প্রস্তুত করুন : বিবৃতি টেম্পলেটটি অ্যাপ্লিকেশন দ্বারা তৈরি করা হয়েছে এবং ডাটাবেস ম্যানেজমেন্ট সিস্টেমে (ডিবিএমএস) প্রেরণ করা হয়। নির্দিষ্ট মানগুলিকে অনির্ধারিত রেখে দেওয়া হয়, যাকে বলা হয় প্যারামিটার, স্থানধারক বা বাইন্ড ভেরিয়েবল ( ?
নীচে লেবেলযুক্ত ):
INSERT INTO PRODUCT (name, price) VALUES (?, ?)
ডিবিএমএস বিবৃতি টেমপ্লেটে কোয়েরি অপ্টিমাইজেশনকে বিশ্লেষণ, সংকলন এবং সম্পাদন করে এবং ফলাফলটি কার্যকর না করেই সঞ্চয় করে।
- সম্পাদন করুন : পরবর্তী সময়ে, অ্যাপ্লিকেশন প্যারামিটারগুলির জন্য মান সরবরাহ করে (বা বাঁধাই করে), এবং ডিবিএমএস বিবৃতি কার্যকর করে (সম্ভবত কোনও ফল প্রত্যাবর্তন করে)। অ্যাপ্লিকেশনটি বিভিন্ন মানের সাথে যতবার চায় বিবৃতি কার্যকর করতে পারে। এই উদাহরণস্বরূপ, এটি প্রথম প্যারামিটার এবং
1.00
দ্বিতীয় প্যারামিটারের জন্য 'ব্রেড' সরবরাহ করতে পারে ।
আপনি আপনার এসকিউএলে স্থানধারীদের অন্তর্ভুক্ত করে একটি প্রস্তুত বিবৃতি ব্যবহার করতে পারেন। স্থানধারক ব্যতীত মূলত তিনটি রয়েছে (এর উপরের একের সাথে ভেরিয়েবল দিয়ে এটি ব্যবহার করে দেখুন না) একটি, নামবিহীন স্থানধারক এবং অন্য একটি নামধারক স্থানধারক।
প্র। সুতরাং এখন, স্থানধারীদের নাম কী এবং আমি কীভাবে সেগুলি ব্যবহার করব?
উ: নামধারক স্থানধারক। প্রশ্ন চিহ্নের পরিবর্তে কোলন দ্বারা বর্ণিত বর্ণনামূলক নামগুলি ব্যবহার করুন। আমরা নাম স্থান ধারক স্থানে / মান ক্রম সম্পর্কে যত্ন নেই:
$stmt->bindParam(':bla', $bla);
bindParam(parameter,variable,data_type,length,driver_options)
আপনি একটি এক্সিকিউটিট অ্যারে ব্যবহার করেও আবদ্ধ করতে পারেন:
<?php
$stmt = $db->prepare("SELECT * FROM table WHERE id=:id AND name=:name");
$stmt->execute(array(':name' => $name, ':id' => $id));
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
OOP
বন্ধুদের জন্য আর একটি দুর্দান্ত বৈশিষ্ট্য হ'ল নামযুক্ত স্থানধারকগণ নামকৃত ক্ষেত্রগুলির সাথে সম্পর্কিত বৈশিষ্ট্যগুলি ধরে রেখে ধরে নিবেন যে সরাসরি আপনার ডাটাবেসে বস্তুগুলি সন্নিবেশ করানোর ক্ষমতা থাকে। উদাহরণ স্বরূপ:
class person {
public $name;
public $add;
function __construct($a,$b) {
$this->name = $a;
$this->add = $b;
}
}
$demo = new person('john','29 bla district');
$stmt = $db->prepare("INSERT INTO table (name, add) value (:name, :add)");
$stmt->execute((array)$demo);
প্র। এখন, নামবিহীন স্থানধারকগুলি কী এবং আমি কীভাবে সেগুলি ব্যবহার করব?
উ : একটি উদাহরণ দেওয়া যাক:
<?php
$stmt = $db->prepare("INSERT INTO folks (name, add) values (?, ?)");
$stmt->bindValue(1, $name, PDO::PARAM_STR);
$stmt->bindValue(2, $add, PDO::PARAM_STR);
$stmt->execute();
এবং
$stmt = $db->prepare("INSERT INTO folks (name, add) values (?, ?)");
$stmt->execute(array('john', '29 bla district'));
উপরের অংশে, আপনি ?
নামের পরিবর্তে নামের স্থানের ধারকগুলির মতো নামগুলি দেখতে পারেন । এখন প্রথম উদাহরণে, আমরা বিভিন্ন স্থানধারকগুলিকে ( $stmt->bindValue(1, $name, PDO::PARAM_STR);
) পরিবর্তনশীল বরাদ্দ করি । তারপরে, আমরা সেই স্থানধারকদের মান নির্ধারণ করি এবং বিবৃতি কার্যকর করি। দ্বিতীয় উদাহরণে, প্রথম অ্যারের উপাদানটি প্রথমটিতে যায় ?
এবং দ্বিতীয়টিতে দ্বিতীয় যায় ?
।
দ্রষ্টব্য : নামবিহীন স্থানধারকগুলিতে আমাদের অ্যারেতে থাকা উপাদানগুলির যথাযথ ক্রমটির যত্ন নিতে হবে যে আমরা PDOStatement::execute()
পদ্ধতিতে চলেছি।
SELECT
, INSERT
, UPDATE
, DELETE
প্রস্তুত প্রশ্নের
SELECT
:
$stmt = $db->prepare("SELECT * FROM table WHERE id=:id AND name=:name");
$stmt->execute(array(':name' => $name, ':id' => $id));
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
INSERT
:
$stmt = $db->prepare("INSERT INTO table(field1,field2) VALUES(:field1,:field2)");
$stmt->execute(array(':field1' => $field1, ':field2' => $field2));
$affected_rows = $stmt->rowCount();
DELETE
:
$stmt = $db->prepare("DELETE FROM table WHERE id=:id");
$stmt->bindValue(':id', $id, PDO::PARAM_STR);
$stmt->execute();
$affected_rows = $stmt->rowCount();
UPDATE
:
$stmt = $db->prepare("UPDATE table SET name=? WHERE id=?");
$stmt->execute(array($name, $id));
$affected_rows = $stmt->rowCount();
বিঃদ্রঃ:
তবে PDO
এবং / অথবা MySQLi
সম্পূর্ণ নিরাপদ নয়। উত্তরটি দেখুন কি পিডিও এসকিউএল ইঞ্জেকশন প্রতিরোধের জন্য বিবৃতি প্রস্তুত রয়েছে? ircmaxell দ্বারা । এছাড়াও, আমি তার উত্তর থেকে কিছু অংশ উদ্ধৃত করছি:
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$pdo->query('SET NAMES GBK');
$stmt = $pdo->prepare("SELECT * FROM test WHERE name = ? LIMIT 1");
$stmt->execute(array(chr(0xbf) . chr(0x27) . " OR 1=1 /*"));