আমি mysql_real_escape_string()
এসকিউএল সার্ভারের বিকল্প খুঁজছি । কি addslashes()
আমার সবচেয়ে ভাল বিকল্প বা অন্য বিকল্প ফাংশন যা ব্যবহার করা যেতে পারে?
এর বিকল্পও mysql_error()
কার্যকর হবে।
আমি mysql_real_escape_string()
এসকিউএল সার্ভারের বিকল্প খুঁজছি । কি addslashes()
আমার সবচেয়ে ভাল বিকল্প বা অন্য বিকল্প ফাংশন যা ব্যবহার করা যেতে পারে?
এর বিকল্পও mysql_error()
কার্যকর হবে।
উত্তর:
addslashes()
সম্পূর্ণরূপে পর্যাপ্ত নয়, তবে পিএইচপি এর এমএসকিউএল প্যাকেজটি কোনও শালীন বিকল্প সরবরাহ করে না। কুরুচিপূর্ণ কিন্তু সম্পূর্ণরূপে সাধারণ সমাধান হেক্স বাইস্টেস্টিং হিসাবে ডেটা এনকোড করছে, অর্থাৎ
$unpacked = unpack('H*hex', $data);
mssql_query('
INSERT INTO sometable (somecolumn)
VALUES (0x' . $unpacked['hex'] . ')
');
বিমূর্ত, এটি হবে:
function mssql_escape($data) {
if(is_numeric($data))
return $data;
$unpacked = unpack('H*hex', $data);
return '0x' . $unpacked['hex'];
}
mssql_query('
INSERT INTO sometable (somecolumn)
VALUES (' . mssql_escape($somevalue) . ')
');
mysql_error()
সমতূল্য mssql_get_last_message()
।
SQLSTATE[22007]: Invalid datetime format: 210 [Microsoft][ODBC SQL Server Driver][SQL Server]Conversion failed when converting datetime from binary/varbinary string.
পাচ্ছি : আমি বিশ্বাস করি যে এই পদ্ধতিটি প্রতিটি এমএসএসকিউএল ডেটাটাইপের সাথে কাজ করলেই সঠিক হতে পারে।
mssql_escape()
ফাংশনটির সামগ্রীটি আমার জন্য তা করছে না। একটি নির্বাচন করার পরে পাঠ্য প্রদর্শনটি এমনভাবে 0x4a2761696d65206269656e206c652063686f636f6c6174
অপঠনযোগ্য দেখতে লাগছে ।
function ms_escape_string($data) {
if ( !isset($data) or empty($data) ) return '';
if ( is_numeric($data) ) return $data;
$non_displayables = array(
'/%0[0-8bcef]/', // url encoded 00-08, 11, 12, 14, 15
'/%1[0-9a-f]/', // url encoded 16-31
'/[\x00-\x08]/', // 00-08
'/\x0b/', // 11
'/\x0c/', // 12
'/[\x0e-\x1f]/' // 14-31
);
foreach ( $non_displayables as $regex )
$data = preg_replace( $regex, '', $data );
$data = str_replace("'", "''", $data );
return $data;
}
এখানকার কিছু কোড কোডিগনিটার থেকে ছিঁড়ে গেছে। ভাল কাজ করে এবং একটি পরিষ্কার সমাধান।
সম্পাদনা: উপরের কোড স্নিপেটের সাথে প্রচুর সমস্যা রয়েছে। সেগুলি কী তা জানতে দয়া করে মন্তব্যগুলি পড়া না করে এটি ব্যবহার করবেন না। আরও ভাল, দয়া করে এটিকে ব্যবহার করবেন না। প্যারামিটারাইজড কোয়েরিগুলি আপনার বন্ধু: http://php.net/manual/en/pdo.prepared-statements.php
preg_replace
? str_replace
পর্যাপ্ত না ?
empty($value)
ফিরে আসবে true
না শুধুমাত্র ''
, কিন্তু জন্য null
, 0
এবং '0'
! আপনি এই সমস্ত ক্ষেত্রে একটি খালি স্ট্রিং ফিরে আসবেন।
আপনি যখন আপনার ক্যোয়ারীতে প্যারামিটার ব্যবহার করতে পারেন তখন কেন কিছু ছাড়তে বিরক্ত করবেন ?!
sqlsrv_query(
$connection,
'UPDATE some_table SET some_field = ? WHERE other_field = ?',
array($_REQUEST['some_field'], $_REQUEST['id'])
)
আপনার মানগুলির প্যারামিটারগুলি কিনা তা নির্বিশেষে এটি নির্বাচন, মুছে ফেলা, আপডেটগুলিতে সঠিকভাবে কাজ করে null
। নীতিগত বিষয়টি তৈরি করুন - এসকিউএলকে একত্রিত করবেন না এবং আপনি সর্বদা সুরক্ষিত থাকেন এবং আপনার অনুসন্ধানগুলি আরও ভালভাবে পড়তে পারে।
আপনি PDO গ্রন্থাগারটি সন্ধান করতে পারেন । আপনি PDO এর সাথে প্রস্তুত বিবৃতিগুলি ব্যবহার করতে পারেন, যা আপনি যদি সঠিকভাবে প্রস্তুত বিবৃতিগুলি সঠিকভাবে করেন তবে আপনার স্ট্রিংয়ের যে কোনও খারাপ অক্ষর স্বয়ংক্রিয়ভাবে পালিয়ে যাবে। এটি কেবলমাত্র আমার মনে হয় পিএইচপি 5 এর জন্য।
একক এবং ডাবল উদ্ধৃতি হ্যান্ডেল করার আরেকটি উপায় হ'ল:
function mssql_escape($str)
{
if(get_magic_quotes_gpc())
{
$str = stripslashes($str);
}
return str_replace("'", "''", $str);
}
একক- এবং দ্বিগুণ-উদ্ধৃতি থেকে বাঁচতে আপনাকে সেগুলি দ্বিগুণ করতে হবে:
$value = 'This is a quote, "I said, 'Hi'"';
$value = str_replace( "'", "''", $value );
$value = str_replace( '"', '""', $value );
$query = "INSERT INTO TableName ( TextFieldName ) VALUES ( '$value' ) ";
ইত্যাদি ...
এবং এ্যাট্রিবিউশন: মাইক্রোসফ্ট এসকিউএল সার্ভার 2000 এ ক্যারেক্টার অবলম্বন করুন
ঘন্টাখানেক লড়াই করার পরে, আমি এমন একটি সমাধান নিয়ে এসেছি যা প্রায় সেরা অনুভব করে।
মানগুলি হেক্সস্ট্রিংয়ে রূপান্তর করার বিশৃঙ্খলার উত্তরটি প্রতিটি ডেটাটাইপের সাথে বিশেষত ডেটটাইম কলামগুলির সাথে কাজ করে না।
আমি পিএইচপি'র ব্যবহার করি PDO::quote()
তবে এটি পিএইচপি এর সাথে আসে, PDO::quote()
এমএস এসকিউএল সার্ভার এবং রিটার্নের জন্য সমর্থিত নয় FALSE
। এটির কাজ করার সমাধানটি ছিল কিছু মাইক্রোসফ্ট বান্ডিল ডাউনলোড করা:
এর পরে আপনি পিএসএফের সাথে পিডিওর সাথে নিম্নলিখিত উদাহরণের মতো ডিএসএন ব্যবহার করে সংযুক্ত করতে পারেন:
sqlsrv:Server=192.168.0.25; Database=My_Database;
ডিএসএন-এ UID
এবং PWD
প্যারামিটারগুলি ব্যবহার করে কাজ হয়নি, তাই সংযোগ তৈরি করার সময় পিডিও কনস্ট্রাক্টরের ব্যবহারকারীর নাম এবং পাসওয়ার্ড দ্বিতীয় এবং তৃতীয় প্যারামিটার হিসাবে পাস করা হয়। এখন আপনি পিএইচপি এর ব্যবহার করতে পারেন PDO::quote()
। উপভোগ করুন।
ব্যবহারকারী বিশৃঙ্খলা দ্বারা 2009-02-22T121000 এর একটি উত্তর সমস্ত প্রশ্নের সাথে খাপ খায় না।
উদাহরণস্বরূপ, "উইন্ডো থেকে লোগিন [0x6f6c6f6c6f] তৈরি করুন" আপনাকে একটি ব্যতিক্রম দেয়।
পিএস: পিএইচপি, http://msdn.microsoft.com/library/cc296181%28v=sql.90%29.aspx এবং sqlsrv_prepare ফাংশন, যা পরামিতি আবদ্ধ করতে পারে জন্য এসকিউএল সার্ভার ড্রাইভার দেখুন ।
পিএসএস: যা উপরোক্ত প্রশ্নের সাথে আপনাকেও সহায়তা করেনি;)
সতর্কতা: এই ফাংশনটি পিএইচপি 7.0.0 এ সরানো হয়েছে।
http://php.net/manual/en/function.mssql-query.php
যে কেউ এখনও এই এমএসকিএল_ * ফাংশন ব্যবহার করছেন, মনে রাখবেন যে তারা পিএইচপি থেকে v7.0.0 হিসাবে সরানো হয়েছে as সুতরাং, এর অর্থ হল আপনাকে শেষ পর্যন্ত PDO লাইব্রেরি, sqlsrv_ * ইত্যাদি ব্যবহার করতে আপনার মডেল কোডটি পুনরায় লিখতে হবে যদি আপনি "উদ্ধৃতি / পলায়ন" পদ্ধতিতে কোনও বিষয় সন্ধান করছেন, আমি পিডিওর প্রস্তাব দেব।
এই ফাংশনের বিকল্পগুলির মধ্যে রয়েছে: PDO :: ক্যোয়ারী (), sqlsrv_query () এবং odbc_exec ()
আপনি যদি পিডিও ব্যবহার করেন তবে আপনি PDO::quote
পদ্ধতিটি ব্যবহার করতে পারেন ।
এসকিউএলে হেক্সাডেসিমাল মানগুলি ASCII এ ফিরে আসার জন্য রূপান্তরকরণের জন্য, আমি এখানে যে সমাধানটি পেয়েছি তা এখানে রয়েছে ( ব্যবহার্য বিশৃঙ্খলা থেকে হেক্সাডেসিমেলের মধ্যে এনকোড করার জন্য ফাংশনটি ব্যবহার করে )
function hexEncode($data) {
if(is_numeric($data))
return $data;
$unpacked = unpack('H*hex', $data);
return '0x' . $unpacked['hex'];
}
function hexDecode($hex) {
$str = '';
for ($i=0; $i<strlen($hex); $i += 2)
$str .= chr(hexdec(substr($hex, $i, 2)));
return $str;
}
$stringHex = hexEncode('Test String');
var_dump($stringHex);
$stringAscii = hexDecode($stringHex);
var_dump($stringAscii);
এসকিউএল সংরক্ষিত শব্দগুলি এড়ানো ভাল। উদাহরণ স্বরূপ:
function ms_escape_string($data) {
if (!isset($data) or empty($data))
return '';
if (is_numeric($data))
return $data;
$non_displayables = array(
'/%0[0-8bcef]/', // URL encoded 00-08, 11, 12, 14, 15
'/%1[0-9a-f]/', // url encoded 16-31
'/[\x00-\x08]/', // 00-08
'/\x0b/', // 11
'/\x0c/', // 12
'/[\x0e-\x1f]/', // 14-31
'/\27/'
);
foreach ($non_displayables as $regex)
$data = preg_replace( $regex, '', $data);
$reemplazar = array('"', "'", '=');
$data = str_replace($reemplazar, "*", $data);
return $data;
}
আমি এটিকে বিকল্প হিসাবে ব্যবহার করছি mysql_real_escape_string()
:
function htmlsan($htmlsanitize){
return $htmlsanitize = htmlspecialchars($htmlsanitize, ENT_QUOTES, 'UTF-8');
}
$data = "Whatever the value's is";
$data = stripslashes(htmlsan($data));
আপনি আপনার নিজস্ব সংস্করণ পাকানো পারে mysql_real_escape_string
নিম্নলিখিত রেগুলার এক্সপ্রেশন সঙ্গে, (এবং উপর উন্নত): [\000\010\011\012\015\032\042\047\134\140]
। এটি নিম্নলিখিত অক্ষরগুলির যত্ন নেয়: নাল, ব্যাকস্পেস, অনুভূমিক ট্যাব, নতুন লাইন, ক্যারেজ রিটার্ন, বিকল্প, ডাবল উদ্ধৃতি, একক উদ্ধৃতি, ব্যাকস্ল্যাশ, গুরুতর উচ্চারণ। ব্যাকস্পেস এবং অনুভূমিক ট্যাব দ্বারা সমর্থিত নয় mysql_real_escape_string
।