আমি কীভাবে প্যারামিটারাইজড সেলেক্ট ক্যোয়ারির জন্য PDO অবজেক্টটি সঠিকভাবে ব্যবহার করতে পারি


85

আমি SELECTকোয়েরি করার জন্য পিএইচপি.এন.এক্স. নির্দেশাবলী অনুসরণ করার চেষ্টা করেছি কিন্তু এটি করার বিষয়ে সবচেয়ে ভাল উপায় আমি নিশ্চিত নই।

ক্ষেত্রটি প্যারামিটারের সাথে মেলে এমন টেবিলে SELECTফিরে আসতে আমি প্যারামিটারাইজড ক্যোয়ারীটি ব্যবহার করতে চাই । এটি আবার ফিরে আসবে কারণ এটি অনন্য হবে।IDnameID

আমি তখন এটি অন্য টেবিলের IDজন্য ব্যবহার করতে চাই INSERT, সুতরাং এটি নির্ধারণ করা দরকার যে এটি সফল হয়েছে কি না।

আমি আরও পড়লাম যে আপনি পুনঃব্যবহারের জন্য প্রশ্নগুলি প্রস্তুত করতে পারেন তবে আমি নিশ্চিত ছিলাম না এটি কীভাবে সহায়তা করে।

উত্তর:


158

আপনি এই জাতীয় ডেটা নির্বাচন করুন:

$db = new PDO("...");
$statement = $db->prepare("select id from some_table where name = :name");
$statement->execute(array(':name' => "Jimbo"));
$row = $statement->fetch(); // Use fetchAll() if you want all results, or just iterate over the statement, since it implements Iterator

আপনি একইভাবে sertোকান:

$statement = $db->prepare("insert into some_other_table (some_id) values (:some_id)");
$statement->execute(array(':some_id' => $row['id']));

আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি ত্রুটি থেকে ব্যতিক্রম ছুঁড়তে PDO কনফিগার করুন। তারপরে PDOExceptionআপনার প্রশ্নের কোনওটি ব্যর্থ হলে আপনি একটি পেয়ে যাবেন - স্পষ্টভাবে চেক করার প্রয়োজন নেই। ব্যতিক্রমগুলি চালু করতে, আপনি $dbঅবজেক্টটি তৈরি করার ঠিক পরে এটিকে কল করুন :

$db = new PDO("...");
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

আমি ধরে নিলাম আপনার PDOStatement বলতে যেখানে নতুন PDO (...) আছে, তাই না?
জো ফিলিপস

4
না পিডিও হ'ল সংযোগ-শ্রেণি (পরিবর্তে সম্ভবত পিডো সংযোগের নামকরণ করা উচিত ছিল)। সংযোগটি পডোস্টেটমেন্টস তৈরি করতে পারে। আপনি সংযোগ অবজেক্টে setAttribute () কল করুন - স্বতন্ত্র বিবৃতি নয়। (বিকল্পভাবে, আপনি এটি কনস্ট্রাক্টরের কাছে পাস করতে পারেন)
ট্রয়স্কেন

4
এটি কার্যকর হতে পারে:$db = new PDO('mysql:dbname=your_database;host=localhost', 'junior', '444');
জুনিয়র মেহেé

4
লাইনের জন্য $statement->execute(array(':name' => "Jimbo"));, আপনি জিম্বো অংশটি ব্যাখ্যা করতে পারেন?
muttley91

4
@rar পূর্ববর্তী লাইনে ক্যোয়ারী একটি স্থানধারক দিয়ে শুরু করা হয়েছিল :nameexecuteপ্লেসোল্ডার -> মান জোড়গুলির একটি মিশুক অ্যারে দিয়ে এখানে কল করা হয়। সুতরাং এই ক্ষেত্রে, :nameস্থানধারকটি স্ট্রিং জিম্বোর সাথে প্রতিস্থাপন করা হবে। মনে রাখবেন যে এটি কেবল স্ট্রিং-রিপ্লেসমই করছে না, কারণ মানটি পালিয়ে গেছে বা প্রকৃত ক্যোয়ারী থেকে অন্য কোনও চ্যানেলের মাধ্যমে প্রেরণ করা হয়েছে, সুতরাং এটি কোনও ধরণের ইনজেকশনের আক্রমণকে প্রতিরোধ করে।
আফ্রোস্কেন

16

