'==' বনাম 'স্ট্রিম্প ()' ব্যবহার করে স্ট্রিং তুলনা


334

দেখে মনে হচ্ছে পিএইচপি-র ===অপারেটর কেস সংবেদনশীল। তাহলে কি ব্যবহার করার কোনও কারণ আছে strcmp()?

নীচের মতো কিছু করা নিরাপদ?

if ($password === $password2) { ... }

10
কিসের সাথে সংবেদনশীলতার সম্পর্ক আছে strcmp?
কেনেটিএম

1
@ কেনিটিএম: strcmpকেস-সংবেদনশীল। কিছু ভাষায়, ভিবি-র মতো, স্ট্রিং তুলনা নাও হতে পারে এবং এভাবেই অন্যরকম ফলাফল ফিরে আসতে পারে। যদিও পিএইচপি-তে এটি হয় না।
সিএওও

13
@ জিৎ: আপনি এটির ===পরিবর্তে ব্যবহার করতে চাইতে পারেন ==কারণ '0XAB' == '0xab'এটি সত্য।
কেনেটিমে

17
== এর পরিবর্তে === ব্যবহার করা গুরুত্বপূর্ণ, কারণ যে কোনও স্ট্রিংকে ০ এর সাথে ০ এর সাথে তুলনা করা সত্য হবে যা অবশ্যই মিথ্যা ...
কার্ল অ্যাডলার

4
@ কেনি এছাড়াও '0xAB' == '171'
অ্যান্টিমনি

উত্তর:


329

এটি ব্যবহারের কারণ এটি strcmp

<0 যদি str1 str2 এর চেয়ে কম হয় তবে প্রত্যাবর্তন হয়; > ০ যদি str1 টি str2 এর চেয়ে বড় হয় এবং 0 টি সমান হলে।

===কেবলমাত্র ফিরে আসে trueবা false, এটি আপনাকে "বৃহত্তর" স্ট্রিংটি বলে না।


9
আমার বর্তমান ক্ষেত্রে আইসিকটি, আমার কোন স্ট্রিং বেশি তা জানতে হবে না :)
জিউ মেনগ

154
স্ট্রিংয়ের সাথে মিলেছে স্ট্রিম্প 0.207852 সেকেন্ড সময় নিয়েছে নন-ম্যাচিং স্ট্রিং সহ স্ট্রিম্প ০.০১৫২276 seconds সেকেন্ড নিয়েছে === মিলছে না তারে 0.067122 সেকেন্ড নিয়েছে === নন-ম্যাচিং স্ট্রিংয়ের সাথে 0.057305 সেকেন্ড সময় নিয়েছে snipplr.com/view/758

3
স্ট্রিম্পের জন্য অন্যান্য ব্যবহারের মাধ্যমে এটি বাছাই করা দেখায়। বাছাই সম্পর্কে আরও স্পষ্ট করা। স্ট্রিং 1 স্ট্রিং 2 এর আগে বাছাই করলে, স্ট্রিং 2 স্ট্রিং 1 এর আগে বাছাই করলে 0 বা সেগুলি যদি 0 হয় তবে স্ট্রিম 1 (0) প্রদান করে। উদাহরণস্বরূপ $ string_first = "aabo"; ; স্ট্রিং_সেকেন্ড = "আওও"; প্রতিধ্বনি $ n = strcmp ($ স্ট্রিং_ফার্স্ট, $ স্ট্রিং_সেকেন্ড); শূন্যের চেয়ে বড় ফিরে আসবে, যেমন আয়াও আবাবোর আগে বাছাই করছে।
এইচটিএমএল ম্যান

20
এই উত্তরটি কেন সবচেয়ে বেশি অগ্রগতি লাভ করে? আমি হতাশ করছি কারণ যদিও এই প্রশ্নের উত্তরটি এই প্রশ্নের প্রাপ্য তবে 'সঠিক' উত্তর নয়। সঠিক উত্তরটি 'ব্যবহার ===' হওয়া উচিত কারণ অনেক লোক ইতিমধ্যে অন্যান্য উত্তরে বলেছে।
onur göngör

2
@onur güngör বাস্তবিক, এই করে উত্তর অপ প্রশ্ন, যা So is there any reason to use strcmp() ?, যখন Postfuturist এর উত্তর না। ওহ, জাহান্নাম ... কোনও একটি উত্তর একবারে কম্পাইল করলো ব্যবহার এর strcmp(), কর্মক্ষমতা এর ===, এবং খারাপ নির্ভরযোগ্যতা এর ==স্ট্রিং তুলনা জন্য ... তাই আমি খনি তালিকায় যুক্ত।
বাল্মীপুর

