2016-09-22 2 views
1

저는 현재 PHP를 배우고 있으며 OOP를 처음 사용합니다. MySQL 쿼리 및 연결을 처리 할 개체를 만들려고합니다.PHP OOP 학습 곡선 - MySQL 객체 오류

이것은 내가 지금까지 만든 것입니다 :

class MySQLDatabase { 

    private $connection; 

    function __construct() { 
     $this->open_connection(); 
    } 

    public function open_connection() { 
     $this->connection = mysqli_connect(DB_SERVER, DB_USER, DB_PASS, DB_NAME); 
     if(mysqli_connect_errno()) { 
      die(
       "Database connection failed: " . mysqli_connect_error() . 
       " (" . mysqli_connect_errno() . ")" 
      ); 
     } 
    } 

    public function close_connection() { 
     if(isset($this->connection)) { 
      mysqli_close($this->connection); 
      unset($this->connection); 
     } 
    } 

    public function query($sql) { 
     $cleaned_sql = mysqli::real_escape_string($sql); 
     $result = mysqli_query($this->connection, $cleaned_sql); 
     $this->confirm_query($result); 
     return $result; 
    } 

    public function mysql_prep($string) {   
     $escaped_string = mysqli_real_escape_string($this->connection, $string); 
     return $escaped_string; 
    } 

    private function confirm_query($result) { 
     if (!$result) { 
     die("Database query failed."); 
     } 
    } 
} 

그리고 대중을 향한면에

이 (예상대로 확실 일들이 작동하도록 테스트를하고) : 현재

$sql = "INSERT INTO users (id, username, password, first_name, last_name) "; 
$sql .= "VALUES (1, 'jbloggs', 'secretpwd', 'Joe', 'Bloggs')"; 
$result = $database->query($sql); 

, 난 그냥 출력을 얻을 : 데이터베이스 쿼리가 실패했습니다.

문제는 내 mysql_prep 함수와 관련이있는 것으로 보인다.

모든 조언을 크게 환영합니다.

미리 감사드립니다. 알렉스.

+0

이 *처럼 뭔가에 다이()을 변경 : * - 당신은 실제 오류가 무엇인지 알아낼 필요 "현재, 나는 단지의 출력을 얻을 데이터베이스 쿼리가 실패했습니다.". –

+0

@ Fred-ii- 오류가 내 mysql_prep 함수와 관련이있는 것 같습니다. 제거하면 문제가 없어집니다. – FruitWinder

+0

완전한 쿼리가 아닌 변수를 정리해야합니다. – RiggsFolly

답변

2

당신은 완전히 WRONG해야 할 일인 이스케이프 기능을 통해 전체 쿼리를 실행하고 있습니다. 이렇게하면 쿼리가 구문 적으로 정확하기 위해 필요한 모든 따옴표가 제거됩니다.

는 전체 일을 탈출하고 있기 때문에
INSERT INTO foo (bar) VALUES ('baz') 

, 데이터베이스에이를 보내는 :

이 고려하는 따옴표 이후

INSERT INTO foo (bar) VALUES (\'bar\') 

탈출, 그들은 따옴표 아니에요 더 이상. 그들은 일반 텍스트 문자이고 DB는 값을 얻기 위해 'bar'이라는 필드를 찾고 있습니다. 삽입하려는 레코드의 필드를 조회 할 수 없습니다. 레코드를 삽입하고있어 아직 존재하지 않기 때문입니다. 그리고 'bar'은 테이블 정의에 존재하지 않을 것입니다.

따라서 구문 오류로 인해 쿼리가 실패하고 고정/변경/쓸모없는 "실패"메시지가 있기 때문에 실패한 이유는 알 수 없습니다.

는 적어도

die("Query failed: " . mysqli_error($this->connection)); 
+0

어떡하죠. 대단히 감사합니다. 더 많이 이해하고 정식으로 지적합니다 :-) – FruitWinder