>백엔드 개발 >PHP 튜토리얼 >웹에서 MySQL에서 데이터 표시 : 소개

웹에서 MySQL에서 데이터 표시 : 소개

Jennifer Aniston
Jennifer Aniston원래의
2025-02-08 09:45:09510검색

웹에서 MySQL에서 데이터 표시 : 소개 다음 기사는

php & mysql : 초보자 닌자, 7 판 , 전문 웹 애플리케이션을 구축하는 데 필요한 모든 도구, 원칙 및 기술을 배우는 실습 가이드의 발췌입니다. 이 시리즈의 최종 튜토리얼에서는 MySQL 데이터베이스에 저장된 정보를 가져 와서 웹 페이지에 모두 볼 수 있도록 표시하는 방법을 배웁니다. docker 로 PHP 개발 환경을 설정하십시오 PHP 에 대한 초보자 안내서 MySQL 소개 : 초보자 안내서 웹에서 MySQL에서 데이터 표시 : 소개
  • 이것은 당신이 가입 한 것들입니다! 이 장에서는 MySQL 데이터베이스에 저장된 정보를 가져 와서 모든 사람들이 볼 수 있도록 웹 페이지에 표시하는 방법을 배우게됩니다. 지금까지, 당신은 첫 번째 PHP 코드를 작성하고 관계형 데이터베이스 엔진 인 MySQL의 기본 사항과 서버 측 스크립팅 언어 인 PHP를 배웠습니다. 이제 이러한 도구를 함께 사용하여 사용자가 데이터베이스에서 데이터를보고 자체 추가 할 수있는 웹 사이트를 작성하는 방법을 배울 준비가되었습니다. 참고 : 3 장에서와 같이 여기에 "MySQL"을 사용하여 데이터베이스 프로토콜을 참조하십시오. PHP 스크립트도 마찬가지입니다. 이 장에 대한 수많은 참고 문헌이 있으며 PHP 코드에는 실제로 MariaDB 데이터베이스에 연결하고 있지만 "MySQL"에 쓸 수 있습니다.
  • 큰 그림
  • 우리가 앞으로 도약하기 전에, 우리의 궁극적 인 목표를 명확하게 그림으로 물러서는 것이 좋습니다. PHP 스크립팅 언어와 MySQL 데이터베이스 엔진의 두 가지 강력한 도구가 있습니다. 이것들이 어떻게 어울리는 지 이해하는 것이 중요합니다.

  • 웹 사이트에 MySQL을 사용하는 목적은 데이터베이스에서 컨텐츠를 동적으로 당겨서 일반 브라우저에서 볼 수있는 웹 페이지를 만들 수 있도록하는 것입니다. 따라서 시스템의 한쪽 끝에는 웹 브라우저를 사용하여 사이트를 방문하여 페이지를 요청합니다. 해당 브라우저는 대가로 표준 HTML 문서를 수신 할 것으로 예상합니다. 다른 쪽 끝에는 SQL 쿼리 (명령)에 응답하는 방법 만 이해하는 MySQL 데이터베이스의 하나 이상의 테이블에있는 사이트의 내용이 있습니다.
  • 위의 이미지에 표시된 바와 같이, PHP 스크립팅 언어는 두 언어를 모두 말하는 중간입니다. 페이지 요청을 처리하고 3 장에서 농담 테이블을 만드는 데 사용한 것과 마찬가지로 SQL 쿼리를 사용하여 MySQL 데이터베이스에서 데이터를 가져옵니다. 그런 다음 브라우저가 기대하는 멋지게 형식의 HTML 페이지로 동적으로 뱉어냅니다. > 그냥 마음이 명확하고 신선합니다. 웹 사이트에 페이지를 방문하는 사람이있을 때 발생하는 일입니다.

    방문자의 웹 브라우저는 웹 서버에서 웹 페이지를 요청합니다. 웹 서버 소프트웨어 (일반적으로 Apache 또는 Nginx)는 요청 된 파일이 PHP 스크립트임을 인식하므로 서버는 PHP 통역사를 발사하여 파일에 포함 된 코드를 실행합니다. 특정 PHP 명령 (이 장의 초점이 될 것)은 MySQL 데이터베이스에 연결하여 웹 페이지에 속하는 컨텐츠를 요청합니다. MySQL 데이터베이스는 요청 된 콘텐츠를 PHP 스크립트로 전송하여 응답합니다. PHP 스크립트는 컨텐츠를 하나 이상의 PHP 변수에 저장 한 다음 Echo 문을 사용하여 웹 페이지의 일부로 컨텐츠를 출력합니다. PHP 통역사는 웹 서버에 생성 한 HTML의 사본을 건네서 마무리됩니다. 웹 서버는 HTML 파일에서 직접 오는 대신 PHP 통역사가 제공하는 출력이라는 점을 제외하고는 HTML을 일반 HTML 파일로 보낼 수 있습니다. 그러나 브라우저는 이것을 알 수있는 방법이 없습니다. 브라우저에 관한 한, 다른 웹 페이지와 마찬가지로 웹 페이지를 요청하고 받고 있습니다.

    MySQL 사용자 계정 만들기 PHP가 MySQL 데이터베이스 서버에 연결하려면 사용자 이름과 비밀번호를 사용해야합니다. 지금까지 농담 데이터베이스에 포함 된 모든 것은 다수의 pithy
  • bon mots 이지만, 얼마 지나지 않아 이메일 주소 및 웹 사이트 사용자에 대한 기타 개인 정보와 같은 민감한 정보가 포함될 수 있습니다. 이러한 이유로 MySQL은 매우 안전하도록 설계되었으며, 어떤 연결이 수용 할 것인지, 해당 연결이 허용되는 일을 엄격히 제어 할 수 있습니다. Docker Environment에는 이미 MySQL 서버에 이미 로그인하는 데 사용한 3 장에 MySQL 사용자가 이미 포함되어 있습니다.
  • you
  • 동일한 사용자 이름 (v.je) 및 비밀번호 (v.je)를 사용하여 PHP 스크립트의 데이터베이스에 연결할 수 있지만 새 계정을 작성하는 것이 유용합니다. 웹 서버는이를 사용하여 둘 이상의 웹 사이트를 호스팅 할 수 있습니다. 각 웹 사이트에 자체 사용자 계정을 제공하면 주어진 사이트에 대한 데이터에 액세스 할 수있는 사람을 더 많이 제어 할 수 있습니다. 다른 개발자와 함께 일하고 있다면 작업중 인 사이트에 액세스 할 수 있지만 더 이상. 웹 사이트가 의존하는 IJDB 데이터베이스에서 작업하는 데 필요한 특정 권한만으로 새 사용자 계정을 작성해야합니다. 지금 해보자. 사용자를 만들려면 MySQL 워크 벤치를 열고 서버에 연결하십시오. 그런 다음 다음 쿼리를 실행하십시오
    CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
    GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
    
    첫 번째 쿼리는 상당히 자체 설명입니다. 비밀번호 MyPassword가있는 ijdbuser라는 사용자를 만듭니다. 사용자 이름의 % 부호는 데이터베이스가 모든 위치에서 연결할 수 있음을 나타냅니다. 두 번째 쿼리는 사용자에게 IJDB 스키마에 대한 전체 ACCE를 제공합니다. 결과적 으로이 사용자는 IJDB 스키마의 모든 테이블, 열 및 데이터를보고 수정할 수 있지만 그 외부의 어떤 것도 액세스 할 수 없습니다. 이제 사용자 ijdbuser가 생성되었으므로 데이터베이스에 연결하는 데 사용할 수 있습니다. 이 사용자와 MySQL Workbench에서 연결을 설정할 수는 있지만 권한이 제한되어 있으므로 V.JE 계정을 사용하여 MySQL 워크 벤치를 유지하는 것이 좋습니다. 대신, 우리는 PHP 스크립트에서 연결할 때 새 사용자를 사용할 것입니다.

    php

    와 MySQL에 연결 웹 페이지에 포함시키기 위해 MySQL 데이터베이스에서 컨텐츠를 검색하기 전에 PHP 스크립트 내부에서 MySQL에 연결하는 방법을 알아야합니다. 지금까지 MySQL Workbench라는 응용 프로그램을 사용하여 데이터베이스에 연결했습니다. MySQL Workbench가 실행중인 MySQL 서버에 직접 연결할 수있는 것처럼 자신의 PHP 스크립트도 마찬가지입니다. 이 장에서는 PHP에서 MySQL에 연결하는 것에 대해 전적으로 이야기하지만 실제로 이전 장에서 논의 된 Mariadb 데이터베이스에 연결하고 있습니다. PHP는 MySQL과 MariaDB의 차이가 서로 교환 가능하므로 차이를 볼 수 없습니다. 사용 된 모든 명령을 MySQL 또는 MariaDB 데이터베이스 서버에 연결하는 데 사용될 수 있으므로 데이터베이스를 MySQL이라고합니다. 원래 MySQL 데이터베이스는 서버와 통신하기 위해 MySQL 워크 벤치 및 PHP와 같은

    클라이언트

    에 대한 표준화 된 방법을 제공했습니다. MariaDB는 해당 표준을 복사하고 PHP의 모든 명령은 이름 mysql

    를 사용하므로 간단하게 유지하려면이 장에서 mysql

    라는 용어를 사용하여 데이터베이스를 참조합니다.

    PHP에서 MySQL 서버에 연결하는 세 가지 방법이 있습니다.

    MySQL 라이브러리 Mysqli 라이브러리 PDO 라이브러리

    이들 모두는 본질적으로 동일한 작업을 수행합니다 - 데이터베이스에 연결하고 쿼리를 보내는 것은 다른 코드를 사용하여 달성합니다. MySQL 라이브러리는 데이터베이스에 연결하는 가장 오래된 방법이며 PHP 2.0에 소개되었습니다. 포함 된 기능은 최소화되어 있으며 PHP 5.0 (2004 년에 출시) 기준으로 MySQLI에 의해 대체되었습니다. 기존 MySQL 라이브러리를 사용하여 데이터베이스를 연결하고 쿼리하려면 mysql_connect () 및 mysql_query ()와 같은 기능이 사용됩니다. 이러한 기능은 PHP 5.5 이후로 피해야한다는 것을 의미하며, PHP 7.0 이후 PHP에서 완전히 제거되었습니다.

    . 대부분의 개발자는 PHP 5.0이 출시 되 자마자 변경의 이유를 보았지만 지금은 존재하지 않는 MySQL_* 기능을 사용하여 웹에 여전히 수백 개의 기사와 코드 예제가 있습니다. 15 년 동안 선호하는 도서관.

    라인 mysql_connect ()가 포함 된 코드 예제를 발견하면 기사의 날짜를 확인하십시오. 아마도 2000 년대 초반부터 프로그래밍에서는 오래된 것을 믿어서는 안됩니다. 상황이 항상 바뀝니다. 그래서이 책은 제 7 판에 있습니다!

    PHP 5.0에서 "MySQL 개선"을 위해 MySQLI 라이브러리가 릴리스되어 원래 MySQL 라이브러리의 일부 제한 사항을 해결했습니다. 코드는 mysqli_connect () 및 mysqli_query ()와 같은 함수를 사용하기 때문에 mysqli의 사용을 쉽게 식별 할 수 있습니다. PHP 5.0에서 MySQLI 라이브러리가 출시 된 직후, PHP 5.1이 출시되었으며, 오늘날 PHP를 작성하는 방식을 형성하는 데 도움이되는 상당수의 변경 사항이 있습니다 (주로 객체 지향 프로그래밍과 관련하여 볼 수 있습니다. 이 책의 나중에 많은 것들). PHP 5.1의 주요 변경 사항 중 하나는 MySQL 데이터베이스에 연결하기 위해 세 번째 라이브러리 PDO (PHP 데이터 객체)를 도입했다는 것입니다. PDO와 MySQLI 사이에는 몇 가지 차이가 ​​있지만 주된 것은 PDO 라이브러리를 사용하여 Oracle 서버 또는 Microsoft SQL Server와 같은 거의 모든 데이터베이스 서버에 연결할 수 있다는 것입니다. 개발자의 경우이 일반적인 접근 방식의 가장 큰 장점은 라이브러리를 사용하여 MySQL 데이터베이스와 상호 작용하는 방법을 배운 후에 다른 데이터베이스 서버와 상호 작용하는 것이 매우 간단하다는 것입니다. 아마도 PDO에 대한 코드를 작성하는 것이 더 간단하며 PDO 코드를보다 읽기 쉽게 만들 수있는 뉘앙스가 있습니다. (걱정하지 마십시오. 나중에 그게 무슨 뜻인지 설명하겠습니다.)

    이러한 이유로 가장 최근의 PHP 프로젝트는 PDO 라이브러리를 사용 하며이 책에서 사용하는 방법을 보여 드리겠습니다. 차이점에 대한 자세한 내용은 Sitepoint 기사“PDO 재 도입-PHP의 데이터베이스에 액세스하는 올바른 방법”을 참조하십시오. 작은 역사 수업 후에, 당신은 아마도 코드를 쓰기를 간절히 원할 것입니다. PDO를 사용하여 MySQL 서버에 대한 연결을 설정하는 방법은 다음과 같습니다.

    지금은 2 장에서 사용한 랜드 기능과 마찬가지로 새로운 PDO를 내장 함수로 생각하십시오. 이름!”, 당신은 평균 곰보다 더 똑똑하고, 잠시 후에 무슨 일이 일어나고 있는지 정확히 설명하겠습니다. 어쨌든, 그것은 세 가지 인수를 취합니다 :

      데이터베이스 유형을 지정하는 문자열 (mysql :), 서버의 호스트 이름 (host = hostname;), 데이터베이스 이름 (dbname = database) PHP를 사용하려는 MySQL 사용자 이름 해당 사용자 이름의 MySQL 비밀번호 2 장에서 PHP 함수는 일반적으로 호출 될 때 값을 반환한다는 것을 기억할 수 있습니다. 이 새로운 PDO "기능"은 설정된 연결을 식별하는 PDO 객체라는 값을 반환합니다. 연결을 사용하려고 하므로이 값을 변수에 저장 하여이 값을 보류해야합니다. 데이터베이스에 연결하는 데 필요한 값이 채워져있는 모습은 다음과 같습니다.
    • 당신은 아마도 마지막 두 가지 인수로 무슨 일이 일어나고 있는지 볼 수 있습니다 : 그들은이 장의 앞부분에서 당신이 만든 사용자 이름과 비밀번호입니다. . 첫 번째 인수는 조금 더 복잡합니다. dbname = ijdb 부분은 pdo에게 ijdb라고 불리는 데이터베이스 (
    • schema 라고도 함)를 사용하도록 지시합니다. PHP에서 실행되는 모든 쿼리는 해당 스키마의 테이블로 기본값입니다. 선택 * From joke는 IJDB 스키마의 농담 테이블에서 레코드를 선택합니다. PHP, PDO 및 MySQL에 익숙하더라도 호스트 = MySQL 부분은 혼란스러워 보입니다. 일반적으로 이것은 host = localhost (로컬 컴퓨터, 동일한 기계를 참조, PHP를 실행하는 동일한 기계를 참조) 또는 host = sitepoint.com. 와 같은 데이터베이스가 호스팅되는 특정 도메인 이름을 가리키는 것입니다. 왜 host = mysql이고, mysql은 여기서 무엇을 참조합니까? Docker에서는 각 서비스 에 이름이 표시됩니다. 서버를 구성하는 Docker-Compose.yml 파일을 검사하면 데이터베이스 서비스를 MySQL이라고하며 Docker에서는 한 서비스가 다른 서비스 이름을 사용하여 다른 서비스에 연결할 수 있습니다.
    . 인수를 제외하고, 여기에서 볼 수있는 것은 새로운 pdo가 반환 한 값이 $ pdo라는 변수에 저장된다는 것입니다. MySQL 서버는 웹 서버와 완전히 별도의 소프트웨어입니다. 따라서 네트워크 중단으로 인해 서버를 사용할 수 없거나 접근 할 수 없거나 제공 한 사용자 이름/비밀번호 조합이 서버에 의해 거부되거나 MySQL 서버를 시작하는 것을 잊었 기 때문에 서버를 사용할 수 없거나 접근 할 수 없을 가능성을 고려해야합니다! 이 경우 새로운 PDO가 실행되지 않으며 PHP 예외를 던질 것입니다.

    참고 : 적어도 기본적으로 PHP는 예외가 발생하지 않고 단순히 연결되지 않도록 구성 할 수 있습니다. 이것은 일반적으로 바람직한 행동이 아닙니다. 잘못된 일을 해결하기가 훨씬 더 어려워지기 때문에

    “PHP 예외를 던지는 것”이 무엇을 의미하는지 궁금하다면 스스로를 바꾸십시오! PHP 언어의 더 많은 기능을 발견하려고합니다.
    CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
    GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
    
    PHP 예외는 PHP에 작업을 수행하도록 지시 할 때 발생하며 수행 할 수 없습니다. PHP는 말한 것을 시도하지만 실패 할 것입니다. 그리고 실패에 대해 말하면 예외가 발생합니다. PHP가 특정 오류 메시지와 함께 충돌하는 예외는 예외입니다. 예외가 발생하면 PHP가 중지됩니다. 오류 후 코드 라인이 실행되지 않습니다.

    책임있는 개발자로서, 프로그램이 계속 될 수 있도록 그 예외를 포착하고 그것에 대해 무언가를하는 것이 당신의 일입니다.

    .

    참고 : 예외를 포착하지 않으면 PHP는 PHP 스크립트 실행을 중단하고 화려한 못생긴 오류 메시지를 표시합니다. 이 오류 메시지는 오류를 던진 스크립트의 코드를 표시합니다. 이 경우 해당 코드에는 MySQL 사용자 이름과 비밀번호가 포함되어 있으므로 사용자가 표시하는 오류 메시지를 피하는 것이 특히 중요합니다! 예외를 잡으려면 시도와 함께 예외를 던질 수있는 코드를 둘러싸고 있어야합니다.

    당신은 시도를 생각할 수 있습니다… If… else 진술과 같은 Catch 문, 두 번째 코드 블록이 첫 번째 코드 블록이 실행되지 않으면 발생한다는 점을 제외하고. > 아직 혼란 스럽습니까? 나는 내가 당신에게 많은 새로운 개념을 던지고 있다는 것을 알고 있지만, 모든 것을 모아서 우리가 가진 것을 보여 주면 더 의미가있을 것입니다 :

    . 보시다시피,이 코드는 시도한 것입니다… Catch 문입니다. 상단의 시도 블록에서는 새로운 PDO를 사용하여 데이터베이스에 연결하려고 시도합니다. 이것이 성공하면 새로운 데이터베이스 연결을 사용하여 결과 PDO 객체를 $ pdo에 저장합니다. 연결이 성공하면 $ 출력 변수가 나중에 표시 될 메시지로 설정됩니다. 중요하게도, 시도해 보면… 캐치 문서에서 예외가 발생한 후 모든 코드는 실행되지 않습니다. 이 경우 데이터베이스에 연결하면 예외가 발생하거나 (암호가 잘못되었거나 서버가 응답하지 않을 수도 있음) $ 출력 변수가 "데이터베이스 연결 설정"으로 설정되지 않습니다. 데이터베이스 연결 시도가 실패하면 PHP는 pdoexception을 던지며 새로운 PDO가 발생하는 예외 유형입니다. 따라서 우리의 캐치 블록은 pdoexception을 잡을 것이라고 말합니다 (그리고 그것을 $ e라는 변수로 보관할 것이라고 말합니다. 해당 블록 내부에서 우리는 무엇이 잘못되었는지에 대한 메시지를 포함하도록 변수 $ 출력을 설정했습니다. 그러나이 오류 메시지는 특히 유용하지 않습니다. PDO가 데이터베이스 서버에 연결할 수 없다는 것입니다. 예를 들어 사용자 이름과 비밀번호가 유효하지 않았기 때문에 왜 그런지에 대한 정보를 얻는 것이 좋습니다.

    $ e 변수에는 문제를 설명하는 오류 메시지를 포함하여 발생한 예외에 대한 세부 정보가 포함되어 있습니다. 연결을 사용하여 출력 변수에 이것을 추가 할 수 있습니다.
    CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
    GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
    
    참고 : $ e 변수는 문자열이 아니라 객체입니다. 우리는 그게 곧 의미하는 바에 올 것입니다. 그러나 지금은 코드 $ e-> getMessage ()가 발생한 특정 예외에 따라 오류 메시지를 가져옵니다. if… else 진술처럼, 시도의 두 가지 중 하나… 캐치 진술은 실행되도록 보장됩니다. 시도 블록의 코드가 성공적으로 실행되거나 캐치 블록의 코드가 실행됩니다. 데이터베이스 연결이 성공했는지 여부에 관계없이 $ 출력 변수에 오류 메시지 또는 연결이 성공했다고한다는 메시지가 있습니다. 마지막으로, 시도 블록이 성공했는지 또는 캐치 블록이 실행되는지에 관계없이 템플릿 output.html.php가 포함되어 있습니다. 이것은 페이지에 텍스트를 표시하는 일반 템플릿입니다.

    완전한 코드는 예에서 찾을 수 있습니다 : MySQL-Connect 템플릿이 포함되어 있으면 오류 메시지 또는 "데이터베이스 연결"메시지가 표시됩니다. 앞서 언급 한 코드가 이제 당신에게 어떤 의미가 있기를 바랍니다. 이 섹션의 시작 부분으로 돌아가서 길을 잃어버린 경우 다시 읽어보십시오. 그러나 코드를 확실하게 잡으면 아마도 여전히 미스터리를 설명 할 수없는 PDOS를 남겼을 것입니다. 새로운 pdo는 정확히 무엇이며, 내가 "pdo 객체"를 반환한다고 말했을 때, 객체는 정확히 무엇입니까? 참고 : 모든 다운로드 된 샘플 코드에는 ijdb_sample이라는 스키마와 ijdb_sample이라는 사용자가 포함되어 있으므로 스키마 및 사용자에게 전화 한 내용에 관계없이 실행할 수 있습니다. 데이터베이스가 포함 된 파일은 데이터베이스로 제공되며 가져올 수 있습니다. 제공된 웹 기반 샘플 코드 뷰어를 사용하는 경우 샘플을로드 할 때 IDBJ_Sample 데이터베이스가 생성되지만 다른 샘플을 볼 때이 스키마의 변경 사항이 손실됩니다. (물건을 엉망으로 만들고 다른 샘플로 전환하고 뒤로 전환 할 수 있지만 변경 사항을 유지하려면 변경하려면 생성 한 스키마에서이를 만들 수 있습니다.) MySQL Workbench를 사용하여 샘플 데이터를 스키마에로드하려면 데이터 가져 오기/복원을 선택하여 프로젝트 디렉토리에서 Database.sql을 가져 오려면 샘플 데이터를 스키마에로드하려면 데이터 가져 오기를 선택하십시오. 그런 다음 자체 포함 파일에서 가져 오기를 선택하고 Database.sql로 찾아보고 기본 대상 스키마에서 스키마 이름을 선택하십시오. 같은 이름의 테이블을 만든 경우 덮어 쓰고 모든 레코드가 손실됩니다. 객체 지향 프로그래밍의 충돌 코스 당신은 이전 섹션에서 "객체"라는 단어가 내 어휘에 들어 오기 시작했을 것입니다. pdo는 php data 객체 확장이고, 새로운 pdo는 pdo

    object

    를 반환합니다. 이 섹션에서는 어떤 개체가 무엇인지 설명하고 싶습니다.

    아마도 당신은 자신의 PHP 또는 일반적으로 프로그래밍에 대한 객체 지향 프로그래밍 (OOP)이라는 용어를 발견했을 것입니다. OOP는 많은 부분을 가진 정말 복잡한 프로그램을 구축하는 데 적합한 고급 프로그래밍 스타일입니다. 오늘날 활성으로 사용되는 대부분의 프로그래밍 언어는 OOP를 지원합니다. 그들 중 일부는 심지어

    당신이 OOP 스타일로 일하기 위해 필요합니다. PHP는 그것에 대해 조금 더 쉬우 며 개발자에게 OOP 스타일로 스크립트를 작성할지 여부를 결정하기 위해 개발자에게 맡깁니다. 지금까지, 우리는 PHP 코드를 절차 프로그래밍이라는 더 간단한 스타일로 작성했으며 나중에 물체를보다 자세히 살펴 보면서 지금도 계속 그렇게 할 것입니다. 절차 스타일은 현재 우리가 다루고있는 비교적 간단한 프로젝트에 적합합니다. 그러나 거의 모든 복잡한 프로젝트를 사용하여 OOP를 사용하면이 책의 뒷부분에서 더 자세히 다룰 것입니다. . 즉, MySQL 데이터베이스에 연결하고 작업하는 데 사용할 PDO 확장 기능은 객체 지향 프로그래밍 스타일로 설계되었습니다. 즉, 단순히 MySQL에 연결하기 위해 함수를 호출 한 다음 해당 연결을 사용하는 다른 기능을 호출하는 대신 먼저 데이터베이스 연결을 나타내는 PDO 를 생성 한 다음의 기능을 사용해야합니다. 데이터베이스와 함께 작동하는 개체 객체를 만드는 것은 함수를 호출하는 것과 매우 흡사합니다. 실제로, 당신은 이미 그것을하는 방법을 이미 보았습니다 :

    새로운 키워드는 PHP에게 새 개체를 만들려고한다는 것을 알려줍니다. 그런 다음 공간을 남기고 클래스 이름을 지정하여 PHP에게 어떤 유형의 객체를 생성 할 것인지 알려줍니다. 클래스는 PHP가 객체를 만들기 위해 따라야 할 일련의 지침입니다. 클래스는 케이크와 같은 레시피라고 생각하고 레시피를 따라 와서 생성되는 실제 케이크라고 생각할 수 있습니다. 다른 레시피가 다른 요리를 생산할 수있는 것처럼 다른 클래스는 다른 물체를 생산할 수 있습니다.

    PHP에 호출 할 수있는 내장 기능이 많이 제공되는 것처럼 PHP는 객체를 만들 수있는 클래스 라이브러리와 함께 제공됩니다. 따라서 New PDO는 PHP에게 새로운 PDO 객체, 즉 내장 PDO 클래스의 새로운 객체를 만들도록 지시합니다. PHP에서 객체는 문자열, 숫자 또는 배열과 마찬가지로 값입니다. 변수에 객체를 저장하거나 다른 PHP 값과 함께 할 수있는 것과 동일하게 인수로 기능으로 전달할 수 있습니다. 그러나 객체에는 유용한 추가 기능이 있습니다.

    우선, 객체는 다른 값의 컨테이너 역할을한다는 점에서 배열처럼 동작합니다. 2 장에서 보았 듯이 인덱스 (예 : $ Birthdays [ 'Kevin'])를 지정하여 배열 내부의 값에 액세스 할 수 있습니다. 객체와 관련하여 개념은 비슷하지만 이름과 코드는 다릅니다. 배열 인덱스에 저장된 값에 액세스하기보다는 객체의 속성에 액세스하고 있다고 말합니다. 액세스하려는 속성의 이름을 지정하기 위해 사각형 브래킷을 사용하는 대신 화살표 표기법 (->)을 사용합니다.

    배열은 일반적으로

    유사한
    CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
    GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
    
    값 (예 : 생일 배열) 목록을 저장하는 데 사용되는 반면, 객체는 관련

    값 목록을 저장하는 데 사용됩니다 (예 : 데이터베이스 연결의 속성). 그럼에도 불구하고, 그것이 모든 객체가 한 경우, 그들에게 많은 점이 없을 것입니다. 우리는 배열을 사용하여 이러한 값을 저장할 수도 있습니다. 물론 물체는 더 많은 일을합니다. 속성 모음과 그 값을 저장하는 것 외에도 객체에는보다 유용한 기능을 제공하도록 설계된 함수 그룹이 포함될 수 있습니다. 객체에 저장된 함수를 메소드 (프로그래밍 세계에서 더 혼란스러운 이름 중 하나)라고합니다. 메소드는 클래스 내에서 단지 함수 일뿐입니다. 더 혼란스럽게도, 우리가 자신의 수업을 작성할 때, 메소드는 함수 키워드를 사용하여 정의됩니다! 숙련 된 개발자조차도 종종 기능 및 를 잘못 사용합니다. 메소드를 호출하려면 다시 화살표 표기법을 사용합니다-$ myObject-> somemethod () : 독립형 함수와 마찬가지로 메소드는 인수와 반환 값을 취할 수 있습니다. 이 단계에서는 아마도 약간 복잡하고 무의미하게 들리지만 나를 믿으십시오 : 변수 (속성)와 함수 (메소드)의 객체라고 불리는 작은 번들로의 수집을 모으면 훨씬 더 깔끔하고 읽기 쉽습니다. 특정 작업에 대한 코드 - 데이터베이스로 작업하는 것은 그 중 하나 일뿐입니다. 언젠가는 자신의 고안의 객체를 만드는 데 사용할 수있는 맞춤형 클래스를 개발할 수도 있습니다. 그러나 현재는 PHP에 포함 된 수업을 고수 할 것입니다. 우리가 만든 PDO 객체로 계속 협력하고 그 방법 중 하나를 호출하여 무엇을 할 수 있는지 살펴 보겠습니다. 연결 구성 지금까지 MySQL 데이터베이스와 연결을 설정하기 위해 PDO 객체를 작성하는 방법과 무언가 잘못 될 때 의미있는 오류 메시지를 표시하는 방법을 보여주었습니다. 연결이 성공한다고 가정하면 사용하기 전에 구성해야합니다. 새로운 PDO 객체의 일부 메소드를 호출하여 연결을 구성 할 수 있습니다.

    쿼리를 데이터베이스로 보내기 전에 데이터베이스 연결의 문자 인코딩을 구성해야합니다. 2 장에서 간략하게 언급했듯이 웹 사이트에서 UTF-8 인코딩 된 텍스트를 사용하여 사이트에서 양식을 작성할 때 사용자가 자신의 처분에 대한 문자 범위를 최대화해야합니다. 기본적으로 PHP가 MySQL에 연결되면 UTF-8 대신 더 간단한 ISO-8859-1 (또는 라틴 -1) 인코딩을 사용합니다. 우리가 그대로두면 중국어, 아랍어 또는 대부분의 영어가 아닌 문자를 쉽게 삽입 할 수 없습니다.

    웹 사이트가 영어 사용자 만 사용한다고 100% 확신하더라도 문자 세트를 설정하지 않아 발생하는 다른 문제가 있습니다. 웹 페이지가 UTF-8으로 설정되지 않은 경우 사람들이 곱슬 인용문과 같은 특정 문자를 텍스트 상자에 쓸 때 문제가 발생합니다. 데이터베이스에 다른 문자로 표시되기 때문입니다.

    . 따라서 이제 UTF-8 인코딩을 사용하도록 새로운 PDO 객체를 설정해야합니다. 우리는 연결을 통해 데이터베이스를 쿼리 할 때 PHP에 UTF-8을 사용하도록 지시 할 수 있습니다. charset = utf8mb4는 연결 문자열에 있습니다. PHP 스크립트가 UTF-8 (최근 PHP 버전의 기본값 인)으로 브라우저로 전송되는 경우이 작업을 수행하는 단점이 없습니다.

    참고 : 검색을하러 가면 숯불을 설정하는 다른 방법을 찾을 수 있으며이 책의 이전 버전은이 코드를 사용하도록 지시했습니다.

    PHP 5.3.6까지 Charset 옵션이 PHP에 의해 올바르게 적용되지 않았기 때문입니다. 실제로 사용하려는 모든 PHP 버전에서 고정되어 있으므로 연결 문자열의 일부로 숯을 설정하는 것이 선호 옵션입니다. MySQL에 연결 한 다음 해당 연결을 구성하는 데 사용하는 전체 코드는 다음과 같습니다. 예 : MySQL-CONNECT-COMPLETE

    브라우저 에서이 예를 발사하십시오. (템플릿 디렉토리에있는 공개 디렉토리와 output.html.php 파일에 데이터베이스 코드를 index.php에 배치 한 경우 페이지의 URL은 https://v.je/.)

    입니다. 서버가 시작되고 실행 중이며 모든 것이 제대로 작동하는 경우 성공을 나타내는 메시지가 표시됩니다.
    CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
    GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
    

    PHP가 MySQL 서버에 연결할 수 없거나 제공 한 사용자 이름과 비밀번호가 잘못된 경우 아래에 표시된 것과 유사한 화면이 표시됩니다. 오류 처리 코드가 올바르게 작동하는지 확인하려면 비밀번호를 의도적으로 철자로 철회하여 테스트 할 수 있습니다. 캐치 블록 덕분에 데이터베이스의 오류 메시지가 페이지에 포함되었습니다.

    CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
    GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
    
    getMessage () 메소드는 발생한 예외를 설명하는 메시지를 반환합니다. getfile () 및 getline ()을 포함한 다른 방법이 있습니다. 예외가 발생한 파일 이름과 줄 번호를 반환합니다. 다음과 같은 매우 상세한 오류 메시지를 생성 할 수 있습니다.

    이것은 수십 개의 포함 파일이있는 큰 웹 사이트가있는 경우 매우 유용합니다. 오류 메시지는 정확히 어떤 파일을 찾아야하고 어떤 오류가 발생했는지 알 수 있습니다. 궁금한 점이 있다면 데이터베이스 연결 코드 (예 : 틀린 데이터베이스 이름)에 다른 실수를 삽입하고 결과적으로 상세한 오류 메시지를 관찰하십시오. 완료되면 데이터베이스 연결이 올바르게 작동하면 간단한 오류 메시지로 돌아갑니다. 이렇게하면 데이터베이스 서버에 진정한 문제가 발생하면 방문자가 기술적 인 GOBBLEDYGOOK에 충격을받지 않습니다. 연결이 설정되고 데이터베이스가 선택된 상태에서 데이터베이스에 저장된 데이터를 사용할 준비가되었습니다.

    스크립트가 실행 된 후 MySQL 서버와의 연결에 어떤 일이 발생하는지 궁금 할 것입니다. 실제로 원한다면 연결을 나타내는 PDO 객체를 폐기하여 PHP가 서버에서 분리하도록 강요 할 수 있습니다. 객체를 포함하는 변수를 null로 설정하여 다음을 수행합니다.
    new PDO('mysql:host=hostname;dbname=database', 'username',
      'password')
    
    즉, PHP는 스크립트 실행을 완료 할 때 열린 데이터베이스 연결을 자동으로 닫으므로 일반적으로 PHP를 정리할 수 있습니다. php

    로 SQL 쿼리 보내기 3 장에서는 MySQL Workbench를 사용하여 MySQL 데이터베이스 서버에 연결하여 SQL 쿼리 (명령)를 입력하고 해당 쿼리의 결과를 즉시 볼 수있었습니다. PDO 객체는 유사한 메커니즘을 제공합니다.

    여기, $ query는 실행하려는 SQL 쿼리를 포함하는 문자열입니다. 아시다시피, 쿼리를 실행하는 데 문제가있는 경우 (예 : SQL 쿼리에서 입력 실수를 한 경우),이 메소드는 PDOException을 포착 할 수 있습니다.

    . 다음 예를 고려하십시오.이 예는 3 장에서 우리가 만든 농담 테이블을 제작하려고합니다. 예 : mysql-create

    우리는 쿼리에서 생성 된 가능한 오류를 처리하기 위해 동일한 시도… 캐치 명령문 기술을 사용합니다. 다중 시도를 사용하는 것이 가능할 것입니다… 다른 오류 메시지를 표시하기 위해 블록을 잡을 수있을 것입니다 (연결 용 및 쿼리 용으로 하나)가 상당한 양의 추가 코드를 초래할 수 있습니다.

    . 대신, 나는 동일한 try 문을 사용하여 연결과 쿼리를 모두 포함하기로 결정했습니다. 시도… 캐치 블록은 오류가 발생하면 코드 실행이 중지되므로 데이터베이스 연결 중에 오류가 발생하면 $ pdo-> exec ($ run) 라인이 실행되지 않으므로 쿼리가 데이터베이스로 전송되는 경우 , 연결이 설정되어 있어야합니다.

    이 방법은 표시된 오류 메시지를 약간 덜 제어 할 수 있지만 각 데이터베이스 작업에 대한 CATCH 문을 입력하는 것을 입력 할 수 있습니다. 이 책의 뒷부분에서 우리는 이것들을 다른 블록으로 분류 할 것이지만 지금은 모든 데이터베이스 작업을 동일한 시도 블록으로 유지합니다.

    . 이 예제는 GetMessage 메소드를 사용하여 MySQL 서버에서 자세한 오류 메시지를 검색합니다. 다음 이미지는 예를 들어 농담 테이블이 이미 존재할 때 표시되는 오류를 보여줍니다.

    삭제, 삽입 및 업데이트 쿼리 (저장된 데이터를 수정하는 데 사용됨)의 경우 exec 메소드는 쿼리의 영향을받는 테이블 행 (항목)의 수를 반환합니다. 3 장에서“프로그래머”라는 단어가 포함 된 모든 농담의 날짜를 설정하기 위해 사용한 다음 SQL 명령을 고려하십시오. 예 : mysql-update

    exec 메소드에서 반환 된 값을 $ fuffectedrows에 저장하면 템플릿에서 인쇄하기 위해 $ 출력 변수의 변수를 사용할 수 있습니다. 아래 이미지는 데이터베이스에 "프로그래머"농담이 하나만 있다고 가정하면이 예제의 출력을 보여줍니다.

    웹에서 MySQL에서 데이터 표시 : 소개 동일한 쿼리를 다시 실행하도록 페이지를 새로 고치면 다음 이미지와 같이 메시지 변경이 표시됩니다. 농담에 적용되는 새 날짜가 기존 날짜와 동일하기 때문에 행이 업데이트되지 않았 음을 나타냅니다.

    선택 쿼리는 많은 데이터를 검색 할 수 있으므로 약간 다르게 처리되며 PHP는 해당 정보를 처리하는 방법을 제공합니다. 핸들링 선택 결과 세트 대부분의 SQL 쿼리의 경우 exec 메소드가 잘 작동합니다. 쿼리는 데이터베이스에 무언가를 수행하며 메소드의 리턴 값에서 영향을받는 행 (있는 경우) 수를 얻습니다. 그러나 쿼리를 선택하려면 exec보다 약간 더 멋진 것이 필요합니다. SELECT Queries는 데이터베이스에서 저장된 데이터를 보는 데 사용됩니다. 데이터베이스에만 영향을 미치는 대신 SELECT Queries는 결과가 있으며 반환하는 방법이 필요합니다. 쿼리 메소드는 exec처럼 보이며, 데이터베이스 서버로 전송 될 인수로 SQL 쿼리를 수락한다는 점에서 exec처럼 보입니다. 그러나 반환하는 것은 쿼리에서 반환 된 모든 행 (항목)의 목록을 포함하는 결과 세트를 나타내는 pdostatem 객체입니다.

    쿼리 처리에 오류가 발생하지 않으면이 코드는 결과 세트 (pdostatement 객체 형식으로)를 변수 $ 결과에 저장합니다. 이 결과 세트에는 농담 테이블에 저장된 모든 농담의 텍스트가 포함되어 있습니다. 데이터베이스의 농담 수에는 실질적인 제한이 없으므로 결과 세트는 상당히 클 수 있습니다.

    나는 2 장에서 while 루프가 루프를해야하지만 몇 번이나 모르는 경우 유용한 제어 구조라고 언급했다. 쿼리가 얼마나 많은 레코드를 반환했는지 모르기 때문에 For Loop을 사용할 수 없습니다. 실제로, 당신은 여기에서 while 루프를 사용하여 결과 세트의 행을 한 번에 하나씩 처리 할 수 ​​있습니다.

    while 루프의 조건은 아마도 익숙한 조건과 다를 수 있으므로 작동 방식을 설명하겠습니다. 조건을 자체적으로 진술로 고려하십시오

    pdostatement 객체의 페치 방법은 결과 세트에서 다음 행을 배열로 반환합니다 (우리는 2 장에서 배열을 논의했습니다). 결과 세트에 더 이상 행이 없으면 Fetch는 대신 False를 반환합니다. (이것은 pdo 객체에 할 수없는 일을하도록 요청하는 경우 - 결과 세트에 남은 행이 없을 때 Fetch가 다음 행을 반환 할 수 없기 때문에
    CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
    GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
    

    pdoexception을 던지십시오. 만약 그렇다면, 우리는 여기서 우리가하는 방식대로 페치 방법을 기준 루프 조건에서 사용할 수 없을 것입니다.)

    . 이제 위의 명령문은 $ 행 변수에 값을 할당하지만 동시에 문장 전체는 동일한 값을 취합니다. 이것이 while 루프의 조건으로 문을 사용할 수있는 것입니다. while 루프는 조건이 False로 평가 될 때까지 루프가 계속 루핑되므로 결과 세트에 행이있는 것처럼이 루프가 여러 번 발생하며, $ 행은 루프가 실행될 때마다 다음 행의 값을 가져옵니다. 남은 것은 루프가 실행될 때마다 $ 행 변수에서 값을 검색하는 방법입니다. Fetch가 반환 한 결과 세트의 행은 결과 세트에서 테이블 열에 이름을 따서 명명 된 지수와 함께 연관 배열로 표시됩니다. $ row가 결과 세트에서 행 인 경우 $ row [ 'joketext']는 해당 행의 joketext 열의 값입니다. 이 코드의 목표는 모든 농담의 텍스트를 PHP 템플릿에 표시 할 수 있도록 모든 농담의 텍스트를 저장하는 것입니다. 이를 수행하는 가장 좋은 방법은 각 농담을 배열에 새 항목으로 저장하는 것입니다.
    new PDO('mysql:host=hostname;dbname=database', 'username',
      'password')
    
    농담이 데이터베이스에서 철수하면 이제 PHP 템플릿 jokes.html.php. 로 전달할 수 있습니다. 요약하려면, 지금 까지이 예제의 컨트롤러 코드는 다음과 같습니다.

    $ 농담 변수는 농담 목록을 저장하는 배열입니다. PHP에서 배열의 내용을 썼다면 다음과 같이 보일 것입니다. 그러나 데이터는 코드에서 수동으로 입력하지 않고 데이터베이스에서 검색되었습니다. 시도 블록이 성공적으로 실행되었는지 여부에 따라 두 가지 다른 변수가 설정되어 있음을 알게 될 것입니다. 변수에 값이 할당되었는지 확인하려면 양식이 제출되었는지 확인하는 데 이전에 사용한 ISSET 기능을 사용할 수 있습니다. 템플릿에는 IF 문이 포함되어있어 오류 또는 농담 목록을 표시할지 여부를 결정할 수 있습니다.

    여기에는 새로운 것이 없지만 농담을 표시하려면 $ 농담 배열의 내용을 표시해야합니다. 우리 가이 시점까지 사용한 다른 변수와 달리 $ 농담 배열에는 단일 값 이상의 것이 포함됩니다. PHP에서 배열을 처리하는 가장 일반적인 방법은 루프를 사용하는 것입니다. 우리는 이미 루프와 루프를 보았습니다. Foreach 루프는 특히 처리에 도움이됩니다 :

    조건 대신, Foreach 루프 상단의 괄호에는 배열이 포함 된 다음 키워드가 포함 된 다음 배열의 각 항목을 차례로 저장하는 데 사용될 새로운 변수의 이름이 포함됩니다. 그런 다음 루프의 본문은 배열의 각 항목에 대해 한 번 실행됩니다. 해당 항목이 지정된 변수에 저장 될 때마다 코드가 직접 액세스 할 수 있도록. PHP 템플릿에서 Foreach 루프를 사용하여 배열의 각 항목을 차례로 표시하는 것이 일반적입니다. 이것이 우리의 $ 농담 배열을 찾는 방법은 다음과 같습니다
    CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
    GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
    
    이 PHP 코드를 혼합하여 루프 및 HTML 코드를 표시하여이를 표시하기 위해 코드는 다소 어수선한 것 같습니다. 이로 인해 템플릿에서 사용될 때 Foreach 루프를 작성하는 대체 방법을 사용하는 것이 일반적입니다.

    두 코드 조각은 기능적으로 동일하지만 후자는 HTML 코드와 혼합 될 때 더 친숙해 보입니다. 이 형식의 코드가 템플릿에서 어떻게 보이는지는 다음과 같습니다.

    IF 문으로 동일한 작업을 수행 할 수 있으므로 중괄호를 피하여 HTML 템플릿 내부를 보는 것이 더 좋습니다.

    이 새로운 도구를 사용하여 농담 목록을 표시하기 위해 템플릿을 작성할 수 있습니다. 예 : MySQL-Listjokes

    $ 오류 텍스트가 페이지에 표시되거나 각 농담이 블록 Quote ()에 포함 된 단락 (

    )에 표시됩니다. 페이지. <..> 농담은 HTML 코드 (예 : 또는 &)로 해석 될 수있는 문자를 포함 할 수 있으므로 HTMLSpecialchars를 사용하여 HTML 문자 엔티티 (즉, & lt;, & gt로 변환해야합니다. ;, 및 & amp;)가 올바르게 표시되도록 다음 이미지는 데이터베이스에 몇 가지 농담을 추가하면이 페이지의 모습을 보여줍니다.

    new PDO('mysql:host=hostname;dbname=database', 'username',
      'password')
    

    컨트롤러의 While 루프를 사용하여 한 번에 하나씩 PDOSTATEMENT 결과를 가져 오기 위해 행을 어떻게 사용했는지 기억하십니까?
    CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
    GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
    

    Pdostatement 객체는 Foreach 루프로 전달할 때 배열처럼 행동하도록 설계되었습니다. 따라서 WIDE 루프 대신 Foreach 루프를 사용하여 데이터베이스 처리 코드를 약간 단순화 할 수 있습니다. 이 책의 나머지 부분 에서이 더 깔끔한 foreach 양식을 사용할 것입니다. 또 다른 깔끔한 도구 PHP는 Echo 명령을 호출하는 속기 방법입니다. 이미 본 것처럼 자주 사용해야합니다. 우리의 에코 진술은 다음과 같이 보입니다 대신, 우리는 이것을 사용할 수 있습니다 :

    이것은 똑같은 일을합니다. =는 에코를 의미하며 변수를 인쇄하는 약간 더 짧은 방법을 제공합니다. 그러나 이것에는 제한이 있습니다. =를 사용하면 인쇄 할 수 있습니다. 동의를 사용할 수는 있지만 성명서, 진술 등을 포함시킬 수 없으며 함수 호출이 이어질 수 있습니다.
    new PDO('mysql:host=hostname;dbname=database', 'username',
      'password')
    
    . 다음은 속기 에코를 사용하는 업데이트 된 템플릿입니다 예 : MySQL-Listjokes-Shorthand

    이 ​​시점에서 적용 할 수있는 속기 표기법을 사용합니다. 참고 : 5.4 이전의 PHP 버전 에서이 속기 표기법에는 상당히 드문 PHP 설정이 활성화되어야하므로 호환성 이유에 대해 권장하지 않았습니다. 속기 표기법을 사용하면 서버에서 사용하지 않은 서버에서 이동할 때 코드가 작동하지 않을 수 있습니다. PHP 5.4 기준 (요즘 현실적으로 접할 수있는 모든 버전), 속기 에코는 PHP 설정에 관계없이 작동하므로 모든 서버에서 작동하지 않을까 걱정하지 않고 안전하게 사용할 수 있습니다. .

    미리 생각 방금 보았던 예제에서, 우리는 페이지를 표시하는 데 필요한 모든 HTML이 포함 된 템플릿 Jokes.html.php를 만들었습니다. 그러나 웹 사이트가 성장함에 따라 더 많은 페이지를 추가 할 것입니다. 우리는 사람들이 웹 사이트에 농담을 추가 할 수있는 페이지를 확실히 원할 것이며, 소개 텍스트, 소유자의 연락처 세부 사항이있는 페이지, 그리고 사이트가 커짐에 따라 아마도 홈페이지가 필요합니다. 사람들이 웹 사이트에 로그인 할 수있는 페이지. 나는 여기에서 꽤 뛰어 넘고 있지만 프로젝트가 어떻게 성장할 것인지 고려할 가치가 있습니다. Jokes.html.php에 방금 사용한 접근 방식을 나머지 템플릿 (addjoke.html.php, home.html.php, contact.html.php, login.html.php 등)에 적용하면 - on - we ' 반복 된 코드가 많이 있습니다.

    웹 사이트의 모든 페이지에는 다음과 같은 모습이 필요한 템플릿이 필요합니다.
    $pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser',
      'mypassword');
    
    프로그래머로서, 반복 코드는 당신이 할 수있는 최악의 일 중 하나입니다. 사실, 프로그래머는 종종“자신을 반복하지 말아라”를 나타내는 건식 원리를 언급합니다. 코드의 반복 섹션을 발견하면 더 나은 솔루션이 있습니다.

    모든 최고의 프로그래머는 게으르고 반복하는 코드는 반복 작업을 의미합니다. 템플릿 에이 복사/붙여 넣기 접근 방식을 사용하면 웹 사이트를 유지하기가 매우 어렵습니다. 각 페이지에 나타나고 싶은 바닥 글과 내비게이션 섹션이 있다고 가정 해 봅시다. 우리의 템플릿은 이제 다음과 같이 보일 것입니다

    우리는 2022 년에 문제가 생길 것입니다! 웹 사이트의 모든 페이지에 대한 템플릿 (예 : jokes.html.php addjoke.html.php, home.html.php, contact.html.php andlogin.html.php - 위의 구조에 코드가 포함됩니다. 저작권 통지에서 연도를“2022”로 업데이트하십시오. 각 템플릿을 열고 날짜를 변경해야합니다. 우리는이 문제를 피하기 위해 서버의 시계 ( 'y')에서 동적으로 읽을 수 있고 날짜를 동적으로 읽을 수 있습니다. 그러나 태그를 추가하려면 어떻게해야합니까? 모든 페이지에 포함 되었습니까? 아니면 메뉴에 새 링크를 추가 하시겠습니까? 우리는 여전히 모든 템플릿 파일을 열고 변경해야합니다!

    5 ~ 6 개의 템플릿을 교체하는 것은 약간 성가 시지만 많은 문제를 일으키지 않을 것입니다. 그러나 웹 사이트가 수십 또는 수백 페이지로 성장하면 어떻게됩니까? 메뉴에 링크를 추가 할 때마다 모든 단일 템플릿을 열고 변경해야합니다.
    CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
    GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
    
    이 문제는

    일련의 포함 진술로 해결 될 수 있습니다. 예를 들면 :

    그러나이 방법은 투시가 필요합니다. 우리는 미래에 어떤 변화가 필요한지 정확하게 예상하고 관련성을 사용하여 변경 사항이있을 장소의 진술을 포함시켜야합니다.

    . 예를 들어, 위의 예에서는 Nav.html.php에 추가하여 새 메뉴 항목을 추가하지만 모든 페이지에 태그를 추가하거나 CSS 클래스를 추가하는 것과 같은 사소한 무언가를 추가하여 쉽게 추가 할 수 있습니다. NAV 요소는 여전히 모든 템플릿을 개방하여 변경을 의미합니다.

    웹 사이트의 수명 동안 필요한 모든 변경 사항을 정확하게 예측할 방법이 없으므로이 장의 시작 부분에서 내가 보여준 접근 방식은 실제로 더 좋습니다 :

    . 우리가 항상이 템플릿을 포함 시키면 Layout.html.php로 호출하겠습니다. $ output 변수를 일부 html code 로 설정하고 탐색 및 내비게이션과 함께 페이지에 나타날 수 있습니다. 보행인. 이것의 이점은 웹 사이트의 모든 페이지에서 날짜를 변경하기 위해서는 한 위치에서만 변경하면됩니다.

    . 나는 또한 $ 제목 변수를 찍었으므로 각 컨트롤러는 태그 사이에 나타나는 값을 일부 CSS (샘플 코드에서 jokes.css로 사용할 수 있음)를 정의 할 수 있습니다. 페이지가 조금 더 예쁘다.
    new PDO('mysql:host=hostname;dbname=database', 'username',
      'password')
    

    모든 컨트롤러는 이제 __DIR__ 포함 할 수 있습니다. '/../templates/layout.html.php'; $ 출력 및 $ 제목에 대한 값을 제공합니다 jokes.php를 사용하여 Layout.html.php를 사용하여 아래 그림과 같이 코딩됩니다예 : MySQL-Listjokes-Layout-1

    CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
    GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
    
    하지만 기다려! 시도 블록에서 $ 출력으로 무슨 일이 일어나고 있습니까? $ 출력 변수에는 실제로 일부 HTML 코드가 포함되어 있습니다. 루프는 농담 목록에 대한 HTML 코드를 포함하는 문자열을 빌드합니다. 원칙적으로, 이것은 우리가 원하는 일입니다. $ 출력 변수에는 layout.html.php의 내비게이션과 바닥 글 사이에 삽입 될 HTML 코드가 포함되어 있지만 코드는 엄청나게 못 생겼어.

    나는 이미 포함 명령문을 통해 HTML과 PHP 코드를 혼합하지 않는 방법을 이미 보여 주었다. 앞서했던 것처럼 농담을 자체 파일로 표시하기 위해 HTML을 옮기는 것이 좋을 것입니다. 그러나 이번에는 농담 목록 페이지에 고유 한 HTML 코드 만 있습니다.

    . <..> jokes.html.php 템플릿 디렉토리 의이 코드에는 다음이 포함되어야합니다

    중요하게도, 이것은 농담을 표시하기위한 코드 일뿐입니다. 내비게이션, 바닥 글, 태그 또는 모든 페이지에서 반복하려는 모든 것이 포함되어 있지 않습니다. 농담 목록 페이지에 고유 한 HTML 코드 일뿐입니다.

    이 템플릿을 사용하려면 다음을 시도 할 수 있습니다

    또는 당신이 매우 영리하다면 :

    이 접근법을 사용하면 논리가 전적으로 건전 할 것입니다. jokes.html.php를 포함해야합니다. 불행히도 포함 명령문은 호출 된 시점에서 포함 된 파일에서 코드를 실행합니다. 위의 코드를 실행하면 출력은 실제로 다음과 같습니다.

    jokes.html.php가 먼저 포함되어 있기 때문에 먼저 브라우저로 전송됩니다. 우리가해야 할 일은로드 jokes.html.php입니다. 그러나 출력을 브라우저로 바로 전송하는 대신 나중에 Layout.html.php가 사용할 수 있도록 $ 출력 변수에 저장해야합니다. . 포함 명령문은 값을 반환하지 않으므로 $ output = 'jokes.html.php'; 원하는 효과가 없으며 PHP에는 대안적인 진술이 없습니다. 그러나 그렇다고해서 불가능하다는 의미는 아닙니다.

    PHP는 "출력 버퍼링"이라는 유용한 기능이 있습니다. 복잡하게 들릴 수도 있지만 개념은 실제로 매우 간단합니다. Echo를 사용하여 무언가를 인쇄하거나 HTML이 포함 된 파일을 포함시키기 위해 일반적으로 브라우저로 직접 전송됩니다. 출력 버퍼링을 사용하여 출력을 브라우저로 바로 전송하는 대신 HTML 코드는 서버에 "버퍼"에 저장됩니다. 이는 기본적으로 지금까지 인쇄 된 모든 것을 포함하는 문자열입니다. 더 나은 PHP는 버퍼를 켜고 언제든지 내용을 읽을 수 있습니다. 우리가 필요한 두 가지 기능이 있습니다 :
    new PDO('mysql:host=hostname;dbname=database', 'username',
      'password')
    
      출력 버퍼를 시작하는 ob_start (). 이 함수를 호출 한 후 Echo 또는 HTML을 통해 인쇄 된 내용은 포함하여 브라우저로 보내지 않고 버퍼에 저장됩니다. 버퍼의 내용을 반환하고 지우는 <_ _> ob_get_clean ().
    • 아마도 추측했듯이 함수 이름의“OB”는“출력 버퍼”를 나타냅니다. 포함 된 파일의 내용을 캡처하려면이 두 기능을 사용하면됩니다.
    • 이 코드가 실행되면 $ 출력 변수에는 jokes.html.php 템플릿에서 생성 된 HTML이 포함됩니다. 우리는 지금 부터이 접근법을 사용할 것입니다. 각 페이지는 두 개의 템플릿으로 구성됩니다
    • 모든 페이지에 필요한 모든 일반적인 HTML이 포함 된 layout.html.php. 해당 특정 페이지에 고유 한 HTML 코드 만 포함하는 고유 한 템플릿
    • 완전한 jokes.php는 다음과 같습니다
    index.php 파일을 추가하여 "홈"링크 작업을하겠습니다. 우리는이 페이지에 모든 것을 넣을 수 있습니다 : 최신 농담, 이달 최고의 농담 또는 우리가 좋아하는 것. 그러나 지금은 간단하게 유지하고 "인터넷 농담 데이터베이스에 오신 것을 환영합니다"라는 메시지 만 표시됩니다. 템플릿 폴더에서 home.html.php라는 파일을 만듭니다

    우리의 index.php는 jokes.html.php보다 훨씬 간단합니다. 데이터베이스에서 정보가 얻어지지 않으므로 데이터베이스 연결이 필요하지 않으며 시도가 필요하지 않습니다… Catch 문은 두 템플릿을로드하고 $ 제목 및 $ 출력 변수를 설정합니다. . 예 : MySQL-Listjokes-Layout-3

    참고 : 필요한 경우 데이터베이스에만 연결하는 것이 좋습니다. 데이터베이스는 많은 웹 사이트에서 가장 일반적인 성능 병목 현상이므로 가능한 한 적은 연결을 선호합니다. 두 페이지가 브라우저에서 작동하는지 테스트하십시오. https://v.je/jokes.php를 방문하고 https://v.je/jokes.php의 환영 메시지를 방문 할 때 농담 목록이 있어야합니다. 두 페이지 모두 내비게이션과 바닥 글을 포함해야합니다 수정을 시도하십시오 .html.php. 변경 사항은 두 페이지 모두에 나타납니다. 사이트에 수십 페이지가있는 경우 레이아웃의 변경 사항은 모든 페이지에 영향을 미칩니다.
    CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
    GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
    
    데이터베이스에 데이터를 삽입하는 이 섹션에서는 사이트 방문자가 데이터베이스에 자신의 농담을 추가 할 수 있도록 도구를 사용하여 도구를 사용하는 방법을 보여 드리겠습니다. 사이트 방문자가 새로운 농담을 입력하도록하려면 분명히 양식이 필요할 것입니다. 다음은 청구서에 맞는 양식에 대한 템플릿입니다.

    템플릿 디렉토리에서 addjoke.html.php로 저장하십시오
    요소의 가장 중요한 부분은 액션 속성입니다. 액션 속성은 양식이 제출되면 브라우저에 데이터를 보낼 위치를 알려줍니다. 이것은 "addjoke.php"와 같은 파일의 이름 일 수 있습니다. 그러나 속성을 ""로 설정하여 속성을 비워두면 사용자가 제공 한 데이터가 현재보고있는 페이지로 다시 전송됩니다. 브라우저의 URL이 페이지를 addjoke.php로 표시하면 사용자가 추가 버튼을 누를 때 데이터가 전송됩니다. 이 양식을 이전 예제에 묶어 데이터베이스의 농담 목록을 표시하겠습니다. layout.html.php를 열고 addjoke.php : 로 이동하는 "새 농담 추가"링크에 URL을 추가하십시오.

    layout.html.php가 열려있는 동안, 위와 같이 2 장에서 css 스타일 시트를 포함하십시오. 이제 레이아웃 안에 표시되는 모든 양식은 이전에 사용한 스타일이 있습니다. 이 양식이 제출되면 요청에는 텍스트 영역에 입력 된대로 농담의 텍스트가 포함 된 변수 (joketext)가 포함됩니다. 이 변수는 php에서 생성 된 $ _post 배열에 나타납니다. 공개 디렉토리에서 addjoke.php를 만들어 봅시다. 이 컨트롤러의 기본 논리는 다음과 같습니다

    joketext post 변수가 설정되지 않으면 양식을 표시합니다.

    그렇지 않으면, 제공된 농담을 데이터베이스에 삽입하십시오

    이 골격 addjoke.php : 를 만듭니다
    CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
    GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
    
    이 오프닝 if 문은 $ _post 배열에 joketext라는 변수가 포함되어 있는지 확인합니다. 설정되면 양식이 제출되었습니다. 그렇지 않으면 addjoke.html.php의 양식이 브라우저에 표시하기 위해 $ 출력 변수에로드됩니다. 이 시점에서 브라우저에서 addjoke.php를 열면 양식이 표시되지만 농담을 입력하고 ADD를 누르면 아직 포함 된 데이터로 아무것도 수행하지 않았기 때문입니다. $ _post [ 'joketext']. 제출 된 농담을 데이터베이스에 삽입하려면 $ _post [ 'joketext']에 저장된 값을 사용하여 삽입 쿼리를 실행하여 농담 테이블의 joketext 열을 채워야합니다. 이렇게하면 다음과 같은 코드를 작성하게 될 수 있습니다.

    그러나이 코드에는 심각한 문제가 있습니다. $ _post [ 'joketext']의 내용은 전적으로 양식을 제출 한 사용자의 제어하에 있습니다. 악의적 인 사용자가 불쾌한 SQL 코드를 양식에 입력 한 경우이 스크립트는 의심의 여지없이 MySQL 서버에 공급됩니다. 이러한 유형의 공격을 SQL 주입 공격이라고하며, PHP 초기에는 해커가 PHP 기반 웹 사이트에서 발견하고 악용 한 가장 일반적인 보안 구멍 중 하나였습니다. (많은 프로그래밍 틈새 시장에서 개발자가 기대하지 않기 때문에 SQL 주입 공격은 여전히 ​​놀랍게도 효과적입니다. 트래픽 카메라가 데이터베이스를 삭제하는이 놀라운 시도를 고려하십시오. 🎜> 사용자는 이것을 텍스트 상자에 입력 할 수 있습니다 :

    데이터베이스로 전송 된 쿼리는 다음과 같습니다.

    그러나 사용자가 다음에 유형이면 어떨까요?

    이 경우 데이터베이스로 전송 된 쿼리는 다음과 같습니다.

    CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
    GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
    
    농담에는 인용 문자가 포함되어 있기 때문에 MySQL은 "get"이전에 인용문을 문자열의 끝으로 볼 수 있으므로 오류를 반환합니다. 이것을 유효한 쿼리로 만들려면 텍스트의 모든 따옴표를 탈출하여 데이터베이스에 전송 된 쿼리가 다음과 같이됩니다.

    견적이 포함되어 있으면 삽입되지 않은 데이터는 사용자에게 성가신 문제입니다. 그들은 입력 한 것을 잃을 것입니다. 그러나 악의적 인 사용자는 이것을 남용 할 수 있습니다. 이전 버전의 PHP에서는 Semicolon (;)으로 분리하여 PHP에서 여러 쿼리를 실행할 수있었습니다. 사용자가 이것을 상자에 입력해야한다고 상상해보십시오 :

    이것은 다음 쿼리를 데이터베이스로 보냅니다

    - MySQL의 단일 줄 주석이므로 마지막 줄은 무시되고 삽입 쿼리가 실행되고 사용자가 상자에 입력 한 삭제 쿼리가 실행됩니다. 실제로, 사용자는 상자에 좋아하는 모든 쿼리를 입력 할 수 있으며 데이터베이스에서 실행됩니다!

    . 마술 따옴표 PHP 초기에 SQL 주사 공격은 PHP의 팀이 언어에 대한 SQL 주입에 대한 일부 내장 보호를 추가 할 정도로 두려워서 두려워서 두려워했습니다. 첫째, 그들은 한 번에 여러 쿼리를 보낼 수있는 기능을 비활성화했습니다. 둘째, 그들은 Magic Quotes라는 것을 추가했습니다. PHP 의이 보호 기능은 브라우저에서 제출 한 모든 값을 자동으로 분석하고 Apostrophes와 같은 "위험한"문자 앞에서 Backslashes ()를 삽입했습니다. Magic Quotes 기능의 문제는 예방 된만큼 많은 문제를 일으킨다는 것입니다. 우선, 감지 한 문자와 소독에 사용 된 방법 (백 슬래시로 접두사)은 일부 상황에서만 유효했습니다. 사이트의 문자 인코딩 및 사용중인 데이터베이스 서버에 따라 이러한 측정은 완전히 효과가 없을 수 있습니다. 둘째, 제출 된 값이 SQL 쿼리를 만드는 것보다 어떤 목적으로 제출 된 값을 사용했을 때, 이러한 백 슬래시는 실제로 귀찮을 수 있습니다. Magic Quotes 기능은 아포스트로피가 포함되어 있으면 스퓨리어스 백 슬래시를 사용자의성에 삽입합니다. 간단히 말해서, Magic Quotes 기능은 나쁜 생각이었습니다. 너무 많은 버전 5.4에서 PHP에서 제거되었습니다. 그러나 PHP의 나이와 코드의 양으로 인해 일부 참조가 발생할 수 있으므로 Magic Quotes 기능이 무엇을 해야하는지에 대한 기본적인 이해가 가치가 있습니다.
    new PDO('mysql:host=hostname;dbname=database', 'username',
      'password')
    
    . 일단 마술 따옴표가 나쁜 아이디어로 식별되면, PHP 개발자의 조언은 그것을 끄는 것이 었습니다. 그러나 이것은 일부 웹 서버가 꺼져 있고 다른 웹 서버가 켜져 있음을 의미했습니다. 이것은 개발자에게 두통이었습니다. 코드를 사용하여 일부 공유 서버에서는 불가능했던 모든 코드를 사용하거나 추가 코드를 작성하도록 지시해야했습니다. 대부분의 개발자는 후자를 선택했으며 다음과 같은 코드를 발견 할 수 있습니다.

    작업 할 레거시 코드에서 이와 같은 IF 문이 표시되면 IF 문 내부의 코드가 최근 PHP 버전에서 실행되지 않으므로 전체 블록을 안전하게 삭제할 수 있습니다. 이와 같은 코드가 보이면 원래 개발자가 마법 인용문 문제를 이해하고이를 예방하기 위해 최선을 다하고 있음을 의미합니다. PHP 5.4 기준으로 (더 이상 지원되지 않기 때문에 결코 만나서는 안됩니다), get_magic_quotes_gpc ()는 항상 False를 반환하고 코드는 결코 실행되지 않습니다.

    마법 인용문에 대해 정말로 알아야 할 것은 문제에 대한 나쁜 해결책이라는 것입니다. 물론 마법 인용문이 없으면 문제에 대한 다른 해결책을 찾아야합니다. 운 좋게도 PDO 클래스는“준비된 진술”이라는 것을 사용하여 모든 노력을 기울일 수 있습니다. 준비된 진술 준비된 명령문은 미리 데이터베이스 서버로 전송 한 특별한 종류의 SQL 쿼리로 서버가 실행을 준비 할 수있는 기회를 제공하지만 실제로 실행되지는 않습니다. .php 스크립트를 쓰는 것처럼 생각하십시오. 코드가 있지만 웹 브라우저의 페이지를 방문 할 때까지 실제로 실행되지 않습니다. 준비된 문의 SQL 코드에는 쿼리

    가 실행될 때 나중에 값을 제공 할 자리 표시자가 포함될 수 있습니다. 이러한 자리 표시자를 채울 때 PDO는 "위험한"문자를 자동으로 보호 할만 큼 똑똑합니다. 다음은 삽입 쿼리를 준비한 다음 농담의 텍스트로 $ _post [ 'joketext']로 안전하게 실행하는 방법입니다.

    한 번에 한 가지 진술을 해치겠습니다. 먼저 SQL 쿼리를 PHP 문자열로 작성하여 평소와 같이 변수 ($ SQL)에 저장합니다. 그러나이 삽입 쿼리의 특이한 점은 Joketext 열에 값이 지정되지 않는다는 것입니다. 대신,이 값에 대한 자리 표시자가 포함되어 있습니다 (: joketext). 지금 농담 필드에 대해 걱정하지 마십시오. 우리는 잠시 후에 다시 돌아갈 것입니다.
    CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
    GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
    
    다음으로, 우리는 PDO 객체 ($ pdo)의 준비 방법을 호출하여 SQL 쿼리를 인수로 전달합니다. 이렇게하면 쿼리를 MySQL 서버로 보냅니다. Joketext 열에 대한 가치가 없으므로 MySQL은 아직 실행할 수 없습니다. 준비 메소드는 pdostatement 객체 (예, 선택 쿼리의 결과를 제공하는 것과 동일한 종류의 객체)를 반환합니다. 이제 MySQL이 실행을 위해 우리의 진술을 준비 했으므로, 우리는 pdostatement 객체 ($ stmt)의 bindValue 메소드를 호출하여 결 측값을 보낼 수 있습니다. 우리는이 방법을 제공 할 각 값 (이 경우 하나의 값 - 농담 텍스트 만 제공하면)을 한 번 호출하고, 우리가 채우고 자하는 자리 표시 자 ( ': joketext') 및 값을 인수하는 인수로 전달합니다. ($ _post [ 'joketext'])로 채우고 싶습니다. MySQL은 구문 분석 해야하는 SQL 코드가 아닌 개별 값을 보내고 있다는 것을 알고 있기 때문에 SQL 코드로 해석되는 값의 문자의 위험은 없습니다. 준비된 명령문을 사용하면 SQL 주입 취약점이 불가능합니다!

    마지막으로, 우리는 pdostatement 객체의 Execute 메소드를 호출하여 MySQL에 제공 한 값으로 쿼리를 실행하도록 지시합니다. (예,이 pdostatement 방법은 Exec. 이 코드에 대해 알 수있는 흥미로운 점 중 하나는 농담 텍스트 주위에 인용문을 두지 않았다는 것입니다. : joketext는 인용문없이 쿼리 내부에 존재하며 BindValue를 불렀을 때 $ _post 배열에서 일반 농담 텍스트를 전달했습니다. 준비된 문을 사용할 때는 데이터베이스 (MySQL)가 텍스트가 문자열임을 알기에 충분히 똑똑하고 쿼리가 실행될 때 처리 될 정도로 똑똑하기 때문에 따옴표가 필요하지 않습니다.

    . 이 ​​코드의 남아있는 질문은 오늘의 날짜를 농담 필드에 할당하는 방법입니다. 우리는

    가 MySQL이 요구하는 YYYY-MM-DD 형식으로 오늘 날짜를 생성하기 위해 멋진 PHP 코드를 작성할 수 있지만 MySQL 자체 가이 작업을 수행하는 기능이 있음이 밝혀졌습니다.

    MySQL 커다링 함수는 현재 날짜를 농담 열의 값으로 할당하는 데 사용됩니다. MySQL은 실제로 이러한 기능 중 수십 가지 기능을 가지고 있지만 필요에 따라 소개하겠습니다.

    . 이제 쿼리가 있었으므로 앞서 시작한 if 문을 완료 할 수 있습니다.

    하지만 기다려! 이 If 문에는 슬리브를 한 번 더 트릭합니다. 데이터베이스에 새로운 농담을 추가 한 후에는 이전과 같이 PHP 템플릿을 표시하는 대신 사용자의 브라우저를 농담 목록으로 다시 리디렉션하려고합니다. 그렇게하면 사용자는 새로 추가 된 농담을 볼 수 있습니다. 위의 IF 문의 끝에있는 두 줄이 그 일입니다. 원하는 결과를 얻으려면 첫 번째 본능은 컨트롤러가 새로운 농담을 추가하고 jokes.html.php 템플릿을 사용하여 목록을 평소와 같이 표시 한 후 데이터베이스에서 농담 목록을 단순히 가져올 수 있도록하는 것일 수 있습니다. 이를 수행하는 문제는 브라우저의 관점에서 농담 목록이“농담 추가”양식을 제출 한 결과라는 것입니다. 사용자가 페이지를 새로 고치려면 브라우저가 해당 양식을 다시 제출하여 새로운 농담의 다른 사본을 데이터베이스에 추가하게합니다! 이것은 거의 원하는 행동이 아닙니다.

    대신, 브라우저가 업데이트 된 농담 목록을 양식을 다시 제출하지 않고 다시로드 할 수있는 일반적인 웹 페이지로 취급하기를 원합니다. 이를 수행하는 방법은 HTTP 리디렉션으로 브라우저의 양식 제출에 답하는 것입니다. 브라우저가 다른 페이지로 이동하도록 지시하는 특별한 응답입니다. (HTTP는 하이퍼 텍스트 전송 프로토콜을 나타내며 방문자의 웹 브라우저와 웹 서버간에 교환되는 요청/응답 통신을 설명하는 언어입니다.) PHP 헤더 기능은 브라우저에 전송 된 응답에 특정 헤더를 삽입 할 수 있도록하여 이와 같은 특수 서버 응답을 전송하는 수단을 제공합니다. 리디렉션에 신호를 보내려면 브라우저를 지시하려는 페이지의 URL과 함께 위치 헤더를 보내야합니다.

    이 경우 브라우저를 jokes.php로 보내려고합니다. 다음은 데이터베이스에 새 농담을 추가 한 후 브라우저를 컨트롤러로 다시 리디렉션하는 두 줄입니다.

    아래는 addjoke.php 컨트롤러의 전체 코드입니다 예 : MySQL-Addjoke

    모든 것이 합리적으로 확인하기 위해 이것을 검토 할 때, 새 PDO 객체를 생성하여 데이터베이스에 연결하는 코드는 데이터베이스 쿼리를 실행하는 코드 앞에 있어야합니다. 그러나 "농담 추가"양식을 표시하기 위해 데이터베이스 연결이 필요하지 않습니다. 연결은 양식이 제출 된 경우에만 이루어집니다.

    브라우저를 통해 이것을로드하고 데이터베이스에 새로운 농담을 추가하십시오.

    . 거기에 있습니다 : 기존 농담을보고 새로운 농담을 추가 할 수 있습니다 - MySQL 데이터베이스. 데이터베이스에서 데이터 삭제 이 섹션에서는 농담 데이터베이스 사이트를 최종적으로 향상시킬 것입니다. 농담 페이지 (jokes.php)의 각 농담 옆에 Delete라는 버튼이 표시됩니다. 클릭하면 데이터베이스에서 농담을 제거하고 업데이트 된 농담 목록을 표시합니다.
    도전이 마음에 들면 내 솔루션을보기 전에이 기능을 직접 작성하는 데 찔려 갈 수 있습니다. 우리는 새로운 기능을 구현하고 있지만 주로이 장의 이전 예제에 사용 된 것과 동일한 도구를 사용합니다. 다음은 몇 가지 힌트가 있습니다를 검색 할 수 있습니다. 우리의 다음 단계는 jokes.html.php 템플릿을 업데이트 하여이 새로운 배열 구조에서 각 농담의 텍스트를 검색하고 각 농담에 대한 삭제 버튼을 제공하는 것입니다.

    이 업데이트 된 코드의 주요 내용은 다음과 같습니다

      각 농담은 형식으로 표시되며, 제출하면 해당 농담을 삭제합니다. 우리는 이것을 양식의 동작 속성을 사용하여 새로운 컨트롤러 인 DeleteJoke.php에게 신호를 보냅니다. $ 농담 배열의 각 농담은 이제 간단한 문자열 대신 2 개 항목 배열로 표시 되므로이 줄을 업데이트하여 농담의 텍스트를 검색해야합니다. 우리는 단지 $ 농담 대신 $ joke [ 'text']를 사용하여이를 수행합니다 이 농담을 삭제하기 위해 양식을 제출할 때 농담의 ID를 따라 삭제할 수 있습니다. 이를 위해서는 농담의 ID가 포함 된 양식 필드가 필요하지만이 필드를 사용자로부터 숨기고 싶어합니다. 그렇기 때문에 숨겨진 양식 필드 (입력 유형 = "숨겨진")를 사용합니다. 이 필드의 이름은 ID이고 그 값은 삭제 될 농담의 ID입니다 ($ joke [ 'id']). 농담의 텍스트와 달리 ID는 사용자가 제출 한 값이 아니므로 없습니다. htmlspecialchars를 사용하여 HTML-SAFE를 만드는 것에 대해 걱정해야합니다. 농담이 데이터베이스에 추가 될 때 ID 열을 위해 MySQL에 의해 자동으로 생성되기 때문에 숫자가 될 것이라고 확신 할 수 있습니다.
    • . 제출 버튼 (입력 유형 = "제출")은 클릭하면 양식을 제출합니다. 값 속성은 삭제 라벨을 제공합니다 마지막으로, 우리는이 농담의 양식을 닫습니다
    • 참고 : HTML을 알고 있다면, 아마도 인용 된 텍스트 (농담)의 일부가 아니기 때문에 형식과 입력 태그가 블록 쿼트 요소 외부에 속한다고 생각할 것입니다.
    • 엄격하게 말하면, 그것은 사실입니다. 형식과 입력은 실제로 블록 퀘스트 전후에 있어야합니다. 불행히도, 태그 구조 표시를 만들기 위해이 책의 범위를 벗어난 작은 CSS (계단식 스타일 시트) 코드가 필요합니다.
    • PHP와 MySQL에 관한 책에서 CSS 레이아웃 기술을 가르치기보다는이 불완전한 마크 업으로 가기로 결정했습니다. 현실 세계 에서이 코드를 사용하려는 경우 CSS를 배우는 데 시간을 투자해야합니다 (또는 적어도 CSS 전문가의 서비스를 확보). 그렇게하면 CSS를 멋지게 보이게하는 데 걱정하지 않고 HTML 마크 업을 완전히 제어 할 수 있습니다. CSS 레이아웃에 대해 자세히 알아 보려면 Tiffany Brown의 CSS 마스터, 3 판
    • 를 살펴보십시오. jokes.css에 다음 CSS를 추가하여 버튼을 농담의 오른쪽에 표시하고 그들 사이에 선을 그립니다.
    • 다음 이미지는 삭제 버튼이 추가되어 농담 목록이 어떻게 보이는지 보여줍니다.
    하지만 기다려! 삭제 버튼을 작동시키기 전에 간단히 물러서서이 줄을주의 깊게 살펴 보겠습니다.

    여기, 우리는 PDOSTATEMENT 객체를 반복하고 있습니다.이 값은 해당 값과 함께 키 ID 및 Joketext를 포함하는 $ 행 변수를 제공하며 동일한 키와 값으로 다른 배열을 구축하는 데 사용합니다. 당신은 이미 이것이 몹시 비효율적이라는 것을 깨달았을 것입니다. 우리는이 코드를 사용하여 같은 것을 달성 할 수 있습니다

    그러나 우리가 알고 있듯이, 이것은 Foreach 루프로도 달성 할 수 있습니다 : .

    이 경우, 우리는 데이터베이스의 레코드를 반복하고 배열을 구축하기 위해 Foreach를 사용하고 있습니다. 그런 다음 템플릿의 다른 foreach 루프로 배열을 반복합니다. 우리는 이것을 쓸 수 있습니다 :
    CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
    GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
    

    이제 템플릿에서 $ 농담이 반복되면 배열이 아니라 pdostatement 객체입니다. 그러나 이는 출력에 영향을 미치지 않으며 일부 코드를 저장합니다. 실제로, 우리는 $ 결과 변수를 완전히 생략하고 pdostatem 객체를 $ 농담 변수에 직접로드 할 수 있습니다. 완전한 jokes.php 컨트롤러는 이제 다음과 같습니다

    이제 우리는 컨트롤러의 레코드를 반복하는 타운 루프조차 없지만 템플릿의 레코드를 직접 반복하여 코드를 저장하고 페이지가 약간 더 빨리 실행되도록합니다. 한 번 레코드.
    new PDO('mysql:host=hostname;dbname=database', 'username',
      'password')
    
    새로운 삭제 버튼으로 돌아 가기 :이 새로운 기능을 작동시키는 것은 관련 DeleteJoke.php를 추가하여 삭제 쿼리를 데이터베이스에 발행하는 것입니다 : .

    업데이트 된 jokes.php 및 deletejoke.php의 전체 코드는 예로 사용할 수 있습니다 : mysql-deletejoke. 이 코드 덩어리는이 장의 앞부분의 "농담 추가"코드를 처리하기 위해 추가 한 코드와 똑같이 작동합니다. 우리는 삭제하려는 농담 ID를 위해 자리 표시 자로 삭제 쿼리를 준비하는 것으로 시작합니다.

    $pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser',
      'mypassword');
    
    팁 :이 인스턴스에서는 SQL 주입 공격으로부터 데이터베이스를 보호하기 위해 준비된 진술이 불필요하다고 생각할 수 있습니다. 실제로 모든 형태의 필드 (숨겨진 분야조차도)는 궁극적으로 사용자의 통제하에 있습니다. 예를 들어, 널리 분산 된 브라우저 애드온이 있으며, 이는 숨겨진 양식 필드를 가시적이며 사용자가 편집 할 수있게합니다. 기억하십시오 : 브라우저에서 제출 한 모든 가치는 사이트의 보안을 보호 할 때 궁극적으로 의심됩니다. 그런 다음 제출 된 $ _post [ 'id']의 제출 된 값을 해당 자리 표시 자에게 바인딩하고 쿼리를 실행합니다. 해당 쿼리가 달성되면 PHP 헤더 기능을 사용하여 브라우저에 새 요청을 보내서 업데이트 된 농담 목록을 볼 수 있습니다.

    참고 :이 예제를 직접 해결하면 첫 번째 본능은 각 농담에 대한 삭제 버튼을 포함하는 전체 HTML 양식을 작성하는 데 어려움을 겪지 않고 각 농담에 대해 삭제 하이퍼 링크를 제공하는 것이었을 것입니다. 페이지. 실제로, 그러한 링크의 코드는 훨씬 간단 할 것입니다 :

    try {
      ⋮ do something risky
    }
    catch (ExceptionType $e) {
      ⋮ handle the exception
    }
    
    CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
    GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
    
    간단히 말해서, 하이퍼 링크는 행동을 수행하는 데 사용되어서는 안됩니다 (예 : 농담 삭제). 일부 관련 컨텐츠에 대한 링크를 제공하는 데만 사용해야합니다. 메소드 = "get"이있는 양식에 대해서도 마찬가지입니다.이 데이터는 기존 데이터의 쿼리를 수행하는 데만 사용해야합니다. 행동은 제출중인 메소드 = "post"가있는 양식의 결과로만 수행되어야합니다.

    이것의 이유는 메소드 = "post"가있는 형태가 브라우저와 관련 소프트웨어에 의해 다르게 취급되기 때문입니다. Method = "Post"가있는 양식을 제출 한 다음 브라우저에서 새로 고침 버튼을 클릭하면 브라우저에서 양식을 다시 제출 해야하는지 확인합니다. 브라우저는 메서드 = "get"으로 링크 및 형태와 관련하여 재 포장에 대한 유사한 보호 기능이 없습니다. 검색 엔진 및 기타 웹 크롤러도 사이트의 모든 링크를 따라 사이트 페이지의 페이지를 검색 결과에 표시 할 때 해결합니다. 하이퍼 링크를 따른 결과로 사이트가 농담을 삭제 한 경우 검색 엔진이 사이트를 찾을 때마다 농담이 삭제되는 것을 발견 할 수 있습니다. 미션이 성취 된

    이 장에서는 객체를 작성한 다음 호출하여 MySQL 데이터베이스 서버와 인터페이스 할 수있는 내장 PHP 클래스 (PDO, PDOException 및 PDOSTATEMENT) 모음 인 PHP 데이터 객체 (PDO)에 대한 모든 것을 배웠습니다. 그들이 제공하는 방법. 당신이 그것에있는 동안, 당신은 또한 객체 지향 프로그래밍 (OOP)의 기본 사항을 집어 들었습니다. 이것은 PHP 초보자에게는 위업이 아닙니다!

    . PDO 객체를 사용하여 IJDB 데이터베이스를 온라인으로 게시하고 방문자가 농담을 추가하고 삭제할 수 있도록 첫 번째 데이터베이스 구동 웹 사이트를 구축했습니다. 어떤 방식으로,이 장 에서이 책의 ​​명시된 사명을 달성했다고 말할 수 있습니다. 데이터베이스 중심 웹 사이트를 구축하는 방법을 가르쳐주기 위해. 물론이 장의 예에는 필수 필수 요소 만 포함되어 있습니다. 이 책의 나머지 부분에서는이 장에서 구축하는 법을 살펴 보는 방법을 보여 드리겠습니다. 5 장에서는 MySQL Workbench의 SQL 쿼리 창으로 돌아갑니다. 우리는 관계형 데이터베이스 원칙과 고급 SQL 쿼리를 사용하여보다 복잡한 정보 유형을 나타내고 방문자가 추가 한 농담에 대한 신용을 제공하는 방법을 배우게됩니다! 우리는 당신이 php & mysql : vovice to Ninja, 7th Edition 에서이 발췌를 즐겼기를 바랍니다. 전체 책은 Sitepoint Premium과 좋아하는 책 및 전자 책 소매 업체에서 구입할 수 있습니다. web에서 mysql에서 데이터를 표시하는 것에 대한 FAQ 웹 브라우저를 사용하여 MySQL 데이터베이스에 연결하려면 웹 브라우저를 사용하여 MySQL 데이터베이스에 연결하려면 phpmyadmin과 같은 웹 기반 인터페이스가 필요합니다. PHPMYADMIN은 PHP로 작성된 무료 소프트웨어 도구로 웹을 통해 MySQL 관리를 처리하기위한 것입니다. 이를 사용하려면 서버에 설치 한 다음 서버의 IP 주소를 입력 한 다음 "/phpmyadmin"을 입력하여 웹 브라우저를 통해 액세스해야합니다. MySQL 자격 증명을 입력하라는 메시지가 표시되며 인증 된 후에는 브라우저에서 데이터베이스를 직접 관리 할 수 ​​있습니다.

    MySQL 쉘이란 무엇이며 어떻게 사용할 수 있습니까?

    MySQL Shell은 MySQL의 고급 클라이언트 및 코드 편집기입니다. JavaScript 및 Python 용 스크립팅 기능을 제공하며 MySQL 작업을위한 API를 포함합니다. 이를 사용하여 다양한 관리 작업뿐만 아니라 데이터 쿼리 및 업데이트를 수행 할 수 있습니다. MySQL 쉘을 로컬 컴퓨터에 설치할 수 있으며 적절한 자격 증명을 사용하여 MySQL 서버에 연결할 수 있습니다.

    내 웹 사이트에서 mySQL 데이터를 사용할 수 있습니까?

    예, 사용할 수 있습니다. 웹 사이트의 MySQL 데이터. 이것은 일반적으로 PHP와 같은 서버 측 스크립팅 언어를 통해 수행됩니다. PHP 스크립트는 MySQL 데이터베이스에 연결하고 쿼리를 수행하여 데이터를 검색 한 다음 해당 데이터를 웹 사이트에 표시합니다. 이것은 블로그 나 뉴스 사이트와 같이 변화하는 콘텐츠를 표시 해야하는 동적 웹 사이트의 일반적인 접근법입니다.

    MySQL 데이터베이스를 어떻게 보호 할 수 있습니까?

    MySQL 데이터베이스 보안에는 여러 단계가 포함됩니다. . 먼저 방화벽 및 기타 적절한 보안 조치를 통해 MySQL 서버가 안전한 환경에서 실행되고 있는지 확인하십시오. 둘째, MySQL 계정에 강력하고 고유 한 암호를 사용하십시오. 셋째, MySQL 계정의 권한을 제한하여 작업을 수행하는 데 필요한 권한 만 있도록하십시오. 마지막으로, 알려진 취약점으로부터 보호하기 위해 MySQL 서버를 정기적으로 업데이트하고 패치하십시오.

    MySQL 데이터베이스를 백업 할 수 있습니까?

    MySQL 데이터베이스 백업을 사용하여 mysqldump 명령 줄 유틸리티를 사용하여 수행 할 수 있습니다. . 이 도구는 데이터베이스를 처음부터 다시 만들 수있는 명령으로 SQL 파일을 만듭니다. 백업 할 데이터베이스 이름과 작성하려는 파일 이름을 지정하여 서버의 명령 줄 에서이 도구를 실행할 수 있습니다.

    MySQL 데이터베이스를 최적화하려면 어떻게해야합니까?

    MySQL 데이터베이스 최적화에는 여러 단계가 포함될 수 있습니다. 먼저 최적화 테이블 명령을 사용하여 테이블 데이터의 물리적 저장을 재구성하고 디스크 공간을 줄일 수 있습니다. 둘째, MySQL Query Optimizer를 사용하여 쿼리의 효율성을 향상시킬 수 있습니다. 셋째, 인덱싱을 사용하여 데이터 검색 속도를 높일 수 있습니다.

    mySQL 데이터베이스로 데이터를 가져올 수 있습니까?

    로드 데이터 infile 명령을 사용하여 MySQL 데이터베이스로 데이터를 가져올 수 있습니다. 이 명령은 텍스트 파일의 행을 매우 빠른 속도로 테이블로 읽습니다. 파일 이름은 문자 그대로 문자열로 제공되어야합니다.

    mySQL 데이터베이스에서 데이터를 내보내는 방법은 무엇입니까?

    SELECT… in Outfile 명령을 사용하여 MySQL 데이터베이스에서 데이터를 내보낼 수 있습니다. 이 명령은 Select 문의 결과를 서버 호스트의 파일에 씁니다.

    mySQL 데이터베이스에서 데이터를 업데이트하려면 어떻게해야합니까?

    업데이트를 사용하여 MySQL 데이터베이스에서 데이터를 업데이트 할 수 있습니다. 명령. 이 명령은 테이블에서 기존 행을 수정합니다. 당신은 업데이트 할 행을 선택하기위한 테이블 이름, 업데이트 될 열 및 새 값을 지정합니다.

    mySQL 데이터베이스에서 데이터를 어떻게 삭제할 수 있습니까?

    delete 명령을 사용하여 MySQL 데이터베이스에서 데이터를 삭제할 수 있습니다. 이 명령은 테이블에서 기존 행을 제거합니다. 삭제할 행을 선택할 테이블 이름과 Where 절을 지정합니다. 삭제 된 데이터를 복구 할 수 없으므로이 명령에주의하십시오.

    위 내용은 웹에서 MySQL에서 데이터 표시 : 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명:
    본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.