찾다

 >  Q&A  >  본문

다른 클래스에서 PDO 연결을 사용하는 방법

<p>객체 지향 프로그래밍(OOP)의 작동 방식을 이해하는 데 문제가 있는 것 같습니다. 작동하도록 코드를 변경했지만 올바른 방법은 아닌 것 같습니다. 다음은 시나리오입니다(아니요. 사용자 로그인을 직접 만드는 것은 아닙니다. OOP를 더 잘 이해하기 위한 것입니다). </p> <p>database.php 파일이 있습니다:</p> <pre class="brush:php;toolbar:false;">클래스 데이터베이스 { /* 속성 */ 비공개 $conn; 개인 $dsn = 'mysql:dbname=test;host=127.0.0.1'; 개인 $user = '루트'; 개인 $password = ''; /* 데이터베이스 연결 생성 */ 공개 함수 __construct() { 노력하다 { $this->conn = new PDO($this->dsn, $this->user, $this->password); } 잡기(PDOException $e) { "오류!: "를 인쇄합니다. $e->getMessage() ""; 주사위(); } $this->conn을 반환합니다. } }</pre> <p>그래서 이 수업에서는 데이터베이스 연결을 만들고 연결(객체?)을 반환합니다</p> <p>그런 다음 유명한 User 클래스인 두 번째 클래스가 있습니다(실제로 자동 로딩을 사용하지 않지만 그것에 대해 알고 있습니다). </p> <pre class="brush:php;toolbar:false;">include "database.php"; 클래스 사용자 { /* 속성 */ 비공개 $conn; /* 데이터베이스 액세스 얻기 */ 공개 함수 __construct() { $this->conn = 새 데이터베이스(); } /* 로그인 사용자 */ 공개 함수 로그인() { $stmt = $this->conn->prepare("사용자 이름, 사용자 메일 FROM 사용자 선택"); if($stmt->execute()) { while($rows = $stmt->fetch()) { $fetch[] = $행; } $fetch를 반환합니다. } 또 다른 { 거짓을 반환; } } }</pre> <p>이것이 제가 듣는 두 수업입니다. 보시다시피 별거 없습니다. 이제 <code>login</code> 함수 이름으로 혼동하지 마세요. 실제로는 데이터베이스에서 일부 사용자 이름과 사용자 메일을 선택하여 표시하려고 합니다. 나는 다음과 같은 방법으로 이를 달성하려고 했습니다. </p> <pre class="brush:php;toolbar:false;">$user = new User(); $list = $user->로그인(); foreach($list를 $test로 표시) { echo $test["사용자 이름"]; }</pre> <p>여기에 문제가 있습니다. 이 코드를 실행하면 다음과 같은 오류 메시지가 나타납니다. </p> <인용문> <p>잡히지 않은 오류: 정의되지 않은 메소드 Database::prepare()에 대한 호출</p> </인용문> <p>이 오류의 원인을 실제로 이해하고 있는지 잘 모르겠습니다.</p> <p><strong>다음을 변경하면 코드가 제대로 작동합니다. </strong></p> <p>database.php의 <code>$conn</code>를 비공개에서 공개로 변경했습니다(이건 나쁜 것 같은데...? 하지만 비공개인 경우 데이터베이스 클래스 실행 쿼리에서만 사용할 수 있습니다. 내부적으로는, 그렇죠? 그러면 이러한 쿼리를 모두 Database 클래스에 넣어야 할까요? 큰 프로젝트에서는 매우 커질 것이기 때문에 이는 좋지 않은 것 같습니다...)</p> ; <p>두 번째 변경 사항은 다음과 같습니다.</p> <p>user.php 파일의 <code>$this->conn->prepare</code>를 <code>$this->conn->conn->prepare< 코드>. 나는 이것에 대해 정말로 모른다. </p> <p>내 말은, <code>user.php</code>의 생성자에 <code>$this->conn = new Database()</code>가 있다는 뜻입니다. DB 클래스에서 연결 개체를 반환합니다. 왜 두 번째 <code>conn-></code></p>가 있어야 하는지 모르겠습니다.
P粉293550575P粉293550575464일 전486

모든 응답(1)나는 대답할 것이다

  • P粉451614834

    P粉4516148342023-08-25 11:13:39

    • Database 같은 클래스는 쓸모가 없으니 만들지 마세요. PDO에 추가 기능을 추가하는 경우 데이터베이스 래퍼 클래스를 만드는 것이 합리적입니다. 그러나 현재 코드를 고려하면 원시 PDO를 사용하는 것이 더 좋습니다.
    • 원본 PDO 또는 데이터베이스 클래스에서 단일 $db 인스턴스를 만듭니다.
    • 데이터베이스 연결이 필요한 모든 클래스에 생성자 매개변수 로 전달합니다.

    database.php:

    으아아아

    user.php

    으아아아

    app.php

    으아아아

    출력:

    으아아아

    PDO에 대한 자세한 내용은 내 (유일하게 올바른) PDO 튜토리얼을 확인하세요.

    회신하다
    0
  • 취소회신하다