আমি কীভাবে একটি লাইক স্টেটমেন্ট দিয়ে PDO প্যারামিটারাইজড ক্যোয়ারী তৈরি করব?


107

এখানে আমার প্রচেষ্টা এখানে:

$query = $database->prepare('SELECT * FROM table WHERE column LIKE "?%"');

$query->execute(array('value'));

while ($results = $query->fetch()) 
{
    echo $results['column'];
}

উত্তর:


124

আমি পোস্ট করার পরে ঠিক তা বের করে দিয়েছি:

$query = $database->prepare('SELECT * FROM table WHERE column LIKE ?');
$query->execute(array('value%'));

while ($results = $query->fetch())
{
    echo $results['column'];
}

1
@ অ্যান্ড্রু: যদি একাধিক likeব্যবহার হয়? কীভাবে কার্যকর করতে হবে অ্যারের ক্রম কার্যকর করা?
লগান

ধন্যবাদ। সিশার্প + মাইএসকিএল + ওডিবিসি-তে একই জাতীয় সমস্যা রয়েছে যেমন এটি ব্যবহার করে "টেবিল থেকে" নির্বাচন করুন "যেখানে '%?%' এর মতো কলামটি ব্যবহার করে কোনও সারি ফিরে আসবে না;" তবে আমি কি যদি আপনার মতো করে করি তবে "কলামটি কাস্টম পছন্দ করে সেখানে টেবিল থেকে * নির্বাচন করুন?" এবং প্যারামিটার স্ট্রিংটি সেট করে: স্ট্রিং ফ্রং = $ "% {সার্চফ্রেগমেন্ট}%"; তারপরে প্যারামিটার মানের জন্য টুকরা ব্যবহার করুন। অদ্ভুত
sdjuan

2
এক্সিকিউটিভ কলটিতে পিডিও সেই% থেকে দূরে থাকা উচিত। কাকাইয়ের উত্তর আরও ভাল
পিটার বাগনাল

উল্লেখ্য যে, শীর্ষ মূল্য মনে হয় ব্যবহারকারীর অবদান নোট উপর PDOStatement :: bindParam ডকুমেন্টেশন পৃষ্ঠাটিতে এটা বাঁধাই সামনে পরিবর্তনশীল শতাংশ চিহ্ন (গুলি) যোগ করুন অফার একটি ভিন্ন পদ্ধতির।
ড্যান রবিনসন

এই থ্রেডের নীচে আপনার সাধারণ সেন্সের পৃষ্ঠা থেকে নেওয়া গ্যাভিনের সমাধানটি দেখুন। সহজ। লজিক্যাল।
RationalRabbit

85

নামযুক্ত প্যারামিটারগুলি ব্যবহার করার জন্য, মাইএসকিউএল ডাটাবেসের জন্য আংশিক মিলের LIKEসাথে কীভাবে ব্যবহার করবেন তা এখানে :%

যেখানে কলামের নাম কনক্যাট পছন্দ ('%', বিপজ্জনক স্ট্রিং, '%')

নামকরণ প্যারামিটার যেখানে :dangerousstring

অন্য কথায়, %আপনার নিজের ক্যোয়ারীতে স্পষ্টতভাবে অপরিবর্তিত চিহ্নগুলি ব্যবহার করুন যা পৃথক এবং অবশ্যই ব্যবহারকারী ইনপুট নয়।

সম্পাদনা করুন: ওরাকল ডাটাবেসের জন্য সংমিশ্রণ সিনট্যাক্স সংক্ষিপ্ত অপারেটর ব্যবহার করে: ||সুতরাং এটি কেবল হয়ে উঠবে:

কলামের নাম '%' পছন্দ করুন || : বিপজ্জনক স্ট্রিং || '%'

তবে @ ববিস এখানে উল্লেখ করেছেন যে সাবধানতা অবলম্বন করা হয়েছে :

অসুবিধা আসে যখন আপনি একটি আক্ষরিক অনুমতি দিতে চান %বা _এটি একটি ওয়াইল্ডকার্ড হিসাবে কাজ করেও, সার্চ স্ট্রিং অক্ষর।

সুতরাং পছন্দ এবং প্যারামিটারাইজেশন সংমিশ্রনের সময় এটি দেখার মতো অন্য কিছু।