222

==স্ট্রিং তুলনার জন্য আপনার কখনই ব্যবহার করা উচিত নয় । ===ঠিক আছে।

$something = 0;
echo ('password123' == $something) ? 'true' : 'false';

কেবল উপরের কোডটি চালান এবং আপনি কেন তা দেখতে পাবেন।

$something = 0;
echo ('password123' === $something) ? 'true' : 'false';

এখন, এটি কিছুটা ভাল।


19
== ভিন্ন ধরণের জন্য কেবল একটি সমস্যা নয়। উভয় পক্ষের স্ট্রিং হলেও এটি কখনও কখনও অপ্রত্যাশিত ফলাফল দেয়। '1e3' == '1000'
অ্যান্টিমনি

3
0 == 'পাসওয়ার্ড 123' কীভাবে হয়?
অ্যান্ডি লোবেল

24
অ্যান্ডিলোবেল পিএইচপি 'পাসওয়ার্ড 123' সংখ্যার সাথে কোয়ারেন্স করে এটি অপ্রচলিত তুলনা নিয়মগুলি ব্যবহার করে যেহেতু অন্যান্য অপারেন্ডটি একটি সংখ্যা, সেই স্ট্রিং বেশিরভাগের মতো 0 নম্বরে কোয়ার্স করে এবং পিএইচপি তুলনা করার জন্য সত্য প্রত্যাবর্তন করে।
পোস্টফিউচারিস্ট

8
একটি দ্রুত var_dump ((int) 'password123'); কেন এই ঘটনা ঘটেছে তা আমাকে পুরোপুরি বুঝতে সাহায্য করেছিল ... ** বিব্রত ** ... আমি সত্যিই পছন্দ করি === অপারেটর
কার্লটন

3
এটি '==' ব্যবহার করে বিচিউস হয় যদি দুটি অপারেন্ডের মধ্যে একটিতে সংখ্যায় কাস্টযোগ্য হয়, পিএইচপি উভয় অপারেশনকে সংখ্যায় কাস্ট করে, এবং আরও, যদি সংখ্যায় স্ট্রিং সংখ্যায় কাস্ট করা হয় তবে এটি শূন্যের মান নেয়, ফলস্বরূপ শূন্যের সমান হয়, সুতরাং সাধারণ '==' এর সাথে তুলনার ফলাফল অযাচিত কিছু করতে পারে
লুকা সি

98

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

উদাহরণস্বরূপ '1e3' == '1000'সত্য ফিরে আসে। ===পরিবর্তে আপনার ব্যবহার করা উচিত ।


16
তবে আপনি কেবল === করতে পারেন।
রোমান নেওয়াজা 25'13

11
@ রোমান হ্যাঁ তবে অনেক পিএইচপি প্রোগ্রামার জানে না যে তাদের এটি করতে হয়েছে। সুতরাং সতর্কতা।
এন্টিমোনি

5
@ অ্যান্টিমনি তাই তাদের উত্তরে তাদের কী করা উচিত তা বলবেন না?
টিম

43

ভাল..এই পিএইচপি বাগ রিপোর্ট অনুসারে আপনি 0 ওয়ানও পেতে পারেন।

<?php 
    $pass = isset($_GET['pass']) ? $_GET['pass'] : '';
    // Query /?pass[]= will authorize user
    //strcmp and strcasecmp both are prone to this hack
    if ( strcasecmp( $pass, '123456' ) == 0 ){
      echo 'You successfully logged in.';
    }
 ?>

এটি আপনাকে একটি সতর্কতা দেয়, তবে এখনও তুলনাটি বাইপাস করে। @ পোষ্টফিউচারিস্টের পরামর্শ অনুসারে
আপনার করা উচিত ===


5
বাহ +1। লিঙ্কটি থেকে উদ্ধৃতি: "এটি ফাংশনটির জন্য প্রতিষ্ঠিত আচরণ যা নালার প্রত্যাবর্তনের জন্য ভুল ধরণের যুক্তি (গুলি) গ্রহণ করে"। ম্যানুয়ালটি বিবেচনা করে এটি আশ্চর্যজনকভাবে কেবল এটি বলেছে: "স্ট্র্যান্ড 1 টিআর 2 এর চেয়ে কম হলে <0 প্রদান করে;> যদি স্ট্র 1 টি আরআর 2 এর চেয়ে বড় হয়, এবং 0 সমান হয় তবে"। নলের সম্ভাবনার হিসাবে উল্লেখ করা হয়নি, তবুও সাবস্ট্রাস্ট ম্যান পেজের মতো পৃষ্ঠায় এটি উল্লেখ করা হয়েছে। দীর্ঘশ্বাস ফেলুন
গেরি

