2014-09-04 61 views
0

我有这样的代码:如何让此“数据库连接”代码更高效地运行?

function Perubahan($a = '`Ubah`') { 
     $con = mysqli_connect("localhost", "root", "", "nofriani"); //koneksi ke database 

     $syntax = 'SELECT' . $a . ' FROM `table 1` WHERE `No`= 6'; 
     $naik = mysqli_query($con, $syntax); 
     while ($row = mysqli_fetch_array($naik)) { 
      echo round($row[0], 3); 
     } 
    } 

    function Jenis($b = 1) { 
     $con = mysqli_connect("localhost", "root", "", "nofriani"); //koneksi ke database 

     $syntax = 'SELECT `Jenis` FROM `table 1` WHERE `No`= ' . $b; 
     $naik = mysqli_query($con, $syntax); 
     while ($row = mysqli_fetch_array($naik)) { 
      echo $row[0]; 
     } 
    } 

    function Andil($b = 1) { 
     $con = mysqli_connect("localhost", "root", "", "nofriani"); //koneksi ke database 

     $syntax = 'SELECT `Andil` FROM `table 1` WHERE `No`= ' . $b; 
     $naik = mysqli_query($con, $syntax); 
     while ($row = mysqli_fetch_array($naik)) { 
      echo round($row[0], 3); 
     } 
    } 

    function Kelompok($b = 1) { 
     $con = mysqli_connect("localhost", "root", "", "nofriani"); //koneksi ke database 

     $syntax = 'SELECT `Andil` FROM `table 1` WHERE `No`= ' . $b; 
     $naik = mysqli_query($con, $syntax); 
     while ($row = mysqli_fetch_array($naik)) { 
      echo round($row[0], 3); 
     } 
    } 

因此,我调用(在同一个PHP文件仍然)各项功能。但是当我开始运行它时,显示结果花费了很长时间(但它工作)。我猜这个问题是因为我在每个函数中重复数据库连接。 如何避免连接到同一个数据库?

我试图创建数据库连接到不同的文件,并调用每个函数中的文件,但它没有工作。我也尝试通过$ con variable into the function(在每个函数中做global $con),但它也没有让它运行得更快。

所以我在这里错过了什么?

+2

我问你一个反问题,以帮助你回答问题,在pa rt,你自己:如果'数据库名称'或'密码'或'用户名'改变了怎么办?你是否围绕你的所有功能并更新所有功能?这是很多问题的其中一个 – 2014-09-04 06:33:48

+0

为什么你不能只为这些功能做一个功能?您在每个功能上重复相同的代码(或接近相同)。 – Rasclatt 2014-09-04 06:37:18

+1

Apache可以处理持久数据库连接。即使你多次连接也不意味着重新连接。如果脚本运行得更快,你可能需要一个索引'No' – JaMaBing 2014-09-04 06:39:20

回答

2

你可以使用一个类:

class NameService 
{ 
    private $con = null; 

    public function __construct() 
    { 
     $this->con = new mysqli("localhost", "root", "", "nofriani"); 
     if ($this->con->connect_error) { 
      die('Connect Error (' . $this->con->connect_errno . ') ' 
      . $this->con->connect_error); 
     } 
    } 

    public function __destruct() 
    { 
     $this->con->close(); 
    } 

    function Andil($b = 1) { 
     $syntax = 'SELECT `Andil` FROM `table 1` WHERE `No`= ' . $b; 
     $result= $this->con->query($syntax); 
     while ($row = $result->fetch_array()) { 
      echo round($row[0], 3); 
     } 
    } 

    ... 
} 

,并使用它:

$nameService = new NameService(); 
$nameService->Andil(23); 

编辑:现在是用面向对象的风格

+0

我可以在最后关闭连接吗?我似乎没有能力..我的意思是在我使用课程后,还是没有关闭连接? – Safira 2014-09-04 06:51:00

+0

如果需要,您可以使用__destruct方法。但通常在脚本执行后关闭连接。请看我更新的课程。我也用mysqli改变了一切OOP – 2014-09-04 08:26:29

