有一个SQL语句集合,里面可能有select
、select ... left join
、update
、delete
、insert
。
要从这语句集合中获取到所有的表名,该如何做呢?
代码如下,
<?php
class SqlLog
{
// SQL语句
private static $sql = [];
// UPDATE 正则条件
private static $updateExpression = '/UPDATE[\\s`]+?(\\w+)[\\s`]+?/is';
// INSERT 正则条件
private static $insertExpression = '/INSERT\\s+?INTO[\\s`]+?(\\w+)[\\s`]+?/is';
// DELETE 正则条件
private static $deleteExpression = '/DELETE\\s+?FROM[\\s`]+?(\\w+)[\\s`]+?/is';
// SELECT 正则条件
private static $selectExpression = '/((SELECT.+?FROM)|(LEFT\\s+JOIN|JOIN|LEFT))[\\s`]+?(\\w+)[\\s`]+?/is';
/**
* @return array 返回查询操作的所有表名
*/
public static function selectTableNames()
{
return self::getTableNames(self::$selectExpression);
}
/**
* @return array 返回更新操作的所有表名
*/
public static function updateTableNames()
{
return self::getTableNames(self::$updateExpression);
}
/**
* @return array 返回插入操作的所有表名
*/
public static function insertTableNames()
{
return self::getTableNames(self::$insertExpression);
}
/**
* @return array 返回删除操作的所有表名
*/
public static function deleteTableNames()
{
return self::getTableNames(self::$deleteExpression);
}
/**
* 根据正则表达式获取所有操作的表名
* @param $expression
* @return array
*/
public static function getTableNames($expression)
{
$sqlString = implode(PHP_EOL, self::$sql);
preg_match_all($expression, $sqlString, $matches);
return array_unique(array_pop($matches));
}
/**
* 根据sql获取表名、操作
* @param $sql string SQL语句
*/
public static function setSql($sql)
{
self::$sql[] = $sql;
}
/**
* 获取SQL语句
* @return array SQL语句集合
*/
public static function getSql()
{
return self::$sql;
}
}
使用姿势:
<?php
$sql = "select count(*) as count from order as a left join user as b on a.user_id = b.user_id where a.title like '%衣服%'";
SqlLog::setSql($sql);
var_dump(Sql::Log::selectTableNames());
会打印出两张表:order
和user
。
友情提示:垃圾评论一律封号...