2011-04-24 89 views
1

新建PHP函數和mysql。我有函數連接到數據庫db_conect_nm()。這在文件db_fns.php中,並且包含連接到我的數據庫的用戶和密碼。我創建了這個有更安全的數據庫連接。我把它放在public_html之外的一個目錄中,並且出現了錯誤PHP Warning: mysqli::mysqli() [<a href='mysqli.mysqli'>mysqli.mysqli</a>]: (28000/1045): Access denied for user 'negoti7'@'localhost' (using password: NO) ...用於mysqli連接的PHP函數給出錯誤

尋找解決方案,我看到了一些註釋,說明這個db用戶可能沒有root權限,所以我把它放在public_html中的一個目錄中,目錄作爲被調用的程序。我仍然得到同樣的錯誤。

我已經測試了連接而不是一個函數,它的工作原理。什麼是錯的,爲什麼這不起作用?我真的想把它放在代碼之外的地方,並使它更安全。

db_fns.php內容

<?php 
//Database server 
$host= 'localhost'; 
$nm_name= 'myname_databasename'; //sanitized data 
$nm_user= 'myname_dbusername'; 
$nm_pword= 'password'; 

// db connect to nm database 
function db_connect_nm() 
{ 
    $nm_connect = new mysqli($host, $nm_user, $nm_pword, $nm_name); 

    if (!$nm_connect) 
    throw new Exception('Could not connect to NM database currently'); 
    else 
    return $nm_connect; 
} 

?> 

我把它從nm_functions.php,db_fns.php包括那裏。

nm_functions.php

<?php require_once('sanitizedpathto/db_fns.php'); 

......some code 

    $conn_nm = db_connect_nm(); 
    $result_sub = $conn_nm->query("select * from subscribers where uname='$username'"); 

    .... more code 

?> 

任何想法? 謝謝

回答

1

它可能是變量的範圍?您是否嘗試過在函數內部定義要測試的變量?

像這樣:

<?php 

// db connect to nm database 
function db_connect_nm() 
{ 
    //Database server 
    $host= 'localhost'; 
    $nm_name= 'myname_databasename'; //sanitized data 
    $nm_user= 'myname_dbusername'; 
    $nm_pword= 'password'; 

    $nm_connect = new mysqli($host, $nm_user, $nm_pword, $nm_name); 

    if (!$nm_connect) 
    throw new Exception('Could not connect to NM database currently'); 
    else 
    return $nm_connect; 
} 

>

0

你是?

  • 首先,聲明的任何功能以外的一些變量,
  • 然後,嘗試使用這些變量從在一個函數裏面。

在函數外部聲明的變量默認情況下不在該函數內部可見。

關於這一點,您應該閱讀手冊中的Variable scope部分。


兩種可能的解決方案:

  • 使用global關鍵字,這些變量導入到你的函數 - 這使他們看到
  • 或者定義constants,而不是變量 - 這是有道理的,用於配置值。


在第一種情況下,你的函數應該是這樣的:

// db connect to nm database 
function db_connect_nm() 
{ 
    // Make these outside variables visible from inside the function 
    global $host, $nm_user, $nm_pword, $nm_name; 

    $nm_connect = new mysqli($host, $nm_user, $nm_pword, $nm_name); 

    if (!$nm_connect) 
    throw new Exception('Could not connect to NM database currently'); 
    else 
    return $nm_connect; 
} 


而且,在第二種情況下,你首先define常量:

define('DB_HOST', 'localhost'); 
define('DB_DBNAME', 'myname_databasename'); 
define('DB_USER', 'myname_dbusername'); 
define('DB_PASSWORD', 'password'); 

然後,使用那些常數:

// db connect to nm database 
function db_connect_nm() 
{ 
    $nm_connect = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_DBNAME); 

    if (!$nm_connect) 
    throw new Exception('Could not connect to NM database currently'); 
    else 
    return $nm_connect; 
} 

這第二種解決方案是可能更乾淨比第一個;-)

+0

是,非常感謝。我現在意識到了錯誤。我認爲'定義'方法是最好的。 – KSB 2011-04-24 18:19:54

+0

很高興我能幫忙:-) – 2011-04-24 18:20:42

0

您連接變量不連接函數內部作用域。您可能需要它們作爲參數傳遞給函數(優選),或使用global關鍵字內引用它們:

function db_connect_nm($host, $nm_user, $nm_pword, $nm_name) 
{ 
    $nm_connect = new mysqli($host, $nm_user, $nm_pword, $nm_name); 

    //etc... 
} 

替代,不是優選的:

function db_connect_nm() 
{ 
    global $host, $nm_user, $nm_pword, $nm_name; 
    $nm_connect = new mysqli($host, $nm_user, $nm_pword, $nm_name); 

    //etc... 
}