2014-09-08 3 views
0

MySQL 데이터베이스에서 정보를 가져 오기 위해 PHP에서 함수를 만들었지 만 확실하지 않습니다.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을 새로 연결합니까?

그렇다면 모든 정보에 대해 데이터베이스를 한 번만 호출하도록 수정하는 방법은 무엇입니까?

감사합니다, 팀

+2

예, 함수를 호출 할 때마다 새 연결을 만들고 쿼리 한 다음 해당 연결을 닫습니다. 이 문제를 해결하려면 함수 외부의 데이터베이스에 연결하고 함수를 연결에 전달하십시오. –

+2

나는 '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

Q : profile_info를 호출 할 때마다 데이터베이스에 새로운 연결을 설정합니까?

대답 : 예.

Q : 모든 정보에 대해 데이터베이스를 한 번만 호출하도록 수정하려면 어떻게해야합니까?

이 함수를 두 번 이상 호출하거나 다른 함수에서도 connectioN이 필요한 경우 함수 외부에서 $con - mysqli_connect()$con->close(); 연산을 상위 범위로 이동하십시오. 일반적으로 전체 스크립트의 시작 부분에서, 거의 항상 연결이 필요하거나 스크립트의 시점에서 데이터베이스 연결이 실제로 필요하다고 판단되는 시점에 중 하나입니다.

그런 다음 연결 객체 $con을 인수로 함수에 전달합니다 (예 :

function profile_info($con, $option, ... 

이렇게하면 연결을 "교활 (churning)"하는 오버 헤드를 피할 수 있습니다.


SQL 인젝션 취약점을 해결하는 것이 좋습니다. SQL 텍스트에 "안전하지 않은"변수를 포함시키는 것이 문제가 될 수 있습니다.

$sql = "SELECT * FROM $mysql_table WHERE uid='" 
    . mysqli_real_escape_string($con, $uid) 
    . "'"); 
$result = $con->query($sql); 
+0

문제가 _connecting_가 아닌 두 번 이상 _calling_ 한 번 이상입니다. 그는 데이터가 한 번만 호출되도록하고 싶습니다.이 경우 함수가 호출 될 때마다 데이터가 검색됩니다. – vcapra1

+0

@VinnieCaprarola : 나는 그것을 놓쳤다. 스크립트가 커지고 더 많은 함수에 연결이 필요하면 각 데이터베이스 쿼리에 대한 ** 연결 **이 문제가됩니다. (OP 질문에 더 잘 답하는 답에 +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'를 사용합니다. 이는 mysqli를 사용합니다 (PDO보다 약간 더 끔찍한 API 만 제공). – mario