2014-09-08 3 views
0

Я сделал функцию в PHP, чтобы захватить информацию из базы данных MySQL, но я не уверен в чем-то.PHP Function Calling 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

+2

Да, он создает новое соединение при каждом вызове функции, запросы и затем закрывает это соединение. Чтобы исправить это, подключитесь к базе данных вне функции и передайте соединение в функцию. –

+2

Мне нравится, как все на SO признали, что использование 'mysql_' функций - это плохая практика, а затем продолжает писать сломанный код с помощью mysqli. –

ответ

1

Да, он всегда соединяется для информации.

Вы можете использовать $_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 в течение многих лет, так что может быть синтаксис или логическая ошибка.

1

Как о сохранении глобальной переменной со строкой, и только загрузки данных один раз. Затем, если он уже загружен, просто используйте данные, хранящиеся в $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) 
} 
0

Вопрос:. Выполняет ли новое подключение к базе данных каждый раз, когда я вызываю profile_info?

A: Да.

Q: Как исправить это так, чтобы он вызывал только одну базу данных один раз для всей информации.

Если вы вызываете эту функцию более одного раза (или другие функции также нуждаются в connectioN), то переместите операции $con - mysqli_connect() и $con->close(); вне функции в более широкий диапазон. Обычно либо в начале всего скрипта, если вам почти всегда требуется соединение, либо в точке сценария, в точке определено, что соединение с базой данных действительно понадобится.

Затем передайте объект подключения $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); 
+0

Проблема не _connecting_ более одного раза, она _calling_ более одного раза. Он хочет, чтобы данные были _called for_ только один раз, в этом случае данные будут извлекаться каждый раз, когда вызывается функция. – vcapra1

+0

@VinnieCaprarola: Я пропустил это. По мере того как скрипт растет, и для большего количества функций требуется соединение, ** соединение ** для каждого запроса базы данных станет проблемой. (+1 на ваш ответ, который лучше подходит для вопроса, заданного вопросом.) – spencer7593

+0

Нет проблем. Фактически, этот метод может быть применен. Просто переместите код поиска вне функции, а также код подключения. – vcapra1

0

Использование 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; 
+0

Ваш пример может быть с использованием подготовленных операторов, но не используется * привязка параметров * (с использованием заполнителей). OP уже использует 'mysqli', который предоставляет оба значения (только с немного более ужасным API, чем PDO). – mario