簡體   English   中英

如何使此“數據庫連接”代碼更有效地運行?

[英]How do I make this “database connection” code more efficient to run?

我有以下代碼:

 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 變量傳遞給函數 (在每個函數中執行global $con ),但它也沒有使其運行得更快。

那我在這里想念什么嗎?

您可以使用一個類:

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);

編輯:現在它具有OOP風格

如果可以使用Classes,則可以為類創建全局變量,該全局變量保存與數據庫的連接,然后每個函數將使用相同的連接,並且不會進行重新連接。

使用准備好的語句,因為現在您的代碼非常容易被破解。

功能JenisAndilKelompok不作為完全相同Perubahan是核心重用准備,所以只是將其重命名為getData($select = '*')並且只使用一個功能。

作為DRY的規則,您最好提取這部分代碼:

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進行硬編碼)

    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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM