Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Có cách nào để PHP xác thực cú pháp SQL mà không cần thực thi nó không?

Từ MySQL 5.6.3 trở đi, bạn có thể sử dụng GIẢI THÍCH cho hầu hết các truy vấn

Tôi đã làm điều này và nó hoạt động rất đáng yêu:

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

Nó sẽ trả về False nếu truy vấn de là OK (cho phép nhiều câu lệnh được phân tách) hoặc thông báo lỗi cho biết lỗi nếu có cú pháp hoặc MySQL khác (như bảng hoặc cột không tồn tại).

PHP Fiddle

NHỮNG LỖI BIẾT:

  • Lỗi MySQL với số lanh:hầu hết các số lanh sẽ không khớp.
  • Không hoạt động đối với các câu lệnh MySQL ngoài 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. 'IF' trong câu lệnh 'SELECT' - chọn giá trị đầu ra dựa trên các giá trị cột

  2. Cách sử dụng Coalesce trong MySQL

  3. Hibernate mysql innodb

  4. SQLSTATE [HY000] [1045] Quyền truy cập bị từ chối đối với người dùng 'root' @ 'localhost' (sử dụng mật khẩu:YES) symfony2

  5. Ngăn MySQL chèn các giá trị mặc định ngầm định vào các cột không rỗng