6
+1 - এটি আমার কাছে একটি ভাল পদ্ধতির মতো বলে মনে হচ্ছে যেহেতু স্থানধারককে প্রতিস্থাপনের পরে ডেটাবেজে সমস্ত কনকেন্টেশন ঘটেছে, এবং এর অর্থ হল নামধারীদের ব্যবহার করা যেতে পারে। এটি উল্লেখ করার মতো যে উপরের সিনট্যাক্সটি ওরাকলের জন্য - মাইএসকিউএলে সিনট্যাক্সটি রয়েছে LIKE CONCAT('%', :something, '%')। তথ্যসূত্র: স্ট্যাকওভারফ্লো.com
অ্যারন নিউটন

1
এটি আমার পক্ষে ঠিক কাজ করে না, তবে আমাকে সঠিক পথে নিয়ে যায়। আমাকে লাইক '%' করতে হয়েছিল: এটির কাজ করার জন্য কিছু '%'।
ক্রিস্টোফার স্মিত

আমি জানি যে এটি অফ-টপিক তবে আমি এই স্টেটমেন্টটি ব্যবহার করেও এসকিএল ইঞ্জেকশনটি পেরফর্ম করতে সক্ষম হয়েছি, কেন?
থিয়াগো ডায়াস

এটি আমার পক্ষে কাজ করে না, আমি এসকিউএল কমান্ড দিয়েও এটি পরীক্ষা করেছিলাম এটি SELECT * FROM calculation WHERE ( email LIKE '%' || luza || '%' OR siteLocation LIKE '%'|| luza ||'%' OR company LIKE '%' ||luza ||'%' )আমাকে ত্রুটি দেয়।
লুজান বড়াল

@AaronNewton and it means named placeholders can be used। আপনি যখন পিএইচপি-তে সম্মতি জানায় তখন নামযুক্ত স্থানধারীদের কাছে এটি কীভাবে সমস্যা? আপনি যে কোনও ডাটাবেসের জন্য একই ক্যোয়ারীটি ব্যবহার করতে পারবেন বলে স্পষ্টতই পিএইচপি-তে সংক্ষিপ্ত নামকরণ এবং অবস্থানগত এবং আরও বহনযোগ্য উভয় সমর্থন করে। আমি সত্যই বুঝতে পারছি না যে এত লোক কেন মনে করে নামকরণ এবং অবস্থানিক স্থানধারীদের মধ্যে কোনও পার্থক্য রয়েছে।
আপনার সাধারণ জ্ঞান

18
$query = $database->prepare('SELECT * FROM table WHERE column LIKE ?');
$query->bindValue(1, "%$value%", PDO::PARAM_STR);
$query->execute();

if (!$query->rowCount() == 0) 
{
    while ($results = $query->fetch()) 
    {
        echo $results['column'] . "<br />\n";
    }       
} 
else 
{
    echo 'Nothing found';
}

1
গৃহীত উত্তরের উপর এটি ব্যবহারের কোনও সুবিধা আছে কি? bindValueইনজেকশন আক্রমণ থেকে রক্ষা ব্যবহার করে ? স্বীকৃত উত্তরটি মূলত পুরানো দিনের মধ্যে আপনার পছন্দগুলি পছন্দ ?করার জন্য অনুসন্ধান স্ট্রিংটিকে সম্মতি দিয়ে স্থানধারক ব্যবহারের মানটিকে %অবহেলা করে।
15:40 '

$ ক্যোয়ারী-> সার্কাউন্ট () == 0 এর আগে অবহেলা ব্যবহার করার কী লাভ? আসলেই কি তা বোঝা যায়?
ssi-anik

14

আপনি এটি চেষ্টা করতে পারেন। আমি একই সমস্যার মুখোমুখি হয়েছি তবে গবেষণার পরে ফলাফল পেয়েছি।

$query = $pdo_connection->prepare('SELECT * FROM table WHERE column LIKE :search');

$stmt= $pdo_connection->prepare($query);

$stmt->execute(array(':search' => '%'.$search_term.'%'));

$result = $stmt->fetchAll(PDO::FETCH_ASSOC);

print_r($result);

কোডটি একটি কোড ব্লকে রাখার জন্য আমি আপনার পোস্ট সম্পাদনা করেছি - আপনি স্ট্যাকওভারফ্লো . com/help/ formatting এ পোস্ট ফর্ম্যাটিং সম্পর্কে আরও পড়তে পারেন । অন্য কিছু ব্যবহারকারী কোনও মন্তব্য না করেই আপনার উত্তরটিকে নিম্নমান হিসাবে বেছে নিয়েছে, সুতরাং ডাউনভোটের কারণ সম্পর্কে আমি নিশ্চিত নই।
josliber

