以下函式接受一個查詢語句,並以陣列形式返回 col->table 的映射。
例如:
$query = “SELECT a.id AS a_id, b.id b_id FROM atable AS a, btable b”
$cols = queryAlias($query);
print_r($cols);
返回:
Array
(
[a] => atable
[b] => btable
)
我不能保證它是完美的,但這個函式從未在正式環境中使用,因為我最終使用了 mysqli 方法。
請享用
-Jorge
/**
* 接受一個查詢語句並返回別名->表格的映射。
*
* @param string $query
* @return array 別名映射陣列
*/
function queryAlias ( $query ) {
//全部轉換為小寫,我們忽略大小寫
$substr = strtolower($query);
//移除任何子查詢
$substr = preg_replace ( ‘/\(.*\)/’, ”, $substr);
//移除任何特殊字元
$substr = preg_replace ( ‘/[^a-zA-Z0-9_,]/’, ‘ ‘, $substr);
//移除任何空白
$substr = preg_replace(‘/\s\s+/’, ‘ ‘, $substr);
//取得 FROM 後面的所有內容
$substr = strtolower(substr($substr, strpos(strtolower($substr),‘ from ‘) + 6));
//移除任何額外的指令
$substr = preg_replace(
Array(
‘/ where .*+$/’,
‘/ group by .*+$/’,
‘/ limit .*+$/’ ,
‘/ having .*+$/’ ,
‘/ order by .*+$/’,
‘/ into .*+$/’
), ”, $substr);
//移除任何 JOIN 修飾詞
$substr = preg_replace(
Array(
‘/ left /’,
‘/ right /’,
‘/ inner /’,
‘/ cross /’,
‘/ outer /’,
‘/ natural /’,
‘/ as /’
), ‘ ‘, $substr);
//將 JOIN 語句替換為逗號
$substr = preg_replace(Array(‘/ join /’, ‘/ straight_join /’), ‘,’, $substr);
$out_array = Array();
//根據 FROM 語句分割
$st_array = split (‘,’, $substr);
foreach ($st_array as $col) {
$col = preg_replace(Array(‘/ on .*+/’), ”, $col);
$tmp_array = split(‘ ‘, trim($col));
//糟糕,發生錯誤了,讓我們繼續
if (!isset($tmp_array[0]))
continue;
$first = $tmp_array[0];
//如果設定了 “AS”,我們就包含它,如果沒有,那就表示這個表格沒有別名。
if (isset($tmp_array[1]))
$second = $tmp_array[1];
else
$second = $first;
if (strlen($first))
$out_array[$second] = $first;
}
return $out_array;
}