【问题标题】:Get table name from sql string [duplicate]从sql字符串获取表名[重复]
【发布时间】:2018-01-07 13:57:54
【问题描述】:

从以下字符串中获取table_name 的最有效方法是什么。我能想到的只是substr(),但table_name 的长度可能并不总是一样

SELECT * FROM `table_name` WHERE `id` = '1'

【问题讨论】:

  • 你想到正则表达式了吗?
  • 除非您只想支持非常简单的 SQL 字符串,否则这看起来比您得到的答案更复杂。 FROM 和 WHERE 之间当然可以比一个表名多得多。
  • 一个不寻常的需求,也许有更好的选择
  • @Don'tPanic simple 是我的中间名

标签: php regex string


【解决方案1】:

我想这就是你想要的:

<?php
$query = "SELECT * FROM `table_name` WHERE `id` = '1'";
$pattern = "/SELECT \* FROM `(.*?)`/";
preg_match($pattern, $query, $matches);
print_r($matches);
?>

然后从 $matches 数组中选择正确的数组元素来获取表名。在本例中为$matches[1]

【讨论】:

    【解决方案2】:

    请试试这个代码。

    <?php
    $query = "SELECT * FROM `table_name` WHERE `id` = '1'";
    $pattern = "/SELECT \* FROM `(.*?)`/";
    preg_match($pattern, $query, $matches);
    echo $matches[1];
    ?>
    

    Demo

    【讨论】:

      【解决方案3】:

      你可以像下面这样使用preg_match()-

      <?php
      
      $string = "SELECT * FROM `table_name` WHERE `id` = '1'";
      
      preg_match("/FROM (.*?) WHERE/",$string,$matches);
      
      print_r($matches); // now you can do echo $matches[1];
      

      输出:-https://eval.in/839906https://eval.in/839907

      【讨论】:

        【解决方案4】:

        如果你想要最高效的,那么不要使用正则表达式——它比非正则表达式方法慢得多。我遵循的三种方法都将优于此页面上的其他答案。其他模式没有针对速度进行优化(它们使用捕获组并且不使用否定字符类)。

        我已将以下三种方法从最快到最慢排序。这是demo of all three methods

        这是所有方法的输入:

        $sql="SELECT * FROM `table_name` WHERE `id` = '1'";
        

        所有方法都将输出table_name,不带反引号。

        方法 #1 - explode() 最快,但只有在表名的前导反引号之前没有反引号时才有效。

        // explode(): *only works if no backticks before FROM clause*
        echo explode('`',$sql,3)[1];  // limit elements to maximum of 3, we only want the 2nd
        

        方法 #2 - strpos()substr() 将是第二快的,并提供 100% 的可靠性,因为它正在定位 FROM 后面的反引号(假设你没有一些以FROM 结尾的滑稽列名,然后是一个空格,然后你用反引号将它包裹起来......我的意思是,如果你足够努力,你可以打破它。

        // pure string functions:
        $tick1=strpos($sql,'FROM `')+6;
        $tick2=strpos($sql,'`',$tick1);
        echo substr($sql,$tick1,$tick2-$tick1);
        


        方法#3 - preg_match() 是我的三种方法中最慢的,但仍然比所有其他答案更有效。 Pattern Demo(9 步)仅供参考:Kamrans' = 40 步,Alive's = 39 步,Cagy's = 40。

        为什么我的速度这么快?

        • 我没有使用括号来捕获匹配,我使用 \K 重新启动全字符串匹配。

        • 我还使用否定字符类 [^]+` 来匹配第一个反引号后面的一个或多个非反引号字符。

        你不能让preg_match() 比这更快。作为使用\K 的好处,输出数组也小了 50%。

        // Will work regardless of backticks in SELECT clause:
        echo preg_match('/FROM `\K[^`]+/',$sql,$out)?$out[0]:'failed';
        

        【讨论】:

        • @Alex 不幸的是,当我离开电脑时,您提出了您的问题并授予了您的绿色勾号。希望您现在对三种新的教育方法留下深刻印象,它们的表现将优于早期提交的内容。如果你想要效率,我可以满足你。
        • 确实,在我的测试中,您的方法的执行速度都比其他方法稍快。由于我的标准是“效率”,你应该得到检查。虽然我确实讨厌成为印度人,但下次发放支票时我必须不那么匆忙。
        猜你喜欢
        • 2017-05-19
        • 1970-01-01
        • 2013-08-12
        • 1970-01-01
        • 2016-03-15
        • 1970-01-01
        • 2014-01-10
        • 2018-03-16
        • 1970-01-01
        相关资源
        最近更新 更多