2011-02-12 59 views
23

如何在php中檢查字符串是否是sql語句的有效兼容列名? 只是一個字符串匹配。檢查有效的SQL列名

+1

for mysql其INFORMATION_SCHEMA表查詢 – 2011-02-12 11:59:30

+0

你是什麼意思的有效?你的意思是該字符串作爲數據庫表中的列存在嗎?或者你的意思是說數據庫是否支持這個字符串作爲列名? – 2011-02-12 11:59:58

+0

@Shakti後者 – 2011-02-12 12:00:43

回答

36

最終,每個字符串都是一個有效的列名稱,一旦它被括在雙引號中(MySQL可能不遵守該規則,具體取決於配置,它不使用雙引號作爲默認安裝中的標識符引號)。

但是,如果您想跨平臺(因爲不同的DBMS標籤建議),您應該檢查最小公分母。

這樣做的PostgreSQL manual has a nice definition

SQL標識符和關鍵字必須以一個字母開頭(A-Z,而且信件,變音符號和非拉丁字母)或下劃線(_)。標識符或關鍵字中的後續字符可以是字母,下劃線,數字(0-9)或美元符號($)。需要注意的是美元符號未在標識符允許根據SQL標準的信,所以它們的使用可能使應用程序的可移植性

所以,你應該檢查與正則表達式如下:

  • 開始以字母
  • 只包含字符(字母)和數字和下劃線

所以正則表達式像下面應該包括這樣的:

^[a-zA-Z_][a-zA-Z0-9_]*$

由於SQL是不區分大小寫(除非使用雙引號)大寫和小寫字母是允許的。

0

使用

可以使用顯示列或描述查詢。 並從結果中驗證。

1

您可以使用MySQL查詢,如下所示從特定表中獲取的字段:

SHOW FIELDS FROM tbl_name 

,然後一些簡單的PHP:

$string_to_check = 'sample'; 
$valid = false; 
$q = mysql_query("SHOW FIELDS FROM tbl_name"); 
while($row = mysql_fetch_object($q)) { 
    if($row->Field == $string_to_check) { 
    $valid = true; break; 
    } 
} 
if($valid) { 
    echo "Field exists"; 
} 
-2

如果我有同樣的問題,我會爲特定的字符列表搜索特定的數據庫文檔,然後以regexp的形式實現它。

但我永遠不會面對這樣的問題,因爲基本的拉丁字符,數字和下劃線都足以說明我使用的任何字段。所以我會保持良好的便攜性和可維護性。