2
পুনরাবৃত্তি করতে, আমি আপনার প্রশ্নে ভোট দেয় নি; অন্য কাউকে বঞ্চিত
josliber

3

এইটা কাজ করে:

search `table` where `column` like concat('%', :column, '%')

2

আমি এই পিএইচপি বিভ্রান্তি থেকে পেয়েছি

$search = "%$search%";
$stmt  = $pdo->prepare("SELECT * FROM table WHERE name LIKE ?");
$stmt->execute([$search]);
$data = $stmt->fetchAll();

এবং এটি আমার পক্ষে খুব সহজ কাজ করে। যেমনটি তিনি বলেছেন, ক্যোয়ারিতে পাঠানোর আগে আপনাকে "আমাদের সম্পূর্ণ আক্ষরিক প্রথমে প্রস্তুত" করতে হবে


0

PDO "%" (SQL ইনজেকশন হয়ে উঠতে পারে) পালাতে : আগের কোডের ব্যবহার ইচ্ছা ফলাফল যখন আংশিক স্ট্রিং মেলে খুঁজছেন দেব কিন্তু কোন পরিদর্শক ধরনের চরিত্র "%" আপনি এখনও ফলাফল পেতে হবে এমনকি আপনি যদি ডন ' টি-তে ডেটা বেসে কিছু সংরক্ষণ করা নেই (এটি স্কোএল ইঞ্জেকশনে নেতৃত্ব দিতে পারে)

অভিন্ন অযাচিত / অব্যক্ত অনুসন্ধানের ফলাফলের পিডিও "%" রক্ষা করে একই ফলাফলের সাথে আমি অনেকগুলি ভিন্নতার চেষ্টা করেছি।

আমি যদিও এটি ভাগ করে নেওয়ার মতো ছিল যদি কেউ এর চারপাশে কোনও শব্দ খুঁজে পেয়ে থাকে তবে দয়া করে এটি ভাগ করুন


1
এই সহায়ক পুস্তিকা থেকে হল: us3.php.net/manual/en/pdo.prepared-statements.php এই যেখানে বিষয় সম্পর্কে অন্য একটা পোস্টে হল: stackoverflow.com/questions/22030451/... আমি owuld সত্যিই সম্পর্কে আপনার মতামত জানতে চান এই ইস্যু
ওজকার আর

1
সম্ভাব্য সমাধান (কোন পরীক্ষিত) ব্যবহার করুন CONCAT মত: $ SQL = "আইটেম থেকে ITEM_TITLE নির্বাচন যেখানে ITEM_TITLE এর মতো CONCAT ( '%', '%'?)"; তথ্যসূত্র: blog.mclaughlinsoftware.com/2010/02/21/php-binding-a-wilcard
ওজকার আর

3
পিডিও% রক্ষা পায় না। এটি আপনার কোড যা এটি ভুল করে। সমাধানের জন্য আপনাকে ইতিমধ্যে সরবরাহিত উত্তরগুলি পড়ার
আপনার সাধারণ অনুভূতি

আপনার পরামর্শের জন্য আপনাকে ধন্যবাদ। যাইহোক, পরীক্ষা করা কোডটি ম্যানুয়াল থেকে কোড ছিল, এসকিউএল ইনজেকশন এড়াতে স্থানধারক ব্যবহার করে, আমি এখনও একই ফলাফল পাচ্ছি উদাহরণ # 6 স্থানধারক পিডিওর অবৈধ ব্যবহার আমার কোড নয়, উপরের কোডটি ব্যবহার করে পালাতে পারে%। আমি ফোরামে নতুন এবং মন্তব্য, পোস্ট এবং খ্যাতির প্রক্রিয়াটি এখানে কীভাবে কাজ করে তা আমি বুঝতে পারি না, আমি এটি আমার পরবর্তীটির জন্য মনে রাখব, কারণ পূর্ববর্তী মন্তব্যের ভিত্তিতে অন্যকে সাহায্য করার জন্য বা মন্তব্য করার জন্য আপনার খ্যাতি দরকার। ধন্যবাদ।
ওজকার আর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.