2014-02-18 5 views
1

나는 잠시 동안이 질문에 대해 궁금해했다. 나는 그들 중 하나가 함수이고 다른 하나는 그렇지 않다는 사실을 제외하면 거의 똑같은 두 개의 PHP 프로그램을 가지고있다. 또한 하나의 작품과 다른 오류를 다시 보내PHP 오류 정의 : 객체가 아닌 객체에서 fetch_object() 멤버 함수 호출

Call to a member function fetch_object() on a non-object 

내가 변수를 생략하고 최종 문자열을 삽입하고 mysqli_errno 대신 $con->errno을 추가하여 작동하지 않는 사람을 고정. 그러나 문자열을 변수로 다시 대체하면 문제가 반환됩니다.

내 질문은 :이 오류의 원인과 해결 방법. 또한 두 번째 코드에서 오류가 발생하는 이유는 무엇입니까?

첫 번째 코드 (작품)

<?php 
$con = new mysqli("database info"); 

if (mysqli_connect_errno()) 
    { 
    echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
    } 

$stmt = $con->query("SELECT coordinator, announcements, description, comments, picture FROM Class_data WHERE class_year = '" .$class. "';"); 

    $result_row = $stmt->fetch_object(); 

    $coordinator = $result_row->coordinator; 
    $announcement = $result_row->announcements; 
    $description = $result_row->description; 
    $comments = $result_row->comments; 
    $picturepath = $result_row->picture; 

    mysqli_error($con); 

    mysqli_close($con); 

    if ($picturepath == "") 
    { 
     $picturepath = "../images/AlumnLogo.png"; 
    } 
?> 

두 번째 코드 (작동하지 않습니다)

<?php 

function fetch($page, $content1, $content2, $content3) 
{ 
    $con = new mysqli("database info"); 
    if ($con->errno) 
     { 
     echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
     } 

    $stmt = $con->query("SELECT '" .$content1. "' , '" .$content2. "' , '" .$content3. "' FROM '" .$page. "';"); 

    $result_row = $stmt->fetch_object(); 

    $content = array(); 
    $content[0] = $result_row->body; 
    $content[1] = $result_row->calendar; 
    $content[2] = $result_row->announcements; 
    $output = implode("--",$content); 

    mysqli_error($con); 

    mysqli_close($con); 

    return $output; 
} 

?> 

감사 alot을!

+0

mysqli 연결 오류를 확인하는 방법이 잘못되어 다른 버전으로 특정 방법으로 작업해야하므로 어떤 버전의 PHP를 사용하고 있습니까 http://www.php.net/ manual/ko/mysqli.construct.php – Anigel

답변

1

작은 따옴표를 사용하여 열 이름을 인용합니다. 그렇게 할 수 없다면 예약어 나 공백 등의 경우 backticks를 사용하여 테이블과 컬럼 이름을 인용해야하며 작은 따옴표 나 큰 따옴표를 사용하여 값을 따옴표로 묶어야한다.

가 코드를 변경

: 그건 그렇고

$stmt = $con->query("SELECT `" .$content1. "` , `" .$content2. "` , `" .$content3. "` FROM `" .$page. "`;"); 
          ^All these 

, 나는 당신이 당신의 테이블 - 이름과 열 이름에 대한 화이트리스트를 사용하는 가정합니다. 그렇지 않으면 SQL 주입을 피해야합니다.

데이터베이스 호출에 오류 처리를 추가하는 것도 좋은 방법입니다. mysqli를 사용하는 쉬운 방법은 mysqli_report(MYSQLI_REPORT_STRICT);을 스크립트 시작 부분에 놓는 것입니다. 이렇게하면 mysqli가 예외를 throw하여 각 데이터베이스 호출에서 개별 오류를 확인할 필요가 없게된다.

+0

고마워. 그래. –

+0

그래서 쿼리가 false를 반환하면 오류가 다시 발생합니다. 그 점을 분명히 해주셔서 감사합니다. –

+0

@Ignatius_Gim 방금 오류 처리에 대한 몇 가지 사항을 추가했습니다. – jeroen

0

오류 메시지는 단순히 개체가 아닌 다른 개체에서 메서드를 호출하려고한다는 것을 의미합니다. 문제는 $stmt가 개체가 아닙니다.

SQL Statemetn에 오류가 있기 때문에 이런 현상이 발생합니다. 이 경우 $con->query()false입니다. 따라서 실행하려고하는 것은 false->fetch_object();과 같습니다. 그리고 false은 개체가 아닙니다 ...

생성 된 SQL 문을 인쇄하십시오. 일부 구문 오류가있을 수 있습니다. 문제가 해결되면 작동 될 것입니다

관련 문제