Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

PHP Mysql PDO बाध्य चर की संख्या टोकन की संख्या से मेल नहीं खाती

ऐसा लगता है कि मार्क बेकर ने आपके प्रश्न का उत्तर पहले ही दे दिया है, लेकिन मैं कुछ युक्तियों को जोड़ना चाहता था जिनसे मुझे बहुत मदद मिली है।

पीडीओ को 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 कथनों को बहु-पंक्तिबद्ध (ऊपर की तरह) स्वरूपित करना शुरू कर दिया है और जब से मेरे पास इस तरह की कम त्रुटियां हैं। यह करता है बहुत जगह ले लो, लेकिन मुझे लगता है कि अंत में यह इसके लायक है। सब कुछ व्यवस्थित करके, यह त्रुटियों को गले में खराश की तरह बना देता है।

हैप्पी कोडिंग!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ग्रुप बाय क्वेरी के साथ पंक्तियों की संख्या प्राप्त करना

  2. php / Mysql सर्वश्रेष्ठ वृक्ष संरचना

  3. MySQL बूलियन टिनिंट (1) 127 तक मान रखता है?

  4. एक mysql डेटा संस्करण प्रणाली के लिए सर्वोत्तम अभ्यास

  5. अद्वितीय mysql अनुक्रमणिका से नवीनतम डेटाटाइम