2012-07-29 4 views
1

특정 속성을 가진 클래스가 있고 그 속성이 데이터베이스의 열 이름과 일치하도록 최선을 다했다고 가정 해 봅시다. 귀하의 클래스 개체에 DB를.클래스에 데이터베이스 정보를 효율적으로 검색하는 방법

일반적으로 이렇게하는 방법은 $class->get_all() 메서드를 만들어 특정 쿼리와 일치하는 모든 행을 데이터베이스에 쿼리하는 것입니다. 그런 다음 리소스 세트에서 mysql_fetch_object ($ resource)를 사용하여 여러 sql 객체를 만든 다음 하나의 배열에 저장 한 다음 반환합니다. 나도 같은 특성을 가진, 2 개체 ($ 행 및 $ 클래스)가 의미하는 ...

<?php 
    while($row = mysql_fetch_object($result_set)){ 
     $class->id = $row->id; 
     $class->name = $row->name; 
     $class->birthdate = $row->birthdate; 

     $output[] = $class; 
    } 

    return $output; 
?> 

을, 나는 다른에 그들 중 하나를 복사하고 : 기본적으로이 같은 일이 일반적으로 발생합니다.

최적화 방법이 있습니까? 마찬가지로, 하나에서 다른 값을 복사하는 대신 같은 SQL 개체 속성에 대한 포인터로 그들을 설정할 수 있습니까?

+3

새 코드를 작성하는 데 mysql_ * 함수를 사용하지 마십시오. 더 이상 유지 관리되지 않으며 커뮤니티가 [지원 중단 프로세스] (http://goo.gl/KJveJ)를 시작했습니다. * [빨간색 상자] (http://goo.gl/GPmFd) *를 참조하십시오. 대신 [prepared statements] (http://goo.gl/vn8zQ)에 대해 알아야하고 [PDO] (http://php.net/pdo) 또는 [MySQLi] (http://php.net/)를 사용해야합니다. mysqli). 어떤 것을 결정할 수 없다면 [이 기사] (http://goo.gl/3gqF9)가 도움이 될 것입니다. PDO를 선택하면 [여기는 좋은 가이드입니다] (http://goo.gl/vFWnC). –

+0

farxad (SO에서)를 조금 더 파고 들었습니다. 흥미로운 점이있었습니다. PHP는 "pass by reference"대신 "pass by value"에서 작동하기 때문에 코드가 분명 더 느리게 실행됩니다. 이를 완화하기 위해 PHP 인터프리터에는 지연 변수와 같은 기능이있어 변수 값을 다른 변수에 대한 포인터로 설정합니다. 이것은 기본적으로 $ class-> id = "$ row-> id에있는 모든 값"이기 때문에 위의 코드가 (비추천에도 불구하고) 내가 생각한 것보다 비효율적이지 않음을 의미합니다. :) – Tobias

+0

'$ row-> id'는 리터럴 ID (정수)를 포함합니다. 그것은 가치가 아니라 참조에 의해 전달됩니다. '$ row' 객체 전체를 전달한다면 올바른 것입니다. 귀하의 초기 가정은 정확합니다. –

답변

2
PDO와

:

<?php 

    $pdo = new PDO("mysql:host=localhost;dbname=database_name", "user", "pass"); 
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, PDO::ERRMODE_EXCEPTION); 
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
    $stmt = $pdo->query("SELECT `id`, `username`, `password` FROM `whatever`"); 

    while ($class = $stmt->fetchObject("YourClassNameHere")) { 
     /* 
     * $class now holds an object of type YourClassNameHere 
     * With all properties set properly. 
     */ 
    } 

참고 이것은 단순한 일례이다. 프로덕션 코드에서 사용자 입력을 고려해야 할 수도 있습니다.이 경우 준비된 문을 사용합니다. 결과를 가져 오는 방식은 변경되지 않습니다.

+0

안녕 진실, 입력 주셔서 감사합니다. PDO 확장이 기존 클래스 구조를 고려한 것처럼 보입니다. 나는 PDO에 대해 듣고 있었지만 실제로 사용하지는 않았다. 이유는 없다. 호기심에서 벗어나 : PDO를 사용하지 않고 최종 결과를 달성 할 수 있습니까? – Tobias

+0

@Tobias : 아마이게 얼마나 멋지고 쉬운 지 보겠습니다. 설정이없고 인스턴스화가 전혀 없습니다. –

관련 문제