তবে ফর্ম পদ্ধতি পোস্ট করার পরে কি একই ঘটনা ঘটে ...?
3lokh

@ নিখিলজর্জি এটি করে, এখানে প্রশ্নাবলীর ক্রিয়াকলাপটি strcmp। কোন ইনপুটগুলির সাথে তুলনা করা হচ্ছে তাতে কিছু যায় আসে না।
আজিত

বাগ রিপোর্টটি নালাগুলি ফিরতে ভাল বলে জানিয়েছে, এটি ভুল। পিএইচপি ৪.৩ থেকে পিএইচপি .3.৩ পর্যন্ত সমস্ত অফিসিয়াল পিএইচপি এই ফাংশনগুলি থেকে বাতিল করে না n আমার সন্দেহ হয় এটি আলফা বা বিটা রিলিজ হতে পারে এবং বাগটি বন্ধ থাকুক না কেন এটি অবৈধ, এটি ঠিক করা হয়েছিল। বিশদগুলির জন্য 3v4l.org/Zq8tM দেখুন , যা দেখায় যে এটি HHVM 3.11 - 3.19 কে প্রভাবিত করে।
টিমো তিজহফ

33

সর্বদা মনে রাখবেন, স্ট্রিংগুলির সাথে তুলনা করার সময় আপনার ===অপারেটর (কঠোর তুলনা) ব্যবহার করা উচিত এবং অপারেটরটি (আলগা তুলনা) ব্যবহার করা উচিত নয় ==


8
আসলে, আমি মনে করি এটি নিরাপদ বলে যে কোনও কিছুর=== তুলনা করার সময় আপনার ব্যবহার করা উচিত ।
rink.attendant.6

22

সমস্ত উত্তর সংক্ষিপ্ত:

  • ==স্ট্রিং তুলনা জন্য একটি খারাপ ধারণা
    এটি আপনাকে অনেক ক্ষেত্রে "বিস্ময়কর" ফলাফল দেবে। এটি বিশ্বাস করবেন না।

  • === ভাল, এবং আপনাকে সেরা অভিনয় দেবে।

  • strcmp() সাধারণত যদি বাছাইয়ের ক্রিয়াকলাপগুলির জন্য কোন স্ট্রিংটি "বৃহত্তর" হয় তা নির্ধারণ করতে আপনার যদি ব্যবহার করা উচিত।


20

ব্যবহার ==করা বিপজ্জনক হতে পারে।

দ্রষ্টব্য, যে দুটি ভিন্ন হয় যদি এটি ভেরিয়েবল অন্য ডেটা টাইপ টাইপ করতে হবে।

উদাহরণ:

  • echo (1 == '1') ? 'true' : 'false';
  • echo (1 == true) ? 'true' : 'false';

আপনি দেখতে পাচ্ছেন যে এই দুটি পৃথক ধরণের থেকে এসেছে তবে ফলাফলটি এসেছে trueযা আপনার কোডটি প্রত্যাশা করে না।

ব্যবহার ===অবশ্য পরীক্ষা শো হিসাবে সুপারিশ করা হয় যে এটি একটি বিট তুলনায় আরো দ্রুত strcmp()এবং তার কেস-অবশ বিকল্প strcasecmp()

দ্রুত গগলিং এই গতির তুলনাটি চিৎকার করে: http://snipplr.com/view/758/


1
কখনও কখনও এটি তাদের ইতিমধ্যে একই ধরণের থাকলেও তাদের আলাদা ধরণের কাস্ট করে।
অ্যান্টিমনি

এমনকি দুটি স্ট্রিংয়ের সাথে তুলনা করার সময় যা "012" == "12"পিএইচপি এর মতো একটি পূর্ণসংখ্যার প্রতিনিধিত্ব করে উভয় স্ট্রিংয়ের প্রকারকে পূর্ণসংখ্যায় পরিবর্তন করে 12 == 12এবং ফিরে আসে true
GoTo


6

strcmp এটি যে পরিবেশে চলছে তার উপর ভিত্তি করে বিভিন্ন মান প্রদান করবে (লিনাক্স / উইন্ডোজ)!

কারণটি হ'ল এটিতে বাগ রয়েছে যেহেতু বাগ রিপোর্টটি https://bugs.php.net/bug.php?id=53999

যত্ন সহকারে পরিচালনা করুন !! আপনাকে ধন্যবাদ