+0

非常感谢。 (y)刚刚接受你的回答。 Upvoted以及。 – Safira 2014-09-05 03:09:33

1

如果你可以使用类,比你可以创建全球类的变量,持有连接到数据库,比每个函数将使用相同的连接,将不会重新连接。

使用准备好的语句,因为现在你的代码很容易被破解。

功能JenisAndilKelompok不会完全一样Perubahan被用于核复准备,所以只是将其重命名为getData($select = '*'),只使用一个功能。

0

干的规则,你最好提取这部分代码:

mysqli_connect("localhost", "root", "", "nofriani"); //koneksi ke database 

,并把在一个地方(类或函数),所有其他的代码可以访问它。 例如,你可以有这样的功能:

function getConnection() 
{ 
return mysqli_connect("localhost", "root", "", "nofriani"); //koneksi ke database 
} 

然后你就可以做这样的事情:如果

function Jenis($b = 1) { 
     $con = getConnection(); 

     $syntax = 'SELECT `Jenis` FROM `table 1` WHERE `No`= ' . $b; 
     $naik = mysqli_query($con, $syntax); 
     while ($row = mysqli_fetch_array($naik)) { 
      echo $row[0]; 
     } 
    } 

这样你ConnectionString改变你应该改变一个地方和所有其他功能(顺便说一句,最好不要硬编码ConnectionString

+1

也许人们也可以检查一个连接是否已经存在,然后返回那个连接,而不是创建一个新连接 – 2014-09-04 06:47:35

+0

这取决于您的策略。我认为对于应用程序而言,单连接连接不是最佳实践,而是连接/每个请求的交易对我来说听起来很好 – Beatles1692 2014-09-04 07:14:36

+0

每个函数调用一个连接?当你已经建立了一个连接,并且它有相同的HTTP请求和相同的数据库时,这将会如何有用?只是一个不同的查询? – 2014-09-04 07:15:43

0
global $con; 
    // Requires a password here... 
    $con = new PDO('mysql:host=localhost;dbname=nofriani', 'root', $pass); 

    class QueryEngine 
     { 
      public function Fetch($_sql) 
       { 
        global $con; 
        // You could bind values here 
        $query = $con->prepare($_sql); 
        $query->execute(); 

        if($query->rowCount() > 0) { 
          while($result = $query->fetch(PDO::FETCH_ASSOC)) { 
            $array[] = $result; 
           } 
         } 

        return (isset($array))? $array:0; 
       } 
     } 

    class NameEngine 
     { 
      protected $MySQL; 
      public function __construct() 
       { 
        // Create sql engine object 
        $this->MySQL = new QueryEngine(); 
       } 

      public function execute($_name = false,$_value = 1) { 
        // If the name is not blank, run 
        if($_name !== false) { 
          // Fetch values to array (or do your round() function) 
          // I tend to just return arrays in classes and loop the array on an html page but you could do your echo here too. 
          $_result = $this->MySQL->Fetch("SELECT $_name FROM `table 1` WHERE `No`= '$value'"); 
         } 

        // If name not set, just return empty/false 
        return (isset($_result))? $_result:0; 
       } 
     } 

    // Create name object 
    $_FetchNames = new NameEngine(); 
    // Run name(s) 
    $_Jenis   = $_FetchNames->execute('Jenis'); 
    // Print result 
    print_r($_Jenis); 
    // Close connection 
    $con = NULL; 
+0

为什么使用全局变量?只需使用单例模式或通过构造函数将实例化的连接传递给新类。 – 2014-09-04 08:29:06

+0

我通常将连接作为'global'放入包含的db连接文件中,作为第一个包含文件,因此它总是在页面顶部实例化一次。任何以及所有的类和过程编码都可以通过调用'global $ con'来获得'$ con'。不管你想要什么,你都可以得到这个连接,但是对于我来说,我喜欢将它设置为'global',以便快速无障碍地访问。 – Rasclatt 2014-09-04 08:43:50