[英]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,則可以為類創建全局變量,該全局變量保存與數據庫的連接,然后每個函數將使用相同的連接,並且不會進行重新連接。
使用准備好的語句,因為現在您的代碼非常容易被破解。
功能Jenis
, Andil
和Kelompok
不作為完全相同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.