ऐसा लगता है कि मार्क बेकर ने आपके प्रश्न का उत्तर पहले ही दे दिया है, लेकिन मैं कुछ युक्तियों को जोड़ना चाहता था जिनसे मुझे बहुत मदद मिली है।
पीडीओ को mysql_escape_string
की आवश्यकता नहीं है
जब तक उपयोगकर्ता इनपुट से संबंधित आपकी क्वेरी में जाने वाली हर चीज एक तैयार कथन का उपयोग कर रही है (जैसे आप ऊपर हैं) आपको mysql_real_escape_string
के साथ इनपुट से बचने की आवश्यकता नहीं है [1].
// Don't worry about SQL injection since all of the user
// defined inputs are being escaped by the PDO package
$sql = "INSERT INTO "
. "`users` "
. "SET "
. "`name` = :name";
$query = $pdo->prepare($sql);
$query->bindParam(':name', $name);
$query->execute();
लेकिन इस बात से अवगत रहें कि यदि आप उपयोगकर्ता इनपुट को बाध्य नहीं कर रहे हैं तो SQL इंजेक्शन अभी भी संभव है:
// SQL injection can totally happen here
$sql = "INSERT INTO "
. "`users` "
. "SET "
. "`name` = $name";
$query = $pdo->prepare($sql);
$query->execute();
[1] http://www.php.net/manual/ hi/pdo.prepared-statements.php
अपने SQL को यथासंभव छोटा बनाने का प्रयास करें
साधारण SQL कथनों के लिए, यह जितना छोटा होगा, इसे बनाए रखना उतना ही आसान होगा और आपसे गलतियाँ होने की संभावना कम होगी। आप एक वैकल्पिक INSERT सिंटैक्स का उपयोग कर सकते हैं[2]:
INSERT INTO
`users`
SET
`name` = 'Steve';
के बराबर है:
INSERT INTO
`users`
(
`name`
)
VALUES
(
'Steve'
);
इसका मतलब है कि आपके जैसे बड़े बयानों के लिए, आप प्रभावी रूप से आधा . कर सकते हैं इसका आकार क्योंकि आपको सभी कॉलम नामों को दोहराने की आवश्यकता नहीं है:
$sql = "INSERT INTO "
. "`records_rec` "
. "SET "
. "`oldid_rec` = :oldid_rec, "
. "`firstname_rec` = :firstname_rec, "
. "`artist_rec` = :artist_rec, "
. "`aside_rec` = :aside_rec, "
. "`bside_rec` = :bside_rec, "
. "`label_rec` = :label_rec, "
. "`condition_rec` = :condition_rec, "
. "`genere_rec` = :genere_rec, "
. "`price_rec` = :price_rec, "
. "`collection_rec` = :collection_rec, "
. "`active_rec` = :active_rec, "
. "`info_rec` = :info_rec, "
. "`notes_rec` = :notes_rec, "
. "`order_rec` = :order_rec, "
. "`alabelimage_rec` = :alabelimage_rec, "
. "`blabelimage_rec` = :blabelimage_rec, "
. "`asound_rec` = :asound_rec, "
. "`bsound_rec` = :bsound_rec, "
. "`featured_rec` = :featured_rec, "
. "`format_rec` = :format_rec";
$dbh = new PDO(<info goes here>);
$stmt = $dbh->prepare($sql);
// Bind your params here...
[2] http://dev.mysql.com/doc/ refman/5.5/hi/insert.html
अपने SQL कथनों को बहु-पंक्ति और सुंदर बनाएं
मैंने अपने SQL कथनों को बहु-पंक्तिबद्ध (ऊपर की तरह) स्वरूपित करना शुरू कर दिया है और जब से मेरे पास इस तरह की कम त्रुटियां हैं। यह करता है बहुत जगह ले लो, लेकिन मुझे लगता है कि अंत में यह इसके लायक है। सब कुछ व्यवस्थित करके, यह त्रुटियों को गले में खराश की तरह बना देता है।
हैप्पी कोडिंग!