MySQL में सिंगल कोट्स से कैसे बचें


98

मैं MySQL में एक मूल्य कैसे सम्मिलित करूं जिसमें सिंगल या डबल कोट्स हों। अर्थात

This is Ashok's Pen.

एकल उद्धरण समस्या पैदा करेगा। भागने के अन्य पात्र हो सकते हैं।

आप सही तरीके से डेटा कैसे डालते हैं?


जवाबों:


126

काफी सीधे शब्दों में कहें:

SELECT 'This is Ashok''s Pen.';

इसलिए स्ट्रिंग के अंदर, प्रत्येक एकल उद्धरण को उनमें से दो के साथ बदलें।

या:

SELECT 'This is Ashok\'s Pen.'

इससे बचिए =)


9
आप अपने पोस्ट को अपडेट करना चाह सकते हैं ताकि mysql_real_escape_string () या Addlashes () को संभव समाधानों के रूप में शामिल किया जा सके ... जैसा कि नीचे दी गई टिप्पणियों में से एक है, ओपी में कहा गया है कि वे सिर्फ फ़ाइल से पढ़ रहे हैं और सम्मिलित कर रहे हैं।
जेम्स बी

3
Mysql_ * तरीकों भविष्य में उपयोग के लिए अनुशंसित नहीं हैं, के रूप में यह है पदावनत
HD1

यह सही जवाब है, हालांकि इन दिनों सबसे अच्छा विकल्प
रयान

10

'पलायन चरित्र है। तो आपका तार होना चाहिए:

यह अशोक की कलम है

यदि आप कुछ फ्रंट-एंड कोड का उपयोग कर रहे हैं, तो आपको संग्रहीत प्रक्रिया में डेटा भेजने से पहले एक स्ट्रिंग को प्रतिस्थापित करने की आवश्यकता है।

उदाहरण के लिए, C # में आप कर सकते हैं

value = value.Replace("'", "''");

और फिर संग्रहीत कार्यविधि के लिए मान पास करें।


मैं मैन्युअल रूप से डेटा नहीं डाल रहा हूं, मैं इसे फाइल से निकालता हूं, और वहां vaklues: Ashok's pen होगा। इसे कैसे डालें। यह करने के लिए एक प्रक्रिया creaetd .. यह कैसे सही करने के लिए।
अशोक गुप्ता

एफडब्ल्यूआईडब्ल्यू माइनर नाइट: बैकस्लैश "द एस्केप कैरेक्टर" है; ''(दो एकल उद्धरण) एक एकल-उद्धरण चरित्र "भागने" के लिए एक विशेष विकल्प है।
टूलमेकरसेव

9

"MySQL में पात्रों से कैसे बचें" मेरा उत्तर देखें

जो भी लाइब्रेरी आप MySQL से बात करने के लिए उपयोग कर रहे हैं, उसमें एक एस्केपिंग फंक्शन होगा, जैसे कि PHP में आप mysqli_real_escape_string या PDO :: उद्धरण का उपयोग कर सकते हैं


1
मैं मैन्युअल रूप से डेटा नहीं डाल रहा हूं, मैं इसे फाइल से निकालता हूं, और इसमें मान होंगे: अशोक की कलम। इसे कैसे डालें। ऐसा करने के लिए एक प्रक्रिया बनाई गई .. इसे सही कैसे बनाया जाए।
अशोक गुप्ता

बस एक ध्यान दें, This extension was deprecated in PHP 5.5.0, and it was removed in PHP 7.0.0. Instead, the MySQLi or PDO_MySQL extension should be used.
न्यूबी

7

यदि आप तैयार किए गए कथनों का उपयोग करते हैं, तो चालक किसी भी भागने से बचाएगा। उदाहरण के लिए (जावा):

Connection conn = DriverManager.getConnection(driverUrl);
conn.setAutoCommit(false);
PreparedStatement prepped = conn.prepareStatement("INSERT INTO tbl(fileinfo) VALUES(?)");
String line = null;
while ((line = br.readLine()) != null) {
    prepped.setString(1, line);
    prepped.executeQuery();
}
conn.commit();
conn.close();

7

इस कोड का उपयोग करें:

<?php
    $var = "This is Ashok's Pen.";

    mysql_real_escape_string($var);
?>

यह आपकी समस्या का समाधान करेगा, क्योंकि डेटाबेस स्ट्रिंग के विशेष वर्णों का पता नहीं लगा सकता है।


1
बस एक ध्यान दें, This extension was deprecated in PHP 5.5.0, and it was removed in PHP 7.0.0. Instead, the MySQLi or PDO_MySQL extension should be used.
न्यूबी

6

ऐसा करने का एक और तरीका है जो आपके दृष्टिकोण के आधार पर सुरक्षित हो सकता है या नहीं भी हो सकता है। यह एक विशिष्ट स्ट्रिंग फ़ंक्शन के उपयोग के कारण MySQL 5.6 या बाद के संस्करण की आवश्यकता है FROM_BASE64:।

मान लें कि आपके पास यह संदेश है जिसे आप सम्मिलित करना चाहते हैं:

"आह," लगभग हेडलेस निक ने एक सुरुचिपूर्ण हाथ लहराया, "कोई महत्व की बात नहीं है।"। यह ऐसा नहीं है कि मैं वास्तव में शामिल होना चाहता था। सोचा था कि मैं आवेदन करूंगा, लेकिन जाहिर है मैं आवश्यकताओं को पूरा नहीं करता। '- "

