繁体   English   中英

从SQL字符串获取表名

[英]Get table name from sql string

从以下字符串获取table_name的最有效方法是什么? 我只想到了substr()table_name的长度可能并不总是相同

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

我认为这是您想要的:

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

然后从$ matches数组中选择正确的数组元素以获取表名。 在这种情况下,将是$matches[1]

请尝试此代码。

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

演示版

您可以像下面那样使用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

如果您想获得最高效率,请不要使用正则表达式-它比非正则表达式方法要慢得多。 接下来的三种方法都将胜过此页面上的其他答案。 其他模式并未针对速度进行优化(它们使用捕获组,并且不使用否定的字符类)。

我已经从最快到最慢命令了以下三种方法。 这是这三种方法演示

这是所有方法的输入:

$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()是我这三种方法中最慢的一种,但仍比所有其他答案更有效。 模式演示 (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';

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM