2011-01-01 18 views
5

मुझे MySQL वर्कबेंच के साथ कई संग्रहित प्रक्रियाएं मिली हैं। जब वे MySQL वर्कबेंच का उपयोग अपने परीक्षण डीबी में डालते हैं तो वे ठीक काम करते हैं।PHP से mySQL में संग्रहीत प्रक्रियाओं को कैसे सम्मिलित/बनाएँ?

अब मैं तैनाती के लिए डीबी निर्माण स्क्रिप्ट तैयार कर रहा हूं, और यह केवल मुझे परेशानी दे रहा है। जब मैं कमांड लाइन/mysql खोल का उपयोग करता हूं, तो स्क्रिप्ट पूरी तरह से अच्छी तरह से काम करती है। यह केवल तब होता है जब मैं स्क्रिप्ट निष्पादित करने के लिए PHP mysql (i) इंटरफ़ेस का उपयोग करता हूं - यह विफल रहता है। टिप्पणी के बीना।

मैं प्रक्रिया निर्माण स्क्रिप्ट का उपयोग करता हूं क्योंकि MySQL वर्कबेंच मेरे लिए उत्पन्न करता है; कि है, यह इस पद्धति है:

SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0; 
SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; 
SET @[email protected]@SQL_MODE, SQL_MODE='TRADITIONAL'; 
स्क्रिप्ट के शुरू में

, तो प्रत्येक प्रक्रिया के लिए दोहरा:

DELIMITER $$ 
USE `dbname`$$ 
CREATE PROCEDURE `procname`(IN inputparameters) 
BEGIN 

... प्रक्रिया यहाँ

; 
END$$ 
DELIMITER ; 

यह स्क्रिप्ट चला जाता है MySQL वर्कबेंच से चलने पर ठीक काम करता है। अगर मैं mysql कमांडलाइन से भी कोशिश करता हूं तो यह भी ठीक चलता है। लेकिन जब मैं इसे PHP mysqli इंटरफ़ेस (mysqli_multi_query के साथ निष्पादित करता हूं) के माध्यम से इसे निष्पादित करता हूं, तो यह कुछ भी पूरा करने में विफल रहता है, जो डीबी बनाने और पॉप्युलेट करने वाली अन्य स्क्रिप्ट के लिए ठीक काम करता है)। इंटरफ़ेस पर कोई त्रुटि नहीं आई है, कोई परिणाम नहीं (!)। मुझे जो भी मिलता है वह "झूठा" है, और यही वह है। त्रुटि कोड 0 पर है, कोई त्रुटि संदेश नहीं है।

यह मेरे लिए एक बड़ा डब्ल्यूटीएफ है, और मुझे उम्मीद है कि आप मुझे सही दिशा में इंगित कर सकते हैं - मैं इसे कैसे ठीक कर सकता हूं और PHP से प्रक्रियाओं को स्थापित कर सकता हूं?

पीएस: रूट/व्यवस्थापक पहुंच दी जाती है और सत्यापित की जाती है (आखिरकार, मैंने डीबी को उसी कनेक्शन के साथ बनाया है, उपयोगकर्ताओं को बनाया है, टेबल डाला है और इसी तरह)।

+0

उपयोग 'dbname' को हटाने का प्रयास करें। Mysqli_query कमांड का उपयोग करते समय भी चलाने का प्रयास करें। – Knubo

+0

मैंने उस यूईईई स्टेटमेंट को हटा दिया, कोई प्रभाव नहीं। mysqli_query भी विफल रहता है - और इस मामले में यह स्पष्ट है कि क्यों: स्ट्रिंग में कई कथन होते हैं, इसलिए यदि यह * सही तरीके से प्रदर्शन कर रहा था, तो यह कई परिणाम लौटाएगा - जो mysqli_query संभाल नहीं करता है। - अन्य स्क्रिप्ट के लिए, mysqli_multi_query पूरी तरह से ठीक काम करता है, प्रत्येक कथन के लिए एक परिणाम पंक्ति लौटाता है। (सफलता पर खाली पंक्तियां, नोट: 1051 लाइनें चेतावनी दिखाने के लिए प्रतिक्रिया के रूप में; - जैसा कि अपेक्षित है)। – foo

+0

मैं करीब आ रहा हूं - कोई समाधान नहीं, लेकिन निदान। लगता है कि DELIMITER क्लाइंट-साइड (!) लागू किया गया है। – foo