যদিও স্ট্রিংগুলি সমান হয় তবে সর্বদা 0 ফেরত আসবে। যদিও 0 বাদে অন্য কোনও মান সম্পর্কে যত্নবান হওয়ার জন্য সতর্ক থাকার জন্য +1।
অধ্যাপক ফ্যালকেন চুক্তিটি

4

আপনি strcmp()যদি ডিক্সোগ্রাফিকভাবে স্ট্রিংগুলি অর্ডার / তুলনা করতে চান তবে আপনি ব্যবহার করতে পারেন । আপনি যদি সাম্যতা পরীক্ষা করতে চান তবে ==ঠিক আছে fine


1
মধ্যে ভালো লেগেছে usort । আসলে, এটি বাছাই করার জন্য বেশ তৈরি pretty
চার্লস

@ চার্লস ধন্যবাদ। উইকিপিডিয়া আমার চোখ ঝলমলে করে তুলেছে।
cednarski

1
বাছাই সম্পর্কে আরও স্পষ্ট করা। স্ট্রিং 1 স্ট্রিং 2 এর আগে বাছাই করলে, স্ট্রিং 2 স্ট্রিং 1 এর আগে বাছাই করলে 0 বা সেগুলি যদি 0 হয় তবে স্ট্রিম 1 (0) প্রদান করে। উদাহরণস্বরূপ $ string_first = "aabo"; ; স্ট্রিং_সেকেন্ড = "আওও"; প্রতিধ্বনি $ n = strcmp ($ স্ট্রিং_ফার্স্ট, $ স্ট্রিং_সেকেন্ড); শূন্যের চেয়ে বড় ফিরে আসবে, যেমন আয়াও আবাবোর আগে বাছাই করছে।
এইচটিএমএল ম্যান

@postfuturist আমি নিশ্চিত ওটা টাইপো এর আছি এবং তারা বোঝানো ===
ছাই

4

এছাড়াও ফাংশন বাছাই করতে সহায়তা করতে পারে। বাছাই সম্পর্কে আরও স্পষ্ট করা। strcmp () স্ট্রিং 2 এর আগে স্ট্রিং 1 বাছাই করলে 0 এর চেয়ে কম, স্ট্রিং 1 এর আগে স্ট্রিং 2 বা 1 এর মতো হলে 0 এর চেয়ে বড় হয়। উদাহরণ স্বরূপ

$first_string = "aabo";
$second_string = "aaao";
echo $n = strcmp($first_string,$second_string);

ফ্যাশনটি শূন্যের চেয়ে বেশি ফিরে আসবে, যেমন আয়াও আবাবোর আগে বাছাই করছে।


0

পিএইচপি বর্ণানুক্রমিক বাছাইয়ের পরিবর্তে তুলনা করতে অক্ষরের ASCII মান ব্যবহার করুন । ছোট হাতের অক্ষরের রাজধানীর তুলনায় উচ্চতর ASCII মান থাকে value এই ধরণের তুলনা করতে পরিচয় অপারেটর === ব্যবহার করা আরও ভাল । strcmp () বাইনারি নিরাপদ স্ট্রিং তুলনা সম্পাদন করার জন্য একটি ফাংশন। এটি আর্গুমেন্ট হিসাবে দুটি স্ট্রিং নেয় এবং <0 টি স্ট্র 1 টি আর 2 এর চেয়ে কম হলে ফিরে আসে; > ০ যদি str1 টি str2 এর চেয়ে বড় হয় এবং 0 টি সমান হলে। স্টারকেসক্যাম্প () নামে একটি কেস-সংবেদনশীল সংস্করণও রয়েছে যা প্রথমে স্ট্রিংগুলি ছোট হাতের মধ্যে রূপান্তর করে এবং তারপরে তুলনা করে।


0

if ($password === $password2) { ... }পাসওয়ার্ড বা পাসওয়ার্ড হ্যাশগুলির সাথে তুলনা করার সময় করা কোনও নিরাপদ জিনিস নয় যেখানে ইনপুটগুলির মধ্যে একটি ব্যবহারকারী নিয়ন্ত্রিত।
সেক্ষেত্রে এটি একটি সময়সীমা তৈরি করে যাতে আক্রমণকারীকে মৃত্যুদন্ড কার্যকর করার সময় পার্থক্য থেকে আসল পাসওয়ার্ড হ্যাশ পেতে দেয়। পরিবর্তে
ব্যবহার if (hash_equals($password, $password2)) { ... }করুন, কারণ hash_equals "টাইমিং আক্রমণ নিরাপদ স্ট্রিং তুলনা" সম্পাদন করে।

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