Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

PHP को निष्पादित किए बिना SQL सिंटैक्स को सत्यापित करने का कोई तरीका है?

MySQL 5.6.3 से आप अधिकांश प्रश्नों के लिए EXPLAIN का उपयोग कर सकते हैं

मैंने इसे बनाया है और यह बहुत अच्छा काम करता है:

function checkMySqlSyntax($mysqli, $query) {
   if ( trim($query) ) {
      // Replace characters within string literals that may *** up the process
      $query = replaceCharacterWithinQuotes($query, '#', '%') ;
      $query = replaceCharacterWithinQuotes($query, ';', ':') ;
      // Prepare the query to make a valid EXPLAIN query
      // Remove comments # comment ; or  # comment newline
      // Remove SET @var=val;
      // Remove empty statements
      // Remove last ;
      // Put EXPLAIN in front of every MySQL statement (separated by ;) 
      $query = "EXPLAIN " .
               preg_replace(Array("/#[^\n\r;]*([\n\r;]|$)/",
                              "/[Ss][Ee][Tt]\s+\@[A-Za-z0-9_]+\s*:?=\s*[^;]+(;|$)/",
                              "/;\s*;/",
                              "/;\s*$/",
                              "/;/"),
                        Array("","", ";","", "; EXPLAIN "), $query) ;

      foreach(explode(';', $query) as $q) {
         $result = $mysqli->query($q) ;
         $err = !$result ? $mysqli->error : false ;
         if ( ! is_object($result) && ! $err ) $err = "Unknown SQL error";
         if ( $err) return $err ;
      }
      return false ;
  }
}

function replaceCharacterWithinQuotes($str, $char, $repl) {
    if ( strpos( $str, $char ) === false ) return $str ;

    $placeholder = chr(7) ;
    $inSingleQuote = false ;
    $inDoubleQuotes = false ;
    for ( $p = 0 ; $p < strlen($str) ; $p++ ) {
        switch ( $str[$p] ) {
            case "'": if ( ! $inDoubleQuotes ) $inSingleQuote = ! $inSingleQuote ; break ;
            case '"': if ( ! $inSingleQuote ) $inDoubleQuotes = ! $inDoubleQuotes ; break ;
            case '\\': $p++ ; break ;
            case $char: if ( $inSingleQuote || $inDoubleQuotes) $str[$p] = $placeholder ; break ;
        }
    }
    return str_replace($placeholder, $repl, $str) ;
 }

यदि कोई क्वेरी ठीक है (एकाधिक; अलग किए गए कथनों की अनुमति है), या एक सिंटैक्स या अन्य MySQL अन्य (जैसे गैर-मौजूद तालिका या स्तंभ) होने पर त्रुटि बताते हुए एक त्रुटि संदेश, तो यह गलत लौटाएगा।

PHP Fiddle

ज्ञात कीड़े:

  • लाइननंबरों के साथ MySQL त्रुटियां:लिननंबर अधिकतर मेल नहीं खाएंगे।
  • सेलेक्ट, अपडेट, रिप्लेस, इंसर्ट, डिलीट के अलावा अन्य MySQL स्टेटमेंट्स के लिए काम नहीं करता है


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL फुलटेक्स्ट सर्च

  2. PHP में MySQL डेटाबेस का बैकअप कैसे लें?

  3. हाइबरनेट:इकाई वर्गों के आधार पर स्वचालित रूप से डीबी टेबल बनाना/अपडेट करना

  4. mysql डेटाबेस को एक कंप्यूटर से दूसरे कंप्यूटर में कॉपी करना

  5. MySQL डीबी में बेस 64 एन्कोडेड वैल्यू स्टोर करने का सबसे अच्छा तरीका?