[英]PHP Function Calling MySQL
我已經在PHP中創建了一個函數來從MySQL數據庫中獲取信息,但是不確定某些事情。
當前該函數如下所示:
function profile_info($option, $size = NULL){
// MySQL Connection Info
$mysql_hostname = "";
$mysql_username = "";
$mysql_password = "";
$mysql_database = "";
$mysql_table = "";
// MySQL Connect
$con = mysqli_connect($mysql_hostname,$mysql_username,$mysql_password,$mysql_database);
// Check the Database Connection
if (mysqli_connect_errno()){
echo (mysqli_connect_error());
}
// Define UID
$uid = $_SESSION['login'];
// Deploy Query
$result = $con->query("SELECT * FROM $mysql_table WHERE uid='$uid'");
// Define Row For All Data
$row = $result->fetch_assoc();
if($option == "firstname"){
echo $row['first_name'];
}
if($option == "lastname"){
echo $row['last_name'];
}
if($option == "nickname"){
echo $row['nick_name'];
}
if($option == "email"){
echo $row['email'];
}
if($option == "dob"){
echo $row['date_of_birth'];
}
if($option == "status"){
echo $row['status'];
}
if($option == "gravitar"){
echo ("http://www.gravatar.com/avatar/" . md5( strtolower( trim( $row['email'] ) ) ) . "?d=mm&s=" . $size);
}
$result->close();
$con->close();
}
我已經對其進行了測試,並且效果很好。
現在我的問題是,每次我調用profile_info
,它是否都與數據庫建立了新連接?
如果是這樣,我該如何解決它,以便對於所有信息它只調用一次數據庫。
問候,蒂姆
如何在行中存儲全局變量,並且只加載一次數據。 然后,如果已經加載一次,只需使用$data
存儲的$data
。
$called = false;
$data = null;
function profile_info($option, $size = NULL){
$row;
if ($called) {
$row = $data;
} else {
// it's been called
$called = true;
// get the info from database (removed for space)
}
// Define Row For All Data
$row = $result->fetch_assoc();
// define global var for row data
$data = $row;
// use the info (removed for space)
}
是的,它總是連接以獲取信息。
您可以使用$_SESSION
。
您可以獲取用戶數據並將其保存到$ _SESSION並從會話中獲取它們。 如果未創建會話,則可以從數據庫中獲取它們並將其保存到$_Session
。
session_start();
function profile_info($option, $size = NULL){
if(!$_SESSION['user']){
// MySQL Connection Info
$mysql_hostname = "";
$mysql_username = "";
$mysql_password = "";
$mysql_database = "";
$mysql_table = "";
// MySQL Connect
$con = mysqli_connect($mysql_hostname,$mysql_username,$mysql_password,$mysql_database);
// Check the Database Connection
if (mysqli_connect_errno()){
echo (mysqli_connect_error());
}
// Define UID
$uid = $_SESSION['login'];
// Deploy Query
$result = $con->query("SELECT * FROM $mysql_table WHERE uid='$uid'");
// Define Row For All Data
$row = $result->fetch_assoc();
$_SESSION['user'] = $row;
echo $_SESSION['user'][$option]
$result->close();
$con->close();
}else{
echo $_SESSION['user'][$option]
}
}
我多年沒有編寫PHP代碼,因此可能存在語法或邏輯錯誤。
問:每次我調用profile_info時,都會建立到數據庫的新連接嗎?
答:是的。
問:如何修復它,以便它僅對所有信息調用一次數據庫。
如果您多次調用此函數(或其他函數也需要連接),請移動$con - mysqli_connect()
和$con->close();
$con - mysqli_connect()
功能之外的操作,以更高的范圍。 通常,要么在整個腳本的開始(如果幾乎總是需要連接),要么在腳本中的某個點(實際上確定需要實際的數據庫連接)。
然后將連接對象$con
作為參數傳遞給函數,例如
function profile_info($con, $option, ...
這將避免“攪動”連接的開銷。
在使用它時,您可能需要考慮關閉一些SQL Injection漏洞。 在SQL文本中包含“不安全”變量可能是一個問題。
$sql = "SELECT * FROM $mysql_table WHERE uid='"
. mysqli_real_escape_string($con, $uid)
. "'");
$result = $con->query($sql);
使用PDO准備好的語句。 其安全且易於使用。 您可以將其存儲為會話。 而是用普通變量替換會話變量,並且每次都可以不使用會話變量來調用它。這兩種方法都可以,但是在用這種方法初始化后,session方法不會每次都調用數據庫。
//in case if you want to store all in session
session_start();
$con=new PDO('mysql:host='.$host.';dbname='.$dB.'', $dbUser, $dbPass);
$q=$con->prepare("SELECT * FROM $mysql_table WHERE uid=:uid");
$q->bindParam(":uid",$uid);
if ($q->execute())
{
while ($row = $q->fetch())
{
$_SESSION['fname']=$row['first_name'];
$_SESSION['lname']= $row['last_name'];
$_SESSION['nick']=$row['nick_name'];
$_SESSION['email']=$row['email'];
$_SESSION['dob']=$row['date_of_birth'];
$_SESSION['status']=$row['status'];
}
}
else
{
echo '<pre>';
print_r($q->errorInfo());
echo '</pre>';
}
$con=null;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.