2017-05-09 136 views
1

所以我对PHP相当陌生,几乎没有问题。所以我有一个主要的索引页面,其中包含页眉和功能页面。在索引页的主体中,我调用了几个函数。多功能数据库连接功能

在我的头包括,我有我的数据库连接与索引页面加载。在我的每个函数中,我都没有调用一个新的数据库连接,因为我认为头文件中的数据库连接将在我的函数运行时保持打开状态。那么即使数据库连接在头文件中打开,当调用一个需要数据库访问的函数时,我会收到错误消息(数据库连接失败)。

因此,我添加了一个数据库连接到我的每个函数,它工作正常。我的问题是,我打开一个数据库连接时,通过页眉加载页面。然后即时通信打开另一个连接时,每个函数被调用可能是3-5个数据库连接调用在此页面上。

这对我来说似乎并不高效。这是正确的方法(在每个函数内部调用一个连接)还是有解决方案/最佳实践,这样我就只打开每页一个数据库连接,而不管调用的函数的数量是多少?再次,当我从功能本身删除连接,我得到一个失败。我的连接功能如下:

function wm_connectToDatabase() { 
    $dbhost = "xxx"; 
    $dbuser = "xxx"; 
    $dbpass = "xxx"; 
    $dbname = "xxx"; 
    $dbconnection = mysqli_connect($dbhost, $dbuser, $dbpass, $dbname); 
    if(mysqli_connect_errno()){ 
     die("Connection Failed: ". mysqli_connect_error() ."(". mysqli_connect_errno() .")"); 
    } else { 
     echo "</br>Connection Success</br>"; 
    } 
    return $dbconnection; 
} 

所以我的头文件在索引加载时调用这个函数。然后,我的每一个功能的再次调用它像这样:

function fctn1($table){ 
    $db = wm_connectToDatabase(); 
    ...function stuff here... 
} 
function fctn2($table){ 
    $db = wm_connectToDatabase(); 
    ...function stuff here... 
} 

最初,我假定管连接就能满足所有的功能,只要函数被调用一个网页,曾在头的连接上,但我发现这并非如此。我的功能只在im打开每个函数内的另一个连接时才起作用。我不确定为什么标题中的初始连接不会保持对我的页面正文中的函数开放?感谢您的任何帮助。

同样,当我从函数中删除数据库连接时,函数“失败”,就好像没有数据库连接,即使我调用头中的连接。谢谢。

+0

http://php.net/manual/en/language.variables.scope。PHP – aynber

+0

谢谢!这个页面帮助我了解了很多范围。 – user982853

回答

0

你的连接不保留,因为$ dbconnection变量没有被传递给你的其他功能。

你需要做这样的事情在你的头:

$db = wm_connectToDatabase(); 
在其他功能

然后,修改他们,使他们把你已经做了数据库连接:

fctn1($table, $db); 

你也可以使用像这样的全局变量:

function fctn1($table){ 
    global $db; 
} 
+0

确定这似乎工作。有没有任何服务可以告诉你网页连接到互联网的时间或者查询的次数?类似于用于页面加载时间的pingdom?只是想确保我的页面和全局工作正常。谢谢。 – user982853

0

您正在处理Variable Scope

在PHP函数中,不存在对“外部世界”的引用。

$bar = 'foo'; 

function sayThis() { 

    echo $bar; // $bar is empty/uninitialized, prints nothing 
} 

function sayItReally() { 

    global $bar; // tell PHP you plan to reference the outside world 
    echo $bar; // this will work 
} 

然而,这是一个广泛的主题,该简化的例子只是为了打破僵局,解决您的眼前问题。你真的应该阅读有关范围,因为这可以咬你在除了你的数据库连接更多的地方...