2011-10-27 15 views
5

मान लीजिए कि मेरे पास 1995 का फैशन फ़ंक्शन है जो mysql को प्रश्न भेजने के लिए है। मेरे पास मेरे प्रोजेक्ट पर बहुत सारे प्रश्न हैं और मैं कच्चे प्रश्न को पार्स करने में सक्षम फ़ंक्शन/क्लास की तलाश में हूं (मान लीजिए: बार से चुनें foo जहां पिज्जा = 'हॉट' LIMIT 1) और php के साथ एक तैयार कथन बनाएं। क्या आपके पास कोई सुझाव है? क्या यह इसके लायक है? या बस सभी प्रश्नों को फिर से लिखना बेहतर है?कच्चे प्रश्नों को तैयार कथन में परिवर्तित करना

मैं अपने प्रोजेक्ट पर 424 प्रश्नों भरोसा कर सकते हैं, और कहा कि बस का चयन करता है किसी भी मदद

उत्तर

3

इस प्रयास करें:

function prepare1995Sql_EXAMPLE ($sqlString) { 

    # regex pattern 
    $patterns = array(); 
    $patterns[0] = '/\'.*?\'/'; 

    # best to use question marks for an easy example 
    $replacements = array(); 
    $replacements[0] = '?'; 

    # perform replace 
    $preparedSqlString = preg_replace($patterns, $replacements, $sqlString); 

    # grab parameter values 
    $pregMatchAllReturnValueHolder = preg_match_all($patterns[0], $sqlString, $grabbedParameterValues); 
    $parameterValues = $grabbedParameterValues[0]; 

    # prepare command: 
    echo('$stmt = $pdo->prepare("' . $preparedSqlString . '");'); 
    echo("\n"); 

    # binding of parameters 
    $bindValueCtr = 1; 
    foreach($parameterValues as $key => $value) { 
    echo('$stmt->bindParam(' . $bindValueCtr . ", " . $value . ");"); 
    echo("\n"); 
    $bindValueCtr++; 
    } 

    # if you want to add the execute part, simply: 
    echo('$stmt->execute();'); 
} 

# TEST! 
$sqlString = "SELECT foo FROM bar WHERE name = 'foobar' or nickname = 'fbar'"; 
prepare1995Sql_EXAMPLE ($sqlString); 

नमूना उत्पादन होगा:

$stmt = $pdo->prepare("SELECT foo FROM bar WHERE name = ? or nickname = ?"); 
$stmt->bindParam(1, 'foobar'); 
$stmt->bindParam(2, 'fbar'); 
$stmt->execute(); 

यह शायद काम करेगा यदि आपके सभी एसक्यूएल बयान उदाहरण के समान हैं, की स्थिति में किया जा रहा तार। हालांकि, एक बार जब आप पूर्णांक के बराबर की आवश्यकता होती है, तो पैटर्न बदलना चाहिए। यही वह है जो मैं अभी कर सकता हूं .. मुझे पता है कि यह बिल्कुल सही दृष्टिकोण नहीं है, लेकिन नमूना के लिए, इसे आज़माएं :)

0

मैं इन प्रश्नों (मुझे लगता है कि वे पैटर्न होना चाहिए) के लिए regexp खोज की सिफारिश करेंगे के लिए

धन्यवाद, बाद में तरह उन्हें और देखें कि कौन से समान हैं/समूहित किए जा सकते हैं।

यदि आपके पास कुछ प्रकार का लॉग है, तो जांचें कि कौन से लोगों को अधिकतर बार निष्पादित किया जाता है, यह दुर्लभ प्रश्नों को तैयार बयान में स्थानांतरित करने के लिए बहुत अधिक समझ में नहीं आता है।

0

ईमानदारी से, आपको अपने प्रश्नों को फिर से लिखना चाहिए। नियमित अभिव्यक्तियों का उपयोग करना काम करेगा, लेकिन आप पाएंगे कि कुछ प्रश्नों को पैटर्न द्वारा नियंत्रित नहीं किया जा सकता है। समस्या यह है कि सभी को पार करने के लिए सिर्फ एक पैटर्न के लिए प्रश्नों में जटिलता है। साथ ही, यह आपके कोड के लिए केवल काम करने और अपने प्रश्नों को फिर से लिखने के लिए सर्वोत्तम अभ्यास और संगत होगा।

शुभकामनाएँ!

0

आप किसी ट्रेस सुविधा को सक्षम करना और SQL आदेशों को कैप्चर करना चाहते हैं क्योंकि उन्हें डेटाबेस में भेजा जाता है। सावधान रहें, जो आप देखना चाहते हैं वह आपको पैंट से डर देगा :)

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