2013-01-13 20 views
3

我只是想知道是否有任何的方式來選擇使用WHERE子句中的主鍵行,而不必知道密鑰的列的名稱。無論列名是否在主鍵上選擇?

我建議的PHP函數如下:

function getData($table,$key,$asarray=false) { 
    $sql = mysql_query("select * from `".$table."` where primary='".$key."'"); 
    if(!$asarray) return mysql_fetch_assoc($sql); 
    $ret = []; 
    while($row = mysql_fetch_assoc($sql)) $ret[] = $row; 
    return $ret; 
} 

的幾個注意事項:

  1. $table永遠只來自於代碼中的文字串,從來沒有從外部來源。
  2. 對於這個問題的目的,假設$key已經正確轉義。
  3. 我不在乎mysql在PHP 5.5過時了,因爲我使用PHP 5.4
  4. 出於同樣的原因$ret = []是定義數組一個完全有效的方式 - 我這麼說是因爲在我的最後一個問題的人告訴我我的代碼因爲這個語法而不工作。

現在,我當前的實際工作代碼有一個關聯數組映射表名稱與其對應的主鍵字段名稱。我只是想知道是否有一種自動的方式來做到這一點,最好不要詢問INFORMATION_SCHEMA,SHOW CREATE TABLESHOW INDEXES

回答

2

沒有,有這樣做而無需知道或查詢主鍵列(多個)的沒有自動化的方式。

注意,主鍵可以是多個列!

我實現這種通用的發現按主鍵在Zend框架1.0的方法。我們必須編寫表網關類的代碼來發現表的主鍵和所有其他列。

使用DESC作爲SHOW CREATE TABLE的快速替代方法或查詢INFORMATION_SCHEMA。該SHOW命令只映射到查詢對INFORMATION_SCHEMA,因爲它觸發InnoDB表重新讀取表的一部分刷新內存中的統計(unless you set innodb_stats_on_metadata=0),可以有很高的性價比。

+0

好吧,感謝信息。 –

2

這需要另一個呼叫到MySQL服務器,但是這應該讓你,你找什麼:

SHOW KEYS FROM table WHERE Key_name = 'PRIMARY' 
+0

感謝您的信息。 –

1

我使用Zend框架的1這樣的事情。

只是做一個find()方法從對象的Zend_Db_Table並傳遞你想這樣的鍵(S):

$table = new Zend_Db_Table($table); 
$rows = $table->find($key); 
+0

不客氣。 ;-) –

+1

謝謝;)我應該添加Zend_Db元數據緩存,這真是太棒了。 – imel96