2012-12-25 30 views
1

在下面的代碼中,我得到的輸出告訴我當前用戶是[email protected]%,然後第二個查詢會給我一個錯誤,說明[email protected]被拒絕了INSERT權限。是否從不同的數據庫交換機中選擇用戶?

$query = "SELECT CURRENT_USER();" 
$result = mysql_query($query); 
if(mysql_num_rows($result)) 
{ 
    $data = mysql_fetch_assoc($result); 
    echo(" current user - ". $data['CURRENT_USER()'] . "\n"); //current user - [email protected]% 
} 


$query = "INSERT INTO DIFF_DATABASE.HISTORY (DATA) VALUES (\"" . $data. "\")"; 
if(mysql_query($query) == false) 
{ 
    echo(mysql_error()); // INSERT command denied to user 'myuser'@'localhost' for table 'HISTORY' 
} 

它看起來像有MySQL用戶從[email protected]%[email protected]開關這是如何發生的呢?我猜這是因爲我正在從第二個查詢中的另一個數據庫中進行選擇。

+0

''%可出現爲補助主機名,這是一個通配符,這意味着任何主機。但我不認爲它可以成爲實際用戶連接的一部分,即客戶端主機的名稱或IP。我不確定爲什麼'CURRENT_USER()'首先返回它。 – Barmar

+0

當我從'mysql.user'表中選擇用戶,其中'user = myuser'時,我只看到'myuser'和主機'%' –

+0

對,這就是授權存儲的地方,而且是通配符。但是您登錄的實際用戶具有真實的主機名。 – Barmar

回答

0

CURRENT_USER()的值可以不同於USER()的值。

mysql> SELECT USER(); 
     -> '[email protected]' 
mysql> SELECT * FROM mysql.user; 
ERROR 1044: Access denied for user ''@'localhost' to 
database 'mysql' 
mysql> SELECT CURRENT_USER(); 
     -> '@localhost' 

的例子說明的是,雖然客戶機指定用戶名davida的 (由用戶()函數的值所指示的),則 服務器使用匿名用戶帳戶認證的客戶端(由CURRENT_USER()值的空用戶名部分看到的 )。 可能出現的一種情況是,在davida的grant 表中沒有列出帳戶。

http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_current-user