簡體   English   中英

PHP函數調用MySQL

[英]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.

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