当前位置: 首页 > 面试题库 >

PHP有没有一种方法可以在不执行SQL语法的情况下对其进行验证?

欧阳声
2023-03-14
问题内容

我想构建一个PHP脚本来验证SQL查询,但不执行它。它不仅应验证语法,而且还应在可能的情况下让您知道是否可以通过查询中的命令来执行查询。这是我想要执行的操作的伪代码:

<?php
//connect user
//connect to database
//v_query = $_GET['usrinput'];
if(validate v_query == true){
echo "This query can be executed";
}
else{
echo "This query can't be executed because the table does not exist.";
}

//disconnect 
?>

这样的事情。我希望它模拟查询而不执行它。那就是我想要的,对此我什么也找不到。

为什么我们不希望执行查询的一个示例是,如果查询向数据库中添加了一些内容。我们只希望它在不修改数据库的情况下对其进行仿真。

任何链接或示例将不胜感激!


问题答案:

从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小提琴

已知的错误:

  • 行号的MySQL错误:大多数行号不匹配。
  • 不适用于SELECT,UPDATE,REPLACE,INSERT,DELETE以外的MySQL语句


 类似资料:
  • 问题内容: 关于将行旋转为各种数据库的列,有很多文章。他们似乎分为两个阵营,使用案例陈述或使用数据库供应商的内置功能。我正在使用 MySQL ,到目前为止,在任何内置函数上都找不到任何东西,这将使我能够选择任意数量的行值(我想将其转换为列)。如果我不提前知道这些值,则无法构建经常出现在的CASE查询。我想知道在MySQL中是否有类似于其他数据库中称为交叉表或数据透视表的东西: -Postgresq

  • 问题内容: 据我所知,没有主方法就无法执行,因为运行Java程序时。Java虚拟机将查找main方法。如果JVM无法找到main方法,它将显示运行时错误。线程main中的异常找不到main类。 但是我搜索了许多博客,其中一些人说,是的,如果Java程序中有静态块,则可以通过静态博客来完成,类加载器会在Java调用main()方法之前加载所有静态块! 真的有可能吗?它们的可用性如何? 问题答案: 现

  • 问题内容: 有没有一种方法可以只运行一个页面,以便我可以看到生成的html(和css),就像它对用户的外观一样,即使它实际上是无法正常工作的呢?独立的JSF页面。我想回顾一下我是如何设置表单的,以便在对表单的字段进行实际编码之前,从用户角度看它们是否有意义。我正在使用maven和netbeans,但不确定后者是否相关。 问题答案: 如果使用的是JSF2 Facelets,则可以仅使用纯HTML设计

  • 使用JSch,有没有一种方法可以判断远程文件是否存在,而无需执行ls并在文件中循环查找名称匹配? 谢啦

  • 我试图组装一个SQL生成器,这样我就可以动态地构建SQL语句,并将它们传递到Spark Job Server上。当预先知道表列时,似乎很容易(使用JOOQ): JOOQ“field”似乎是一个强类型对象。 是否有一种方法可以使用这种动态构造的列列表来构建这样的JOOQ select语句?

  • 问题内容: 我刚刚收到Java更新通知,说Update 17已经发布,所以我运行了更新,发现只有我的公共JRE被更新了。我仍然只有JDK的Update 16。 有没有办法自动提供最新的JDK? 当然,更新不应该放弃旧版本。这应该手动完成,因为Eclipse仍在使用旧版本。更新设置后,我将手动删除旧的JDK。 问题答案: 不在Windows上。如果要通过带有自动更新程序的Linux发行版来获取JDK