2012-12-24 7 views
-1

나는 다음과 같은 코드를 가지고 : 그것은 무엇을PDO 쿼리

function user_name($id) { 
    $eqpt_name1 = $this->sql->query("SELECT `f_val` FROM `profiles` WHERE `u_id` = $id AND `f_id` = 1"); 
    $eqpt_name1_2 = $eqpt_name1->fetch(); 
    $name1 = $eqpt_name1_2['f_val']; 

    $eqpt_name2 = $this->sql->query("SELECT `f_val` FROM `profiles` WHERE `u_id` = $id AND `f_id` = 2"); 
    $eqpt_name2_2 = $eqpt_name2->fetch(); 
    $name2 = $eqpt_name2_2['f_val']; 

    $name3 = $name1 . " " . $name2; 

    return $name3; 
} 

제공된 사용자 ID ($ ID)를 가지고 있으며 첫 번째 ($ 이름 1)과 마지막 ($ NAME2) 이름을 가져옵니다을 를 입력 받아 출력한다.

나는 예를 들어,

$username = user_name($_SESSION['user_id']); 

$_SESSION['user_id']1이다 다음을 수행하여 호출합니다.

수동으로 코드를 PHP 파일에 넣으면 제대로 작동합니다.

PHP Fatal error: Call to a member function query() on a non-object

내가 쓴 적이 : 나는 기능을 사용할 때 모든 페이지에 그 긴 쿼리 코드를 할 필요가 없습니다하지만 그래서 전체 사이트를 통해 전 세계적으로 사용할 수 있습니다, 아파치는 날이 오류를 제공합니다 이전에 쿼리가 있고 내가 무엇을 잘못하고 있는지 확실하지 않은 함수.

+0

무엇을 시도 했습니까? 무엇이 효과가 없습니까? 이 문제를 해결하기 위해 어떤 연구를 해왔습니까? 인터넷과 SO에서 오류 메시지를 검색 했습니까? 뭘 찾았 니? 다른 사람에게 그 오류를 일으킨 원인은 무엇입니까? 무엇이 그들의 문제를 해결 했습니까? – Charles

+0

나는 주변을 둘러 보았다. 다른 모든 예제는 준비된 문장을 사용하고 있으며 아직 마스터하지 않았습니다. 함수가 없으면 페이지에서이 코드 집합을 하드 코딩하면 제대로 작동합니다. 함수에서 쿼리가 제대로 작동하지 않는 이유를 모르겠습니다. –

+0

이것은 쿼리 또는 준비된 문과 관련된 오류가 아닙니다. "개체가 아닌 개체에서 ... 멤버 함수 호출"을 발생시키는 원인을 찾으려고 했습니까? – Charles

답변

2

당신이 어떻게 부르 느냐에 따라 판단하면 이는 전 세계적 기능입니다. $this은 정의되지 않으므로 $this->sql을 사용할 수 없습니다. 또한

function user_name($id) { 
    global $sql; 

    $eqpt_name1 = $sql->query("SELECT `f_val` FROM `profiles` WHERE `u_id` = $id AND `f_id` = 1"); 
    $eqpt_name1_2 = $eqpt_name1->fetch(); 
    $name1 = $eqpt_name1_2['f_val']; 

    $eqpt_name2 = $sql->query("SELECT `f_val` FROM `profiles` WHERE `u_id` = $id AND `f_id` = 2"); 
    $eqpt_name2_2 = $eqpt_name2->fetch(); 
    $name2 = $eqpt_name2_2['f_val']; 

    $name3 = $name1 . " " . $name2; 

    return $name3; 
} 

, 당신은 PDO를 사용하고, 왜 당신은 준비된 문을 사용하지 않는 : 당신이 $sql라는 전역 변수가있는 경우, 당신이 그것을 사용하고 있는지 PHP를 말해? 그리고 당신도, 조금 더 일을 단순화 할 수 있습니다 :

function user_name($id) { 
    global $sql; 

    $query = $sql->prepare('SELECT `f_val` FROM `profiles` WHERE `u_id` = :id AND `f_id` IN (1, 2) ORDER BY `f_id`;'); 
    $query->execute(array(':id' => $id)); 

    return implode(' ', $query->fetchAll(PDO::FETCH_COLUMN)); 
} 
+0

아직 학습 중입니다. 준비된 진술. 그래서 'f_id' 1과 2가 필요합니다. 1은 이름이고 2는 성입니다. 그래서 내가 OR을 AND로 바꿀까요? –

+0

@JesseWilliamSzypulski : 업데이트보기, 그냥'IN'을 사용할 수 있습니다. 이 부분은 PDO와 관련이 없으며 SQL과 더 관련이 있습니다. PDO 부분은': id' 것입니다.그것은 ID에 대한 자리 표시자를 정의하고,': id'가'$ id'에 바인드 된 상태에서 쿼리가 실행됩니다. – Ryan

+0

나는 준비된 진술을 시도했다. 그것은 작동합니다. 어떤 이유로 든 최후에 최후를 마지막으로 반환합니다. 그 성을 두 번 퍼팅. –

0

구축물 $ this->는 "자기"예를 들어 참조를 나타 내기 위해 객체 내에서 사용되어야한다.

$ this은 기능 안에 없습니다. PDO 클래스의 인스턴스 인 전역 변수를 사용했을 것입니다. $ this에도 불구하고 $ GLOBALS [ 'varname']을 사용하거나 함수 내에 PDO의 로컬 인스턴스를 생성해야합니다.

function name() 
{ 
    $pdo = new PDO(/* args */); // or use a global one 
    //$pdo = $GLOBALS['pdo']; 
    $statement = $pdo->sql->query("SELECT `f_val` FROM `profiles` WHERE `u_id` = ".$pdo->quote($id)." AND `f_id` = 1"); 
    $statement->execute(); 
    return $statement->fetchColumn(); // return first column 
} 

이름을 연결하기 위해 두 개의 명령문을 사용하는 경우에도주의해야합니다. 당신은 knowleage를 위해서 하나의 SQL 질의로 직접 모든 것을 할 수 있습니다.