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

नामित प्लेसहोल्डर्स का उपयोग करते समय PHP/SQL त्रुटि सम्मिलित करें

आपका $userData बिल्कुल वही प्लेसहोल्डर होना चाहिए जो आपके कथन से बंधे हों, न अधिक और न कम। देखें PDOStatement::execute दस्तावेज़ीकरण , वह भाग जो कहता है "आप निर्दिष्ट से अधिक मानों को बाध्य नहीं कर सकते"।

आपको execute() . के लिए अपना तर्क तैयार करना होगा अपने बाइंड्स से बिल्कुल मेल खाने के लिए। यह array_intersect_key() . के साथ आसान है यदि आप अपने सरणियों को सही ढंग से व्यवस्थित करते हैं। मैं आमतौर पर इसे एक फ़ंक्शन में लपेटता हूं जो नीचे की तरह उपसर्ग का भी ध्यान रखेगा:

// Adds a prefix to a name for a named bind placeholder
function prefix($name) {
    return ':'.$name;
}

// like 'prefix()', but for array keys
function prefix_keys($assoc) {
    // prefix STRING keys
    // Numeric keys not included
    $newassoc = array();
    foreach ($assoc as $k=>$v) {
        if (is_string($k)) {
            $newassoc[prefix($k)] = $v;
        }
    }
    return $newassoc;
}

// given a map of datakeyname=>columnname, and a table name, returns an
// sql insert string with named bind placeholder parameters.
function makeInsertStmt($tablename, $namemap) {
    $binds = array_map('prefix', array_keys($namemap));
    return 'INSERT INTO '.$tablename.' ('.implode(',',$namemap).') VALUES ('
    .implode(',',$binds).')';
}

// returns an array formatted for an `execute()`
function makeBindData($data, $namemap) {
    // $data assoc array, $namemap name->column mapping
    return prefix_keys(array_intersect_key($data, $namemap));
}

// example to demonstrate how these pieces fit together
function RunTestInsert(PDO $pdo, $userData) {
    $tablename = 'UserDetails';
    // map "key in $userData" => "column name"
    // do not include ':' prefix in $userData
    $namemap = array(
      'firstName'       => "FirstName",
      'lastName'        => "LastName",
      'address'         => "Address",
      'city'            => "City",
      'county'          => "County",
      'postCode'        => "PostCode",
      'phone'           => "Phone",
      'mobile'          => "Mobile",
      'sex'             => "Sex",
      'DOB'             => "DOB",
      'fundraisingAim'  => "FundraisingAim",
      'weeksAim'        => "WeeksAim",
      'lengthsAim'      => "LengthsAim",
      'hearAbout'       => "HearAboutID",
      'motivation'      => "MotivationID",
      'welcomePackPref' => "WelcomePackID",
      'contactPref'     => "ContactPrefID",
      'title'           => "TitleID",
    );
    $sql = makeInsertStmt($tablename, $namemap);
    $binddata = makeBindData($userData, $namemap);

    $pstmt = $pdo->prepare($sql);
    $pstmt->execute($binddata);
}

इस तरह के एब्स्ट्रैक्शन का लाभ यह है कि आपको स्वयं बाइंड पैरामीटर के बारे में चिंता करने की आवश्यकता नहीं है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mySql में सेकंड (या मिलीसेकंड) को टाइमस्टैम्प (या सिर्फ एक स्ट्रिंग जो एक तारीख की तरह दिखती है) में कैसे परिवर्तित करता है

  2. MySQL :विखंडू द्वारा एक बड़े चयन को पुनः प्राप्त करें

  3. 127.0.0.1 . के साथ mysql से कनेक्ट नहीं हो सकता

  4. MySQL 'अपडेट के लिए चयन करें' व्यवहार

  5. सबसे हालिया रिकॉर्ड द्वारा लारवेल एलोक्वेंट समूह