আমি পিডিওর সাথে ইদানীং কাজ করছি এবং উপরের উত্তরটি সম্পূর্ণ সঠিক, তবে আমি কেবল নথিটি চেয়েছিলাম যে নিম্নলিখিতটিও কাজ করে।

$nametosearch = "Tobias";
$conn = new PDO("server", "username", "password");
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sth = $conn->prepare("SELECT `id` from `tablename` WHERE `name` = :name");
$sth->bindParam(':name', $nametosearch);
// Or sth->bindParam(':name', $_POST['namefromform']); depending on application
$sth->execute();

16
না, এটি হয় না, কারণ আপনি কোন ডাটাবেস ব্যবহার করবেন তা নির্বাচন করেন নি।
রাপলি অ্যান্ড্রেস

4
এটি প্রকৃতপক্ষে "সার্ভার" স্ট্রিংয়ে থাকা উচিত যা "{ড্রাইভার b: dbname = {db_name}; হোস্ট = {সার্ভার connection" আকারে ডিএসএন হওয়া উচিত যা আপনার সংযোগের যা প্রয়োজন তা দিয়ে প্রতিস্থাপন করুন
thorne51

12

আপনি আপনার বিবৃতি প্রস্তুত করতে সহায়তা করতে bindParamবা bindValueপদ্ধতিগুলি ব্যবহার করতে পারেন । এটি জিনিস না করে প্রথম দর্শনে আরও স্পষ্ট করে তোলে$check->execute(array(':name' => $name)); বিশেষত আপনি যদি একাধিক মান / ভেরিয়েবলকে বাধ্য করেন।

নীচে পরিষ্কার, পড়া সহজ উদাহরণ পরীক্ষা করুন:

$q = $db->prepare("SELECT id FROM table WHERE forename = :forename and surname = :surname LIMIT 1");
$q->bindValue(':forename', 'Joe');
$q->bindValue(':surname',  'Bloggs');
$q->execute();

if ($q->rowCount() > 0){
    $check = $q->fetch(PDO::FETCH_ASSOC);
    $row_id = $check['id'];
    // do something
}

আপনি যদি একাধিক সারি আশা করে থাকেন তবে LIMIT 1এনে আনার পদ্ধতিটি এতে সরিয়ে ফেলুন fetchAll:

$q = $db->prepare("SELECT id FROM table WHERE forename = :forename and surname = :surname");// removed limit 1
$q->bindValue(':forename', 'Joe');
$q->bindValue(':surname',  'Bloggs');
$q->execute();

if ($q->rowCount() > 0){
    $check = $q->fetchAll(PDO::FETCH_ASSOC);
    //$check will now hold an array of returned rows. 
    //let's say we need the second result, i.e. index of 1
    $row_id = $check[1]['id']; 
    // do something
}

নিশ্চিত না. আমার কাছে একটি বৈধ উত্তরের মতো মনে হচ্ছে। আমি মনে করি এটি 'নামের পরিবর্তে' আমার নাম 'ব্যবহার করে এবং কেবল একটির পরিবর্তে একাধিক প্যারাম ব্যবহার করে উপকৃত হবে।
জো ফিলিপস

@ গিলিয়ানলওং কি করবে $check = $q->fetch(PDO::FETCH_ASSOC); if (!empty($check)){ $row_id = $check['id']; // do something }?
আব্দুল

4
হাই @ আবদুল, আমি অ্যারেতে গণনা / খালি চেকটি প্রতিস্থাপন করেছি। কোনও ফলাফল ফিরে এসেছে কিনা তা দেখার কথা ছিল। তবে পিডিরও একটি ক্রোমকাউন্ট () নামে একটি ফাংশন রয়েছে যা আপনাকে পরীক্ষা করতে দেয় যে কোনও সারিটি আদৌ আক্রান্ত হয়েছে / আনা হয়েছে কিনা। আপনি যদি কোনও সারি নির্বাচন করা হয়েছে কিনা তা জানেন না তবে ডেটা আনার কোনও মানে নেই, তাই আমি ফেচ স্টেটমেন্টটি যদি রাউকাউন্ট () বিবৃতিতে সরিয়ে নিয়েছি। :)
গিলি

@ গিলিয়ান লা ওওং একাধিক যেখানে ক্যোয়ারির জন্য বাইন্ডওয়ালু পরিষ্কার করার জন্য ধন্যবাদ query আমার প্রকল্প বাঁচাতে।
পিএইচপি-কোডার

