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 अन्य (जैसे गैर-मौजूद तालिका या स्तंभ) होने पर त्रुटि बताते हुए एक त्रुटि संदेश, तो यह गलत लौटाएगा।
ज्ञात कीड़े:
- लाइननंबरों के साथ MySQL त्रुटियां:लिननंबर अधिकतर मेल नहीं खाएंगे।
- सेलेक्ट, अपडेट, रिप्लेस, इंसर्ट, डिलीट के अलावा अन्य MySQL स्टेटमेंट्स के लिए काम नहीं करता है