我在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
时,它是否都会与数据库建立新的连接?
如果是这样的话,我该如何修复它,使它对所有信息只调用数据库一次。
谨致问候,Tim
是的,它总是连接以获取信息。
您可以使用$_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代码了,所以可能会出现语法或逻辑错误
如何将全局变量与行一起存储,并且只加载一次数据。然后,如果它已经加载过一次,只需使用存储在$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)
}
Q:每次我调用profile_info时,它都会与数据库建立新的连接吗?
答:是的。
问:我该如何修复它,使它对所有信息只调用数据库一次。
如果您多次调用此函数(或者其他函数也需要connectioN),则将$con - mysqli_connect()
和$con->close();
操作移到函数之外的更高范围。通常,在整个脚本开始时(如果您几乎总是需要连接),或者在脚本中确定实际需要数据库连接时。
然后将连接对象$con
作为参数传递给函数,例如
function profile_info($con, $option, ...
这将避免"搅乱"连接的开销。
在进行此操作时,您可能需要考虑关闭一些SQL注入漏洞。在SQL文本中包含"不安全"变量可能是一个问题。
$sql = "SELECT * FROM $mysql_table WHERE uid='"
. mysqli_real_escape_string($con, $uid)
. "'");
$result = $con->query($sql);
使用PDO准备的语句。它安全且易于使用。以下是可以将其存储为会话的方法。相反,用普通变量替换会话变量,您可以在不使用会话变量的情况下每次调用它。这是可能的,但会话方法不会在数据库以这种方式初始化后每次都调用数据库。
//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;