6

একটি লিটল বিট সম্পূর্ণ উত্তর এখানে ব্যবহারের জন্য সমস্ত প্রস্তুত রয়েছে:

    $sql = "SELECT `username` FROM `users` WHERE `id` = :id";
    $q = $dbh->prepare($sql);
    $q->execute(array(':id' => "4"));
    $done= $q->fetch();

 echo $done[0];

এখানে $dbhPDO ডিবি connecter, এবং ভিত্তিক হয় idটেবিল থেকে usersআমরা পেতে করেছি usernameব্যবহারfetch();

আমি আশা করি এটি কাউকে সাহায্য করবে, উপভোগ করুন!


অথবা প্রয়োজনীয়তা fetchColumn()এড়াতে ব্যবহার করুন [0]। এছাড়াও, LIMIT 1এসকিউএল ব্যবহার করতে ভুলবেন না।
rybo111

3

পদ্ধতি 1: PDO ক্যোয়ারী পদ্ধতি ব্যবহার করুন

$stmt = $db->query('SELECT id FROM Employee where name ="'.$name.'"');
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);

সারি গণনা করা হচ্ছে

$stmt = $db->query('SELECT id FROM Employee where name ="'.$name.'"');
$row_count = $stmt->rowCount();
echo $row_count.' rows selected';

পদ্ধতি 2: পরামিতিগুলির সাথে বিবৃতি

$stmt = $db->prepare("SELECT id FROM Employee WHERE name=?");
$stmt->execute(array($name));
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

পদ্ধতি 3: বাঁধাই পরামিতি

$stmt = $db->prepare("SELECT id FROM Employee WHERE name=?");
$stmt->bindValue(1, $name, PDO::PARAM_STR);
$stmt->execute();
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

**bind with named parameters**
$stmt = $db->prepare("SELECT id FROM Employee WHERE name=:name");
$stmt->bindValue(':name', $name, PDO::PARAM_STR);
$stmt->execute();
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

or
$stmt = $db->prepare("SELECT id FROM Employee WHERE name=:name");
$stmt->execute(array(':name' => $name));
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

এই লিঙ্কটি আরও দেখুন জানতে চান


4
দয়া করে পদ্ধতি 1 সরান It এটি মাইএসকিএল ইঞ্জেকশন দেয়।
টোমাহক

-2

যদি আপনি একক পৃষ্ঠায় ইনলাইন কোডিং ব্যবহার করছেন এবং এই পুরো উদাহরণটির চেয়ে উফ ব্যবহার করছেন না তবে এটি অবশ্যই সহায়তা করবে

//connect to the db
$dbh = new PDO('mysql:host=localhost;dbname=mydb', dbuser, dbpw); 

//build the query
$query="SELECT field1, field2
FROM ubertable
WHERE field1 > 6969";

//execute the query
$data = $dbh->query($query);
//convert result resource to array
$result = $data->fetchAll(PDO::FETCH_ASSOC);

//view the entire array (for testing)
print_r($result);

//display array elements
foreach($result as $output) {
echo output[field1] . " " . output[field1] . "<br />";
}

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

সুতরাং আমার কী এটি মুছে ফেলা উচিত
শিব সিং

না, ঠিক বিপরীত। আমি নিম্ন মানের পোস্টের সারিতে এই পোস্টটি জুড়ে এসেছি এবং তাই আমার মন্তব্যের শেষ অংশটি ছিল লোকজনকে মুছে ফেলার জন্য ভোট না দেওয়ার কথা। (পরিবর্তে ডাউনভোট করার পরামর্শটি ছিল অস্থায়ী ডাউনভোটগুলি প্রম্পট করার উদ্দেশ্যে, যা আপনার পোস্টটি সম্পাদনার পরে মুছে ফেলা হবে।) আমার আগের মন্তব্যে যেমন উল্লেখ করা হয়েছে, আপনি যে কোডটি করেছিলেন সেটির জন্য কেন আপনি কোনও ব্যাখ্যা যুক্ত করলে ভাল হবে? । এছাড়াও, এই প্রশ্নটি প্যারামিটারাইজড কোয়েরি সম্পর্কে জিজ্ঞাসা করে, তবে field > 6969প্যারামিটারাইজডের চেয়ে হার্ড-কোডেড দেখাচ্ছে।
স্কট ওয়েলডন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.