2015-01-08 45 views
4

所以我有多种功能完成不同的查询,例如PHP文件:PHP - 与SQL多种功能查询

function getUserEmail($name) 
{ 
    $link=getLink(); 
    $name=mysqli_real_escape_string($link, $name); 
    $output=mysqli_fetch_array(mysqli_query($link, "SELECT email FROM users WHERE name='$name';")); 
    mysqli_close($link); 
    return $output[0]; 
} 

function getUserName($id) 
{ 
    $link=getLink(); 
    $id=mysqli_real_escape_string($link, $id); 
    $output=mysqli_fetch_array(mysqli_query($link, "SELECT name FROM users WHERE id='$id';")); 
    mysqli_close($link); 
    return $output[0]; 
} 

function getLink() 
{ 
    $link = mysqli_connect('localhost', 'myUser', 'myPass'); 
    mysqli_select_db($link, 'myDB'); 
    if (!$link) die(mysqli_error($link)); 
    return $link; 
} 

(此代码可能无法正常工作,这只是一个例子)

我它的做法与上面的例子类似,但我认为,因为在页面重新加载时调用了许多函数,所以多个DB链接创建和关闭并不是最有效的进行方式(并且由于多个功能而开始滞后添加到我的项目)。

Ny认为是:在PHP的头部创建$链接到数据库并将其保存到$ _POST var(如$ _POST ['link']),然后通过代码使用它,并关闭它在页脚上。

这将阻止多个链接创建和关闭,我认为会提高性能。

有什么想法?

+0

请确保您在某些时候清理了传递的变量。 – Rimble

回答

1

如果这些功能是一类

的一部分,您可以包括您处理数据库连接__construct()和“__destruct()'功能。例如:

<?php 
    class account { 
    protected $link; 

    function __construct() { 
     $link=getLink(); 
    } 

    function __destruct() { 
     mysqli_close($link); 
    } 

    function getUserEmail($name) 
    { 
     $name=mysqli_real_escape_string($link, $name); 
     $output=mysqli_fetch_array(mysqli_query($link, "SELECT email FROM users WHERE name='$name';")); 
     return $output[0]; 
    } 

    function getUserName($id) 
    { 
     $id=mysqli_real_escape_string($link, $id); 
     $output=mysqli_fetch_array(mysqli_query($link, "SELECT name FROM users WHERE id='$id';")); 
     return $output[0]; 
    } 

    function getLink() 
    { 
     $link = mysqli_connect('localhost', 'myUser', 'myPass'); 
     mysqli_select_db($link, 'myDB'); 
     if (!$link) die(mysqli_error($link)); 
     return $link; 
    } 
    } 

这样您就不必担心重新打开连接并关闭连接。连接会在创建帐户对象时自动打开,并且在不再引用帐户对象时它会自动关闭。

阅读更多关于constructors and destructors here

此外,正如评论中所建议的那样,您可以包含一个广泛的getUser()方法,以便您不必在数据库中查询所有用户的单独条目。它会减少与数据库交互的次数,并且是处理数据的更有效方式。像这样:

function getUser($id) 
{ 
    $id=mysqli_real_escape_string($link, $id); 
    $output=mysqli_fetch_array(mysqli_query($link, "SELECT * FROM users WHERE id='$id';")); 
    return $output; 
} 
+0

这也是一个好方法,但我不使用OOP,而是使用程序代码。 – DarkW

+0

我假定你仍然有一些初始功能,或者甚至是加载主页内容的主要功能。在这个函数中,你可以调用'getLink()'并将其作为全局变量赋值给'$ link',这将是一个类似的概念。 – Wold

+2

好吧,但我不会做你正在做的事......你应该只有一个名为'getUser'的函数返回用户数据数组,然后通过键访问它。它很愚蠢地继续击中每个信息的DB。 – prodigitalson

1

使用全局

$link=false; 
function getLink() 
    { 
     global $link; 
     if (!$link) { 
     $link = mysqli_connect('localhost', 'myUser', 'myPass'); 
     mysqli_select_db($link, 'myDB'); 
     if (!$link) die(mysqli_error($link)); 
     } 
     return $link; 
    } 

这种方式,getLink()第一个呼叫建立连接,以及所有后续调用简单地重新使用由第一个呼叫建立连接。进行此更改后,您可以保留其余代码相同。能够使用OOP我认为实际上是使用mysqli而不是mysql的一大好处,但如果您不想使用OOP,则应该为您执行此操作。

+0

好主意,可能会使用它。 – DarkW