簡體   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