স্ট্রিংটি serialize()
ফাংশনের ফলাফল কিনা তা নির্ধারণ করার সর্বোত্তম উপায় কী ?
স্ট্রিংটি serialize()
ফাংশনের ফলাফল কিনা তা নির্ধারণ করার সর্বোত্তম উপায় কী ?
উত্তর:
আমি বলব, unserialize
এটি চেষ্টা করে দেখুন ;-)
ম্যানুয়ালটি উদ্ধৃত করা হচ্ছে:
যদি পাস করা স্ট্রিংটি নিরীক্ষণযোগ্য না হয় তবে FALSE ফিরে আসে এবং E_NOTICE জারি করা হয়।
সুতরাং, আপনি যদি ফেরত মান কিনা চেক করতে হবে false
বা না (সঙ্গে ===
বা !==
, নিশ্চিত করুন না হতে দিয়ে কোনো সমস্যা আছে 0
বা null
কিছু যে সমান false
, আমি বলতে চাই) ।
শুধু বিজ্ঞপ্তি থেকে সাবধান: আপনার @ অপারেটরটি ব্যবহার করতে / প্রয়োজন হতে পারে ।
এই ক্ষেত্রে :
$str = 'hjkl';
$data = @unserialize($str);
if ($data !== false) {
echo "ok";
} else {
echo "not ok";
}
আপনি পাবেন:
not ok
সম্পাদনা: ওহ, এবং @ পিটার যেমন বলেছেন (তাঁকে ধন্যবাদ!), আপনি যদি কোনও বুলিয়ান মিথ্যা উপস্থাপনকে আনসিরিয়ালাইজ করার চেষ্টা করছেন তবে আপনি সমস্যার মধ্যে পড়তে পারেন :-(
সুতরাং, আপনার সিরিয়ালযুক্ত স্ট্রিং " b:0;
" এর সমান নয় এটি যাচাই করাও সহায়ক হতে পারে; এই জাতীয় কিছু কৌশলটি করা উচিত, আমি মনে করি:
$data = @unserialize($str);
if ($str === 'b:0;' || $data !== false) {
echo "ok";
} else {
echo "not ok";
}
আনসিরিয়ালাইজ করার চেষ্টা করার আগে সেই বিশেষ কেসটি পরীক্ষা করা একটি অপ্টিমাইজেশন হতে পারে - তবে সম্ভবত সেই দরকারী নয়, যদি আপনার প্রায়শই কোনও মিথ্যা সিরিয়ালাইজড মান না থাকে।
আমি এই কোডটি লিখিনি, এটি আসলে ওয়ার্ডপ্রেস থেকে। ভেবেছিলাম আমি আগ্রহী যে কারও জন্য এটি অন্তর্ভুক্ত করব, এটি ওভারকিল হতে পারে তবে এটি কার্যকর হয় :)
<?php
function is_serialized( $data ) {
// if it isn't a string, it isn't serialized
if ( !is_string( $data ) )
return false;
$data = trim( $data );
if ( 'N;' == $data )
return true;
if ( !preg_match( '/^([adObis]):/', $data, $badions ) )
return false;
switch ( $badions[1] ) {
case 'a' :
case 'O' :
case 's' :
if ( preg_match( "/^{$badions[1]}:[0-9]+:.*[;}]\$/s", $data ) )
return true;
break;
case 'b' :
case 'i' :
case 'd' :
if ( preg_match( "/^{$badions[1]}:[0-9.E-]+;\$/", $data ) )
return true;
break;
}
return false;
}
^([adObis]:|N;)
যদি স্ট্রিংটি সিরিয়ালযুক্ত false
মান হয়, অর্থাৎ $string = 'b:0;'
SoN9ne এর ফাংশনটি ফিরে আসে তবে false
এটি ভুল
সুতরাং ফাংশন হবে
/**
* Check if a string is serialized
*
* @param string $string
*
* @return bool
*/
function is_serialized_string($string)
{
return ($string == 'b:0;' || @unserialize($string) !== false);
}
In case the passed string is not unserializeable, FALSE is returned and E_NOTICE is issued.
আমরা E_NOTICE ত্রুটি ধরতে পারি না কারণ এটি কোনও ছোঁড়া ব্যতিক্রম নয়।
পাস্কাল মার্টিনের দুর্দান্ত উত্তর সত্ত্বেও, আপনি যদি অন্য কোনও উপায়ে যেতে পারতেন তবে আমি আগ্রহী ছিলাম, তাই আমি এটি কেবল একটি মানসিক অনুশীলন হিসাবে করেছি
<?php
ini_set( 'display_errors', 1 );
ini_set( 'track_errors', 1 );
error_reporting( E_ALL );
$valueToUnserialize = serialize( false );
//$valueToUnserialize = "a"; # uncomment this for another test
$unserialized = @unserialize( $valueToUnserialize );
if ( FALSE === $unserialized && isset( $php_errormsg ) && strpos( $php_errormsg, 'unserialize' ) !== FALSE )
{
echo 'Value could not be unserialized<br>';
echo $valueToUnserialize;
} else {
echo 'Value was unserialized!<br>';
var_dump( $unserialized );
}
এবং এটি আসলে কাজ করে। কেবলমাত্র সতর্কতা হ'ল it php_errormsg কীভাবে কাজ করে তার কারণে আপনার যদি একটি নিবন্ধিত ত্রুটি হ্যান্ডলার থাকে তবে এটি সম্ভবত ভেঙে যায় ।
$a
এবং ডিসিরিয়ালাইজিংয়ের মধ্যে ত্রুটি-চেক না করেন $b
, যা ব্যবহারিক প্রয়োগের নকশা নয়।
একটি ফাংশন অন্তর্নির্মিত
function isSerialized($value)
{
return preg_match('^([adObis]:|N;)^', $value);
}
a:
(বা b:
ইত্যাদি) কোথাও $ মানের ভিতরে উপস্থিত হয়, শুরুতে নয়। এবং ^
এখানে একটি স্ট্রিং শুরু মানে না। এটি সম্পূর্ণ বিভ্রান্তিকর।
ওয়ার্ডপ্রেস সমাধান আছে: (বিস্তারিত এখানে)
function is_serialized($data, $strict = true)
{
// if it isn't a string, it isn't serialized.
if (!is_string($data)) {
return false;
}
$data = trim($data);
if ('N;' == $data) {
return true;
}
if (strlen($data) < 4) {
return false;
}
if (':' !== $data[1]) {
return false;
}
if ($strict) {
$lastc = substr($data, -1);
if (';' !== $lastc && '}' !== $lastc) {
return false;
}
} else {
$semicolon = strpos($data, ';');
$brace = strpos($data, '}');
// Either ; or } must exist.
if (false === $semicolon && false === $brace)
return false;
// But neither must be in the first X characters.
if (false !== $semicolon && $semicolon < 3)
return false;
if (false !== $brace && $brace < 4)
return false;
}
$token = $data[0];
switch ($token) {
case 's' :
if ($strict) {
if ('"' !== substr($data, -2, 1)) {
return false;
}
} elseif (false === strpos($data, '"')) {
return false;
}
// or else fall through
case 'a' :
case 'O' :
return (bool)preg_match("/^{$token}:[0-9]+:/s", $data);
case 'b' :
case 'i' :
case 'd' :
$end = $strict ? '$' : '';
return (bool)preg_match("/^{$token}:[0-9.E-]+;$end/", $data);
}
return false;
}
/**
* some people will look down on this little puppy
*/
function isSerialized($s){
if(
stristr($s, '{' ) != false &&
stristr($s, '}' ) != false &&
stristr($s, ';' ) != false &&
stristr($s, ':' ) != false
){
return true;
}else{
return false;
}
}
এটি আমার পক্ষে ভাল কাজ করে
<?php
function is_serialized($data){
return (is_string($data) && preg_match("#^((N;)|((a|O|s):[0-9]+:.*[;}])|((b|i|d):[0-9.E-]+;))$#um", $data));
}
?>
আমি সেভাবে এটি করা পছন্দ করি:
if (is_array(unserialize($serialized_string))):