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) ;
 }

Ще върне False, ако заявката е наред (множество; разрешени са разделени изрази) или съобщение за грешка, посочващо грешката, ако има синтаксис или друго MySQL (като несъществуваща таблица или колона).

PHP Fiddle

ИЗВЕСТНИ ПРОГРАМИ:

  • Грешки в MySQL с номера на редове:номерата на редове най-често няма да съвпадат.
  • Не работи за MySQL изрази, различни от SELECT, UPDATE, REPLACE, INSERT, DELETE


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Групирайте страници от една колона

  2. Проблем с mysqldump:опцията --defaults-extra-file не работи според очакванията

  3. 60 милиона записи, изберете записи от определен месец. Как да оптимизираме базата данни?

  4. Преименувайте името на таблицата на Amazon RDS на главна буква, извежда грешка

  5. Топ 50 въпроса за интервю за MySQL, които трябва да подготвите през 2022 г