2011-09-15 9 views
6
function cpanel_populate_database($dbname) 
{ 
    // populate database 
    $sql = file_get_contents(dirname(__FILE__) . '/PHP-Point-Of-Sale/database/database.sql'); 
    $mysqli->multi_query($sql); 

    $mysqli->close(); 
} 

एसक्यूएल फ़ाइल phpMyAdmin से एक सीधा निर्यात है और समय की लगभग 95% मुद्दे के बिना चलाता है और सभी तालिकाओं बनाई गई हैं और डेटा डाला जाता है। (मैं स्क्रैच से डेटाबेस बना रहा हूं)mysql multi_query रुक-रुक कर विफल रहता है

अन्य 5% केवल पहली तालिका या कभी-कभी पहली 4 टेबल बनाई जाती हैं, लेकिन अन्य तालिकाओं में से कोई भी नहीं बनाया जाता है (30 टेबल हैं)।

मैंने बहु_क्विरी का उपयोग नहीं करने का निर्णय लिया है क्योंकि यह छोटी गाड़ी लगता है और यह देखता है कि बग अर्ध-कॉलन के बाद प्रत्येक पंक्ति पर केवल mysql_query का उपयोग करके होता है या नहीं। क्या कोई इस तरह के मुद्दे में भाग गया है?

उत्तर

2

मैं जब प्रश्नों कि बना सकते हैं या टेबल को बदल सकते हैं के साथ multi_query का उपयोग कर इसी तरह के मुद्दों को देखा है। विशेष रूप से, मुझे InnoDB 1005 त्रुटियां मिलती हैं जो विदेशी कुंजी से संबंधित प्रतीत होती हैं; ऐसा लगता है कि MySQL अगले पर जाने से पहले एक कथन पूरी तरह खत्म नहीं करता है, इसलिए विदेशी कुंजियों में उचित संदर्भ नहीं है।

एक सिस्टम में, मैंने समस्याग्रस्त बयानों को अपनी फाइलों में विभाजित किया। दूसरे में, मैंने वास्तव में प्रत्येक आदेश को अलग से चलाया है, अर्धविरामों पर विभाजित:

function load_sql_file($basename, $db) { 
    // Todo: Trim comments from the end of a line 
    log_upgrade("Attempting to run the `$basename` upgrade."); 

    $filename = dirname(__FILE__)."/sql/$basename.sql"; 
    if (!file_exists($filename)) { 
     log_upgrade("Upgrade file `$filename` does not exist."); 
     return false; 
    } 

    $file_content = file($filename); 
    $query = ''; 
    foreach ($file_content as $sql_line) { 
     $tsl = trim($sql_line); 
     if ($sql_line and (substr($tsl, 0, 2) != '--') and (substr($tsl, 0, 1) != '#')) { 
      $query .= $sql_line; 
      if (substr($tsl, -1) == ';') { 
       set_time_limit(300); 
       $sql = trim($query, "\0.. ;"); 
       $result = $db->execute($sql); 
       if (!$result) { 
        log_upgrade("Failure in `$basename` upgrade:\n$sql"); 
        if ($error = $db->lastError()) { 
         log_upgrade("$error"); 
        } 

        return false; 
       } 

       $query = ''; 
      } 
     } 
    } 

    $remainder = trim($query); 
    if ($remainder) { 
     log_upgrade("Trailing text in `$basename` upgrade:\n$remainder"); 
     if (DEBUG) trigger_error('Trailing text in upgrade script: '.$remainder, E_USER_WARNING); 
     return false; 
    } 

    log_upgrade("`$basename` upgrade successful."); 
    return true; 
} 
0

मैंने कभी बहु-क्वेरी का सहारा लिया नहीं है। जब मुझे ऐसा कुछ चाहिए, तो मैं mysqli पर चले गए। साथ ही, यदि आपको क्वेरी से किसी भी परिणाम की आवश्यकता नहीं है, तो स्क्रिप्ट को mysql_query पर पास करने से भी काम होगा। यदि आप गलत क्रम में निर्यात करते हैं तो विदेशी त्रुटियों और अन्य लोगों के लिए आवश्यक तालिकाओं के साथ संघर्ष करने पर आपको उन त्रुटियां भी मिलेंगी।

0

मुझे लगता है कि एकल फ़ाइल में SQL फ़ाइल को तोड़ने का दृष्टिकोण एक अच्छा विचार होगा। यहां तक ​​कि अगर यह सिर्फ तुलना उद्देश्यों के लिए है (यह देखने के लिए कि क्या यह समस्या हल करता है)।

इसके अलावा, मुझे यकीन नहीं है कि आपकी फ़ाइल कितनी बड़ी है - लेकिन मेरे पास कुछ ऐसे मामले हैं जहां फ़ाइल अविश्वसनीय रूप से बड़ी थी और इसे बैच में विभाजित करने का काम था।

12

फास्ट और प्रभावी

system('mysql -h #username# -u #username# -p #database# < #dump_file#'); 
संबंधित मुद्दे