उस उद्धरण में सिंगल और डबल-कोट्स का एक समूह है और MySQL में डालने के लिए एक वास्तविक दर्द होगा। यदि आप उस प्रोग्राम से इंसर्ट कर रहे हैं, तो कोट्स वगैरह से बचना आसान है, लेकिन, अगर आपको उसे एसक्यूएल स्क्रिप्ट में डालना है, तो आपको टेक्स्ट को (उद्धरणों से बचने के लिए) एडिट करना होगा, जिसमें त्रुटि हो सकती है या शब्द-रैपिंग आदि के प्रति संवेदनशील।

इसके बजाय, आप टेक्स्ट को बेस-एनकोड कर सकते हैं, इसलिए आपके पास "क्लीन" स्ट्रिंग है:

SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn VkSE1uSUMwaUlBPT0K

बेस 64-एन्कोडिंग के बारे में कुछ नोट:

  1. बेस 64-एन्कोडिंग एक द्विआधारी एन्कोडिंग है , इसलिए आप यह सुनिश्चित करेंगे कि एन्कोडिंग करते समय आप अपने चरित्र को सही कर लें, क्योंकि माईक्यूएल ने बेस 64-एनकोडेड स्ट्रिंग को बाइट्स में डिकोड करने जा रहा है और फिर उनकी व्याख्या करेगा। सुनिश्चित करें base64और MySQL इस बात पर सहमत है कि चरित्र एन्कोडिंग क्या है (मैं UTF-8 की सिफारिश करता हूं)।
  2. मैंने स्टैक ओवरफ्लो पर पठनीयता के लिए स्ट्रिंग को 50 कॉलम पर लपेटा है। आप इसे अपने इच्छित किसी भी कॉलम में लपेट सकते हैं (या बिलकुल भी नहीं लपेट सकते) और यह अभी भी काम करेगा।

अब, इसे MySQL में लोड करने के लिए:

INSERT INTO my_table (text) VALUES (FROM_BASE64(' SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn VkSE1uSUMwaUlBPT0K '));

यह बिना किसी शिकायत के सम्मिलित होगा, और आपको स्ट्रिंग के अंदर किसी भी पाठ को मैन्युअल रूप से बचाना नहीं था।


5

आपको चरित्र का उपयोग करके विशेष पात्रों से बचना चाहिए \

This is Ashok's Pen.

हो जाता है:

This is Ashok\'s Pen.

3

यदि आप डेटाबेस में एपॉस्ट्रॉफी (') रखना चाहते हैं तो नीचे दिए गए कोड का उपयोग करें

$new_value = str_replace("'","\'", $value); 

$ new_value डेटाबेस में स्टोर कर सकते हैं।


3

आप इस कोड का उपयोग कर सकते हैं,

<?php
     $var = "This is Ashok's Pen.";
     addslashes($var);
?>

अगर mysqli_real_escape_string () काम नहीं करता है।


3

PHP में, mysqli_real_escape_string का उपयोग करें

PHP मैनुअल से उदाहरण:

<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

mysqli_query($link, "CREATE TEMPORARY TABLE myCity LIKE City");

$city = "'s Hertogenbosch";

/* this query will fail, cause we didn't escape $city */
if (!mysqli_query($link, "INSERT into myCity (Name) VALUES ('$city')")) {
    printf("Error: %s\n", mysqli_sqlstate($link));
}

$city = mysqli_real_escape_string($link, $city);

/* this query with escaped $city will work */
if (mysqli_query($link, "INSERT into myCity (Name) VALUES ('$city')")) {
    printf("%d Row inserted.\n", mysqli_affected_rows($link));
}

mysqli_close($link);
?>



0

प्रोग्रामेटिक एक्सेस के लिए, आप प्लेसहोल्डर्स का उपयोग कर सकते हैं का करके आपके लिए असुरक्षित वर्णों से स्वचालित रूप से बच सकते हैं।

उदाहरण के लिए, पर्ल डीबीआई में, आप उपयोग कर सकते हैं:

my $string = "This is Ashok's pen";
$dbh->do("insert into my_table(my_string) values(?)",undef,($string)); 

0

Addlahes () या mysql_real_escape_string () का उपयोग करें।


बस एक ध्यान दें, This, mysql_real_escape_string() extension was deprecated in PHP 5.5.0, and it was removed in PHP 7.0.0. Instead, the MySQLi or PDO_MySQL extension should be used.
न्यूबी


अपने उत्तर को अपडेट करना बेहतर होगा (जैसे कि टिप्पणियां किसी भी समय गायब हो सकती हैं)।
पीटर मोर्टेंसन

0

डेल्फी का उपयोग करके मैं जिस तरह से करता हूं:

"भागने" के लिए स्ट्रिंग:

TheString=" bla bla bla 'em some more apo:S 'em and so on ";

उपाय:

StringReplace(TheString, #39,'\'+#39, [rfReplaceAll, rfIgnoreCase]);

परिणाम:

TheString=" bla bla bla \'em some more apo:S \'em and so on ";

यह फ़ंक्शन सभी चार (39) को "\" के साथ बदल देगा, जिससे आप बिना किसी समस्या के MySQL में टेक्स्ट फ़ील्ड सम्मिलित या अपडेट कर सकते हैं।

सभी प्रोग्रामिंग भाषाओं में समान कार्य पाए जाते हैं!


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.