उत्तर

5

मैंने परीक्षण नहीं किया है, लेकिन मुझे mysqli_multi_query() द्वारा आश्चर्यचकित नहीं होगा, प्रत्येक प्रश्न के समान डिलीमीटर होने की उम्मीद है। DELIMITER संशोधक का उपयोग किये बिना, एक ही क्वेरी में संग्रहित प्रक्रिया निर्माण को पैक करने का प्रयास करें?

तो बजाय

<?php 
$results = mysqli_multi(
    'DELIMITER $$ 
    USE `dbname`$$ 
    CREATE PROCEDURE `procname`(IN inputparameters) 
    BEGIN 
    ... procedure goes here 

    ; 
    END$$ 
    DELIMITER ; 
'); 
?> 

बस इस

<?php 
$result = mysqli_query('CREATE PROCEDURE `procname`(IN inputparameters) BEGIN ...; END'); 

करते हैं और हमें बताएं कि यह काम करता है :)

+2

यह काम करता है, तरह। जैसा कि मैंने पहले लिखा था, DELIMITER क्लाइंट-साइड लागू किया गया प्रतीत होता है, और PHP mysql (i) इंटरफ़ेस में कुछ हिस्सों को याद किया जा रहा है जो MySQL क्लाइंट लागू होते हैं - जैसे DELIMITER। यह लागू नहीं होता है DELIMITER बिल्कुल। तो प्रक्रियाओं को अलग से और बिना DELIMITER काम करता है। हालांकि, मुझे नहीं लगता कि दिनचर्या को फिर से लिखना एक व्यवहार्य समाधान है। यह काफी दिनचर्या है, और भविष्य में और भी कुछ होगा। मुझे ऐसा कुछ चाहिए जो * मेरे द्वारा दिए गए टूल्स * के साथ काम करता है, फिर से नहीं। लेकिन विचार के लिए धन्यवाद, यह दूसरों की मदद कर सकता है। – foo

+1

धन्यवाद, मुझे एक ही समस्या हो रही थी, बनाने की कोशिश कर रहा था, और mysqli_multi_query से संग्रहीत प्रक्रिया निष्पादित कर रहा था और यह HeidiSQL से काम करता था, हालांकि जब मैंने PHP से एक ही कोड निष्पादित किया तो यह एक त्रुटि फेंक दिया। मैंने अपने DELIMETER कथन हटा दिए, और किसी भी लाइन ब्रेक और यह पूरी तरह से काम किया। धन्यवाद! : डी – Jared

+0

प्रश्न: कैसे जांचें कि संग्रहीत प्रसंस्करण पहले से मौजूद है, PHP से? –

-3

परिसीमक कुछ है कि mysql क्लाइंट अनुप्रयोग वास्तव में उपयोग करता है। मेरा मानना ​​है कि क्लाइंट एप्लिकेशन माईस्क्ल को भेजे गए प्रश्नों को तोड़ने के लिए ज़िम्मेदार है। उदाहरण के लिए, PHPMyAdmin करता है।

माईएसक्यूएल को प्रश्नों में पार्स करने के लिए पूरी रात एक स्क्रिप्ट लिखने के बजाय, मैंने जो कोड लिखा था उसका उपयोग करें।आप scriptToQueries समारोह में मिलेगा, यहाँ:

http://wush.net/svn/luckyapps/pie/trunk/framework/classes/Db/Mysql.php

आनंद

संपादित करें: इस उत्तर मैं मुक्त क्यू मंच में कोड भेजा है जिसमें आप कोड का अध्ययन कर सकते लेखन के बाद से: https://github.com/EGreg/Platform/blob/master/platform/classes/Db/Mysql.php#L824

+0

जो सीधे दाएं दिशा में चला गया। धन्यवाद! – foo

+4

लिंक ''htaccess' /' .htpasswd' पासवर्ड संरक्षित पृष्ठ का संदर्भ देता है। – automatix

+0

ठीक है दोस्तों अब कोशिश करें –

0

इसे समेटने के लिए:

DELIMITER क्लाइंट-साइड लागू किया गया है, सर्वरसाइड नहीं।

यदि आपके पास कोई अच्छा ड्राइवर या एपीआई है, तो इसका ख्याल रख सकता है। PHP mysql/mysqli, अभी तक, नहीं।

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

संबंधित मुद्दे