2014-09-24 7 views
9

के माध्यम से एक MySQL फ़ंक्शन बनाना समस्या मैंने एक सीएलआई PHP स्क्रिप्ट बनाई है जो मुझे मेरे डेटाबेस के खिलाफ अद्यतन स्क्रिप्ट चलाने की अनुमति देने के लिए डिज़ाइन किया गया है। स्क्रिप्ट अपेक्षित के रूप में काम करता है, अनुक्रमिक अद्यतन फ़ाइलों को चलाता है, त्रुटियों पर वापस रोल करता है, आदि। हालांकि, केवल एक चीज जिसे मैं ठीक से करने के लिए नहीं मिल सकता वह कार्य बना रहा है। मैं क्या खो रहा हूँ?पीडीओ


स्क्रिप्ट

यहाँ कैसे स्क्रिप्ट काम करता है की मूल बातें है:

$sql = file_get_contents($file); 
$sql = "USE `$database`;" . $sql; 
$stmt = $pdo->prepare($sql); 

try 
{ 
    $stmt->execute(); 

    if($stmt->errorCode() !== '00000') 
    { 
     throw new Exception("Error: Unable to run update $file\n" . print_r($stmt->errorInfo(), true)); 
    } 
} 
catch(Exception $ex) 
{ 
    $pdo->rollBack(); 
    echo "Error: Exception occured running update $file\n" . print_r($ex, true) . "\n"; 
    throw $ex; 
} 

एसक्यूएल

और यहाँ के समारोह भागों का एक उदाहरण है एसक्यूएल सह डी:

DELIMITER ;; 
CREATE DEFINER=CURRENT_USER FUNCTION `uuid_from_bin`(b BINARY(16)) RETURNS char(36) CHARSET latin1 
    DETERMINISTIC 
BEGIN 
    DECLARE hex CHAR(32); 
    SET hex = HEX(b); 
    RETURN LOWER(CONCAT(LEFT(hex, 8), '-', MID(hex, 9,4), '-', MID(hex, 13,4), '-', MID(hex, 17,4), '-', RIGHT(hex, 12))); 
RETURN 1; 
END ;; 

यदि मैं इस कोड को MySQL वर्कबेंच के अंदर चलाता हूं तो यह अपेक्षा के अनुसार चलता है। जब मैं इसे पीडीओ का उपयोग करके अपनी स्क्रिप्ट के माध्यम से चलाता हूं, तो कार्यों को छोड़कर और पॉप्युलेट किया जाता है। मुझे कोई त्रुटि नहीं है और कोई अपवाद नहीं है।


सो फार ...

मैं definer को दूर करने की कोशिश की है, यह सोचकर कि उपयोगकर्ता था कि "CURRENT_USER" हो सकता है 'उपयोगकर्ता @ randomip' और प्रणाली में उपयोगकर्ता परिभाषित किया गया है 'उपयोगकर्ता @%' के रूप में।

मैंने SQL से निश्चित को भी हटा दिया। अभी भी MySQL वर्कबेंच में काम करता है, लेकिन इस स्क्रिप्ट में नहीं।

मैंने फ़ंक्शन को अपने स्वयं के एसक्यूएल में भी खींच लिया है, वही परिणाम।


अन्य जानकारी

MySQL 5.5.37-0ubuntu0.14.04.1

पीएचपी 5.5

जब मैं मैं डीबी की स्थापना नहीं कर रहा हूँ, क्योंकि पीडीओ के साथ कनेक्ट स्क्रिप्ट को डेटाबेस बनाने की आवश्यकता हो सकती है। लेकिन स्क्रिप्ट को उपयोग कथन के साथ जोड़ा गया है। फिर अन्य सभी डीडीएल बयान काम करते हैं।

उपयोगकर्ता सभी लेकिन अनुदान एक पैटर्न के आधार पर स्कीमा पर अनुमतियाँ, विशेष रूप से ci_%


समाधान, अद्यतन परिसीमक

परिसीमक दूर करने के लिए कोड अपडेट किया गया है

#DELIMITER USED TO BE HERE 
CREATE DEFINER=CURRENT_USER FUNCTION `uuid_from_bin`(b BINARY(16)) RETURNS char(36) CHARSET latin1 
    DETERMINISTIC 
BEGIN 
    DECLARE hex CHAR(32); 
    SET hex = HEX(b); 
    RETURN LOWER(CONCAT(LEFT(hex, 8), '-', MID(hex, 9,4), '-', MID(hex, 13,4), '-', MID(hex, 17,4), '-', RIGHT(hex, 12))); 
RETURN 1; 
END; 
+0

संग्रहीत प्रक्रिया का नाम क्या है? आप आमतौर पर 'sp_nameOfStoredProc कॉल करेंगे' ' –

+0

वर्कबेंच से और आपके PHP कोड से डीबी में लॉग इन करने की क्या अनुमतियां हैं? विभिन्न उपयोगकर्ता = अलग अनुमति सेट। –

+0

@JayBlanchard यह SQL कोड वाला एक फ़ाइल है जो एक फ़ंक्शन को परिभाषित कर रहा है, संग्रहीत प्रक्रिया नहीं। कार्यों में से एक प्रश्न में सूचीबद्ध है। – Chris

उत्तर

7

जब आप पीडीओ जैसे एपीआई के माध्यम से कोई कथन सबमिट करते हैं तो आपको DELIMITER का उपयोग करने की आवश्यकता नहीं है।

वास्तव में, आप DELIMITER का उपयोग नहीं करना चाहिए, क्योंकि यह सर्वर के SQL पार्सर द्वारा मान्यता प्राप्त नहीं है। यह केवल MySQL क्लाइंट में मान्यता प्राप्त है।

+0

मैंने वास्तव में सफलता के बिना पहले कोशिश की थी, और मुझे लगता है कि समस्या से दूर कदम उठाने और फिर से प्रयास करने से मैंने कुछ अलग किया। हल कोड के साथ सवाल अद्यतन किया। धन्यवाद। – Chris