के माध्यम से एक 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;
संग्रहीत प्रक्रिया का नाम क्या है? आप आमतौर पर 'sp_nameOfStoredProc कॉल करेंगे' ' –
वर्कबेंच से और आपके PHP कोड से डीबी में लॉग इन करने की क्या अनुमतियां हैं? विभिन्न उपयोगकर्ता = अलग अनुमति सेट। –
@JayBlanchard यह SQL कोड वाला एक फ़ाइल है जो एक फ़ंक्शन को परिभाषित कर रहा है, संग्रहीत प्रक्रिया नहीं। कार्यों में से एक प्रश्न में सूचीबद्ध है। – Chris