मैं mysql_real_escape_string()
SQL सर्वर के लिए विकल्प की तलाश कर रहा हूँ । क्या addslashes()
मेरा सबसे अच्छा विकल्प है या कोई अन्य वैकल्पिक फ़ंक्शन है जिसका उपयोग किया जा सकता है?
के लिए एक विकल्प mysql_error()
भी उपयोगी होगा।
मैं mysql_real_escape_string()
SQL सर्वर के लिए विकल्प की तलाश कर रहा हूँ । क्या addslashes()
मेरा सबसे अच्छा विकल्प है या कोई अन्य वैकल्पिक फ़ंक्शन है जिसका उपयोग किया जा सकता है?
के लिए एक विकल्प mysql_error()
भी उपयोगी होगा।
जवाबों:
addslashes()
पूरी तरह से पर्याप्त नहीं है, लेकिन PHP के mssql पैकेज कोई भी अच्छा विकल्प प्रदान नहीं करता है। बदसूरत, लेकिन पूरी तरह से सामान्य समाधान डेटा को हेक्स बायट्रस्टिंग के रूप में एन्कोडिंग है, अर्थात
$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 डेटाटाइप के साथ काम करे।
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;
}
यहाँ कुछ कोड CodeIgniter से काट दिए गए थे। अच्छी तरह से काम करता है और एक साफ समाधान है।
EDIT: ऊपर कोड स्निपेट के साथ बहुत सारे मुद्दे हैं। कृपया उन टिप्पणियों को पढ़ने के बिना इसका उपयोग न करें कि वे क्या हैं। बेहतर अभी तक, कृपया इस का उपयोग न करें। पैरामीटरकृत प्रश्न आपके मित्र हैं: 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
या नहीं , अपडेट । सिद्धांत की बात करें - एसक्यूएल को न बदलें और आप हमेशा सुरक्षित रहें और आपके प्रश्न बहुत बेहतर पढ़ें।
आप पीडीओ लाइब्रेरी में देख सकते हैं । आप पीडीओ के साथ तैयार किए गए कथनों का उपयोग कर सकते हैं, जो तैयार किए गए कथनों को सही ढंग से करने पर आपके तार में किसी भी खराब अक्षर से बच जाएंगे। यह केवल PHP 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' ) ";
आदि...
और एट्रिब्यूशन: Microsoft SQL Server 2000 में चरित्र से बच
घंटों तक इससे जूझने के बाद, मैं एक ऐसा समाधान लेकर आया हूं जो लगभग सबसे अच्छा लगता है।
अराजकता के मानों को हेक्सस्ट्रिंग में बदलने का जवाब हर डेटाटाइप के साथ काम नहीं करता है, विशेष रूप से डेटाटाइम कॉलम के साथ।
मैं PHP का उपयोग करता हूं PDO::quote()
, लेकिन जैसा कि यह PHP के साथ आता है, PDO::quote()
एमएस SQL सर्वर और रिटर्न के लिए समर्थित नहीं है FALSE
। इसका काम करने का हल कुछ Microsoft बंडलों को डाउनलोड करना था:
उसके बाद आप निम्न उदाहरण जैसे DSN का उपयोग करके PHP को PDO के साथ जोड़ सकते हैं:
sqlsrv:Server=192.168.0.25; Database=My_Database;
का उपयोग करते हुए UID
और PWD
DSN में पैरामीटर काम नहीं किया, इसलिए यूज़रनेम और पासवर्ड दूसरे और तीसरे पैरामीटर पीडीओ निर्माता के रूप में पारित कर रहे हैं जब कनेक्शन का निर्माण। अब आप PHP का उपयोग कर सकते हैं PDO::quote()
। का आनंद लें।
उपयोगकर्ता अराजकता से 2009-02-22T121000 का एक उत्तर सभी प्रश्नों को फिट नहीं करता है।
उदाहरण के लिए, "सृजन लॉग [0x6f6c6f6c6f] विन्डोज़ से" आपको एक अपवाद देगा।
PS: PHP, http://msdn.microsoft.com/library/cc296181%28v=sql.90%29.aspx और sqlsrv_prepare फ़ंक्शन के लिए SQL सर्वर ड्राइवर को देखें, जो मापदंडों को बांध सकता है।
PSS: जो आपको ऊपर दिए गए क्वेरी से भी मदद नहीं करता;)
चेतावनी: यह फ़ंक्शन PHP 7.0.0 में याद किया गया था।
http://php.net/manual/en/function.mssql-query.php
इन mssql_ * फ़ंक्शन का उपयोग करने वाले किसी भी व्यक्ति के लिए, ध्यान रखें कि उन्हें PHP से v7.0.0 के रूप में हटा दिया गया है। तो, इसका मतलब है कि आपको अंततः अपने मॉडल कोड को फिर से लिखना होगा या तो पीडीओ लाइब्रेरी, sqlsrv_ * आदि का उपयोग करना होगा। यदि आप "उद्धृत / भागने" विधि के साथ कुछ खोज रहे हैं, तो मैं पीडीओ की सिफारिश करूंगा।
इस फ़ंक्शन के विकल्प में शामिल हैं: पीडीओ :: क्वेरी (), sqlsrv_query () और odbc_exec ()
यदि आप पीडीओ का उपयोग कर रहे हैं, तो आप PDO::quote
विधि का उपयोग कर सकते हैं ।
SQL आरक्षित शब्दों से बचना भी बेहतर है। उदाहरण के लिए:
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));
ASCII में SQL में हेक्साडेसिमल मान प्राप्त करने के लिए रूपांतरण के लिए, यहाँ समाधान है जो मुझे इस पर मिला ( उपयोगकर्ता अराजकता से फ़ंक्शन को हेक्साडेसिमल में एन्कोड करने के लिए)
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);
आप mysql_real_escape_string
निम्नलिखित नियमित अभिव्यक्ति के साथ अपने स्वयं के संस्करण को रोल कर सकते हैं , (और इसमें सुधार कर सकते हैं) [\000\010\011\012\015\032\042\047\134\140]
:। निम्न वर्णों का ध्यान रखता है: अशक्त, बैकस्पेस, क्षैतिज टैब, नई पंक्ति, गाड़ी वापसी, स्थानापन्न, दोहरा उद्धरण, एकल उद्धरण, बैकस्लैश, गंभीर उच्चारण। बैकस्पेस और क्षैतिज टैब द्वारा समर्थित नहीं हैं mysql_real_escape_string
।