2008-12-06 16 views
9

तो मेरे पास एक SQL डंप फ़ाइल है जिसे mysql_query() का उपयोग करके लोड किया जाना आवश्यक है। दुर्भाग्यवश, इसके साथ कई प्रश्न निष्पादित करना संभव नहीं है।PHP: एक mysql_query कथन में एकाधिक SQL क्वेरी

-> यह नहीं माना जा सकता कि mysql कमांड लाइन ग्राहक (mysql --help) स्थापित किया गया है - एसक्यूएल फ़ाइल सीधे

लोड करने के लिए -> यह नहीं माना जा सकता कि mysqli एक्सटेंशन

/* contents of dump.sql, including comments */ 
DELETE FROM t3 WHERE body = 'some text; with semicolons; scattered; throughout'; 
DELETE FROM t2 WHERE name = 'hello'; 
DELETE FROM t1 WHERE id = 1; 

नीचे विस्फोट() नीचे काम नहीं करेगा क्योंकि डंप सामग्री के कुछ मूल्यों में अर्धविराम होता है।

$sql = explode(';', file_get_contents('dump.sql')); 
foreach ($sql as $key => $val) { 
    mysql_query($val); 
} 

डंप फ़ाइल को संशोधित किए बिना SQL लोड करने का सबसे अच्छा तरीका क्या है?

उत्तर

12

स्ट्रिंग के भीतर अर्धविरामों की तुलना में आपको अधिक समस्याएं हैं।

  • स्क्रिप्ट builtin आदेशों USE की तरह, mysql_query() द्वारा निष्पादित नहीं किया जा सकता।
  • विवरण जो अर्धविराम से समाप्त नहीं होते हैं, जैसे DELIMITER
  • अर्धविराम वाले वक्तव्य, लेकिन उद्धरण के अंदर नहीं, जैसे CREATE PROCEDURE

मैं इस कार्य को संभालने का आसान तरीका नहीं जानता, बिना mysql कमांड लाइन क्लाइंट को खोलने के। मुझे एहसास हुआ कि आपने कहा है कि आप उस ग्राहक पर भरोसा नहीं कर सकते हैं, लेकिन उस ग्राहक के बिना, आपको स्क्रिप्ट को पार्स करने और उचित रूप से कथन निष्पादित करने के लिए बड़ी संख्या में PHP कोड की आवश्यकता है।

आप phpMyAdmin उत्पाद के अंदर ऐसे कोड को खोजने में सक्षम हो सकते हैं। हालांकि, उस उत्पाद को जीपीएल के तहत लाइसेंस प्राप्त है, इसलिए यदि आप किसी भी कोड का उपयोग करते हैं, तो आपको जीपीएल के तहत अपनी परियोजना का लाइसेंस भी देना होगा।


इन से संबंधित प्रश्नों के लिए भी अपने जवाब देखें:

6

Occam के रेजर फिर हमलों।

उपरोक्त विस्फोट() फ़ंक्शन काम नहीं करेगा क्योंकि मूल्यों में अर्धविराम हैं। हालांकि, जो मैं महसूस करने में विफल रहा (और उल्लेख) यह है कि अर्धविराम हमेशा एसक्यूएल डंप फ़ाइल में न्यूलाइन को आगे बढ़ाते हैं। अफसोस,

$sql = explode(";\n", file_get_contents('dump.sql')); 
foreach ($sql as $key => $val) { 
    mysql_query($val); 
} 

इसके अलावा, तुम्हारी मदद की, बिल के लिए धन्यवाद।

+0

आपके पास लाइन के अंत में अर्धविराम के मामले हैं, लेकिन यह एक कथन का अंत नहीं है, उदाहरण के लिए एक प्रक्रिया या ट्रिगर परिभाषा के शरीर के अंदर। और DELIMITER जैसे बयान जो अर्धविराम में समाप्त नहीं होते हैं। –

3

यहां एक बड़ा मुद्दा है। आपके पास ऐसे बयान हो सकते हैं जो अन्य बयानों पर भरोसा करते हैं। आप उन्हें अंधाधुंध रूप से अंधाधुंध निष्पादित नहीं कर सकते हैं।

+0

प्रश्नों की सूची चलाने से पहले अनन्य चेक और विदेशी कुंजी जांच को अनदेखा करने के लिए हमेशा mysql को बता सकता है जो क्वेरी ऑर्डर के साथ कई मुद्दों को हल करेगा। – enobrev

+0

दाएं, डेटा अखंडता को संरक्षित करने के लिए लागू स्वच्छता जांच को अनदेखा करने के लिए डेटाबेस को बताएं, यह सफल होने का एक निश्चित अग्नि तरीका है। – FlySwat

+0

@enobrev: और यदि आप बाद में सैनिटी जांच को चालू करते हैं तो क्या होगा? ठीक ठीक; अधिक समस्याएं – Kris

0
<?php 
//STATIC QUERY 
$sql1 = " 
CREATE TABLE tblTable (
strOne VARCHAR(50) NOT NULL, 
strTwo VARCHAR(50) NOT NULL, 
strThree VARCHAR(50) NOT NULL 
); 
INSERT INTO tblTable 
(strOne, strTwo, strThree) 
VALUES ('String 1', 'String 2', 'String 3'); 
UPDATE tblTable 
SET 
strOne = 'String One', 
strTwo = 'String Two' 
WHERE strThree = 'String 3'; 
"; 
//GET FROM FILE 
$sql2 = file_get_contents('dump.sql'); 
$queries = preg_split("/;+(?=([^'|^\\\']*['|\\\'][^'|^\\\']*['|\\\'])*[^'|^\\\']*[^'|^\\\']$)/", $sql); 
foreach ($queries as $query){ 
    if (strlen(trim($query)) > 0) mysql_query($query); 
} 
?> 
संबंधित मुद्दे