PHP36.0 Working with Databases from PHP

이제는 관계형 데이터베이스가 무엇인지에 대해 이야기하면서 시간을 보냈습니다 근본적으로 어떻게 작동하는지, 그리고 관계형 데이터베이스 관리를 설정하는 방법에 대해 이야기했습니다

시스템에 대해 알아 보도록하겠습니다 실제로 우리가 실제로 PHP 코드에서 이러한 데이터베이스로 작업하십시오 이 일을 할 수 있기 위해서는 우선 나는 아마도 내가해야 할 일이 될 것이다 나는 데이터베이스를 설정해야 할 것이다 실제로 MySQL Workbench를 시작한 상태에서 실제로 연습 할 시간을 가질 수 있습니다

여기에 신청하십시오 계속해서 실행중인 서버에 연결하겠습니다 여기에 localhost 일단 내가 실제로 그걸 열어 보면, 다 – PHP 데이터베이스 나는 이전에 만들었고 탭이있는 쿼리 탭으로 이동해야합니다 나는이 데이터베이스를 만들고 작업하기 위해 SQL 코드를 입력 할 수있다

만약 Workbench 도구를 열면 약간의 쿼리 창이 생기지 않습니다 여기, 작은 SQL * Plus 단추를 클릭하면 새 탭이 열립니다 여기서 입력 할 코드를 입력 할 수 있습니다 내가하고 싶은 일 PHP 데이터베이스로 작업하고 싶습니다 여기에 제 데이터베이스가 있습니다 굵게

너의 글자가 굵은 글씨가 아니라면 더블 클릭을한다 선택해야합니다 이 데이터베이스를 사용하면 여기서 작성한 모든 SQL 코드가 영향을 받게된다는 것을 이해하게 될 것입니다 그 특정 데이터베이스와 제가 무엇을하고 싶은지는 제가 테이블을 만들고 싶습니다 내 PHP 데이터베이스 내부에 우리가 함께 작업 할 수 있습니다

나는이 예제를 생각하고있다 어쩌면 상자 테이블, 테이블에 대한 정보를 저장할 수있는 테이블을 만들 것입니다 상자, 우리가 이전에했던 것처럼 그래서 내가 할 일은 내가 갈거야 테이블 상자를 만듭니다

나는 그 다음에 괄호 세트와 끝에 세미콜론 SQL 문 끝의 세미콜론은 당신은 많은 경우에 그것없이 도망 갈 수있을 것입니다 여기에 실제로 갈 때 내 박스 테이블 만들기이 특정 테이블에 어떤 필드가 있는지 알려 줄 필요가 있습니다 나는 밖으로 나가야 할 것입니다 그래서 저는 제가 필드를 원한다고 말함으로써 시작하겠습니다

호출 된 ID 및 해당 필드의 형식을 정수로 원합니다 그 특별한 분야 나 또한 그것을 null이되도록 허용하지 않으려면 Not null을 입력 할 것이고 데이터베이스를 원한다 해당 필드에 저장된 ID를 자동 증가 시켜서 내가 처리 할 수 ​​있도록 처리합니다 자동 증가를 넣는다 우리가 있습니다

내가 그것을 가지고 있으면 나는 앞으로 나아갈 것이다 해당 필드 정의를 쉼표로 구분하여 필드 정의와 다음 필드를 구분하십시오 나는 다음 일을 내가 생각할 것이다 내 상자에 대해 말하자면 너비를 정의하고 싶습니다 너비는 정수가 될 수도 있고 null 일 수 없습니다

나는 갈거야 null이 될 수없는 정수인 height라는 필드를 만든다 그리고 마침내 나는 color라는 필드를 만들 수 있습니다 색깔을 위해 나는 그것의 타입을 만들 것입니다 varchar – 가변 수의 문자; 나는 거기에서 50 문자까지 허용 할거야

아마도 null이 될 수 있도록 허용 할 것입니다 그래서 그것들은 내 상자 테이블의 일부가 될거야 내 탁자에 보관하는 모든 상자에는 너비, 높이, 색상 및 ID 등이 있습니다 그것들의 기본적인 정의에 덧붙여 fields 또한이 테이블의 기본 키를 원한다는 것을 데이터베이스에 알리려고합니다 신분증 이군

그러면 두 개의 상자가 동일한 ID로 끝나지 않게됩니다 그것은 항상 모든 상자에 고유 한 ID가 있는지 확인하십시오 일단 완료되면, 일단 코드를 작성하면 입력 한 다음 번개 기호를 클릭하거나 Ctrl + Enter를 누를 수 있습니다 또는 Command + Enter를 누르십시오 그렇게하면 필드가 아래쪽으로 아래로 튀어 나와 진술이 성공 여부

저의 스크린 가장자리에서 약간 벗어났습니다 그걸 끌어 올려 거기는 처음으로 내가 쳤을 때 테이블이 만들어진 여기서 녹색 체크 표시는 성공적으로 실행되었음을 의미합니다

0 행이 있다고 알려줍니다 영향을 받았지만이 문은 실제로 행을 넣을 의도가 아니기 때문에 괜찮습니다 탁자 나는 실수로 두 번째 시간을 실행했고 그 시간은 빨간색 X는 그 진술이 작동하지 않는다는 것을 알려줍니다 두 번째 문제 상자 표가 이미 실행 한 이전 명령문에 존재했기 때문입니다

그래서 나는 지금 박스 테이블을 가지고있다 사실, 내가 다가 오면 사이드 바를 마우스 오른쪽 버튼으로 클릭하고 내 Refresh all, PHP 데이터베이스의 테이블 섹션 아래 나는 지금 그것을 확장 할 수 있고 거기에 나의 실제 상자 테이블을 볼 수있다 어떤 열을 볼 수있게되어 실제로 그 테이블 안에 어떤 필드가 있는지 확인할 수 있습니다 그래서 우리는 실제로 우리가 실제로 연습 할 수있는 테이블을 가지고 있습니다 그것으로 연습하게하려면 테이블을 조금 더 재미있게, 우리가 나아가서 어떤 데이터로 작업한다면 어떨까요? 그 안에? 먼저 테이블에 약간의 데이터를 넣어 보겠습니다

나는 타이핑 할거야 상자에 삽입하면 내가 할 일은 괄호 안의 집합입니다 어떤 필드에 내가 채우기를 원하는지를 말하면, 단어 값을 넣을 것입니다 또 다른 괄호 세트는 내가 들어가기를 원하는 실제 값을 넣을 것이다 전지

그래서 저는 예를 들어 제가 값을 폭, 높이, 및 색상 필드를 입력 한 다음 값 뒤에 괄호 안에 원하는 값을 표시 할 수 있습니다 그래서 나는 50과 500과 적색을 넣고 싶다고 말할 것입니다 빨간색으로 따옴표를 넣습니다 그것은 문자열이기 때문에; 다른 두 숫자는 정수이므로 그대로 두었습니다 그런 다음 그 문장을 실행하면 아래쪽에 녹색 체크 표시가 나타납니다

나 한 행이 영향을 받았다 그래서 그냥 테이블에 일부 데이터를 삽입했다 나는 실제로 할 수 있었다 그런 다음 다시 돌아가서 수정할 수 있습니다 어쩌면 나는 100 x 100 파란 테이블을 만들 것이다 어, 파란색 상자에서 실행하십시오

그리고 하나 더 : 200 x 2000 노란 테이블을 보자 – 어, 노란색 상자 나는 상자 대신 표를 계속 말하고있다 나는 그것을 실행할 것이다 그래서 그 시점에서 그런 다음 실제로 테이블에 삽입 된 세 개의 다른 상자가 있습니다 만약 내가 실제로 한 번 살펴보고 그들이 실제로 거기에 있는지 확인하고 싶습니다

select라고 말할 수 있습니다 모든 상자에서 실행하면 워크 벤치 도구에서 다른 창을 볼 수 있습니다 그 테이블에있는 실제 데이터를 보여줍니다 그래서 저는 3 명이 있다는 것을 알 수 있습니다

본질적으로 세 줄을 기록한다 나는 모든 다른 데이터 조각들을 볼 수있다 삽입했는데 직접 할당 된 ID를 볼 수 있습니다 이제 우리는 물론 SQL로 작업하는 워크 벤치 도구에서 더 많은 시간을 보냅니다 물론 SQL은이 클래스에서 우리의 목적이 아닙니다

우리가하고 싶은 것은 시작이다 우리가 어떻게 PHP를 사용하여 이러한 기본적인 것들을 할 수 있는지 살펴 봅니다 그래서 저에게 넘어 가게 하죠 내 텍스트 편집기 여기 있습니다

그리고 내가 한 것은 이미 페이지를 시작한 것입니다 이 페이지에서 저는 이전 비디오에서 사용한 두 문장을 이미 넣었습니다 데이터베이스에 연결하기 위해 여기서 내가하고있는 일은 새로운 PDO 객체를 생성하는 것이다 이 새로운 PDO 객체는 내가 MySQL에 연결하고 있다고 들었습니다 데이터베이스가있는 호스트 localhost입니다

그래서 데이터베이스 서버가이 컴퓨터에 있습니다 나는 말하고있다 내가 PHP라는 데이터베이스에 연결하고 있는데 내 사용자 이름과 암호가 있습니다 이미 여기에 채워져있다 나는 또한 앞서 가서 setAttribute를 호출하고 데이터베이스에 말했다

연결로 인해 발생하는 오류가 예외로 표시되기를 원합니다 자, 정상적으로 나는 이것과 내가 try / catch 내부에서하고 있었던 것을 포장 할 것이지만, 여기에서는 조금 연습하고 다른 방법을 보여주고 싶습니다 이 데이터베이스 연결 작업에 사용할 수 있도록이 db 객체 내 예외를 제대로 잡으려고 너무 걱정하지 않을거야 예외가 발생하면 그렇다면 괜찮습니다 우리는 그 정보를 정보로 사용하여 웃기다

내가이 시점에서 내 브라우저로 건너 뛰고 새로 고침을 누르면, 순간에는 아무런 문제가 없습니다 아무 일도 일어나지 않습니다 내 브라우저에서 내 데이터베이스에 제대로 연결하고 있음을 알게되었습니다 이 데이터베이스 연결로 실제로 할 수있는 여러 가지 종류의 것들을 살펴보십시오 이제 우리는 실제로 그것을 가지고 있습니다

우리가 보길 원하는 첫 번째 것들 중 하나 연결된 데이터베이스를 사용하여 데이터를 검색 할 수 있습니다 대단히 방금 선택한 문을 실행했을 때 Workbench 도구와 매우 비슷합니다 내 데이터베이스에있는 데이터를 보여줄 것입니다 내 테이블에있는 데이터를 보여 주면 PHP에서 똑같은 일을 할 수 있기를 원한다 데이터베이스를 PHP 코드로 변환하여 실제로 사용할 수 있습니다

PDO 라이브러리는 우리는 여기에서 매우 유연하게 우리가 실제로 데이터를 PHP로 데이터베이스 당신이 그것에 대해 생각한다면, 그것이 끝났을 때 일종의 번역이 있습니다 그 자리를 차지해야합니다 데이터베이스는 데이터를 자체 방식으로 저장하지만 PHP에서는 변수와 배열, 데이터 유형 및 모든 종류의 것들을 가지고 있으므로 약간의 PDO 라이브러리가 실제로 어떻게 그 번역이 일어나는가에 관해 우리에게 알려주는 통제의 데이터베이스 객체에는 setFetchMode라는 메서드를 사용할 수 있습니다 이 setFetchMode 메소드는 기본적으로 메소드를 결정할 다양한 값을 전달할 수 있습니다

데이터베이스의 데이터는 PHP에서 다시 우리에게 제공 될 때 형식이 지정됩니다 코드 자체 실제로 PHP 웹 사이트를 살펴보고, PHP 웹 사이트를 방문하면 PHP 웹 사이트를 검색하여 PDO를 검색하고 Enter 키를 누르면 와서 많은 링크를 제공하여 문서의 다른 부분으로 안내 할 수 있습니다 이러한 PHP 데이터 객체 용 PDO 라이브러리 여기에서 우리는 대부분의 다른 호출 할 수있는 메서드 그래서 나는이 모든 것들을 확실히 커버하지 않을 것이다 동영상에 대한 추가 정보를 원한다면 갈 수 있습니다

에 대해 이야기하거나 내가 다루지 않는 것들에 대한 추가 정보를 얻을 수 있습니다 예를 들어, setFetchMode 메소드를 클릭하면 정확히 추가 정보를 볼 수 있습니다 그것이 어떻게 불리는 지, 당신이 할 수있는 다른 것들, 그 목적이 무엇인지 등등 PDO 라이브러리의 주요 링크 집합으로 돌아 오면 다음 작업을 수행 할 수 있습니다 미리 정의 된 값으로 이동하여 해당 메소드에 전달할 수있는 다른 값을 찾습니다

PDO 클래스의 상수와 그 상수 목록에는 여러 가지가 있습니다 fetch : PDO FETCH_LAZY, PDO FETCH_ASSOCIATIVE, PDO FETCH_NAMED로 시작하십시오 예 거기에는 꽤 다른 것들이 있습니다 그것들은 모두 다른 것들입니다

우리는 실제로 데이터베이스 연결을위한 setFetchMode 메소드로 전달할 수 있습니다 그런 다음 데이터가 반환 될 때 데이터의 형식이 실제로 결정됩니다 물론 하나 가장 자주 사용하는 경향이있는 가져 오기 모드는 fetchAssociative 및 기본적으로 데이터베이스 연결에서 새 데이터를 가져올 때마다 그 데이터는 결합 배열로서 우리에게 되돌려 보내 져야한다 그 연관 배열 데이터베이스 칼럼의 이름을 배열 키로 사용하고 실제 값을 그 특정 키의 값을위한 필드 그것에 대한 좋은 점 중 하나는 실제로는 디폴트이므로 setFetchMode 메소드를 실제로 호출 할 필요조차 없습니다

문서를 살펴보면 다른 가능성이 많이 있음을 알 수 있습니다 거기에 연관 배열로 가져 오는 것 외에 그럼 어떻게 실제로 우리가 가져 오기를 수행하여 데이터베이스 자체에서 데이터를 가져 옵니까? 음, 아주 좋아 데이터베이스 연결에서 데이터를 가져 오려면 워크 벤치 도구에서 수행했습니다 우리는 그것을하기 위해 질의를 작성해야 할 필요가 있습니다

쓰기 위해서 데이터를 가져 오기위한 질의, 데이터베이스 연결 객체 자체, PDO 객체는 특별한 메서드라는 쿼리 여기 쿼리 메서드를 사용하면 내가 할 수있는 일은 문자열로 전달할 수 있다는 것입니다 SQL select 문 그래서 내가 워크 벤치에서했던 것과 같이 select라고 말할 수 있습니다 예를 들어 모든 박스에서

실제로 해당 쿼리 메서드를 호출 할 때 그 쿼리 메서드 실행하면, 그 결과는 나에게 일련의 결과와 결과를 리턴 할 것입니다 반환 된 데이터는 여전히 유사 데이터베이스 형식이며 실제로 작동 할 수 있습니다 그 결과 값에서 추출해야하는 값들을 가지고 있습니다 나는 그걸로 할 수있어 결과 및 결과에서 fetch라는 메소드를 호출합니다

내가 전화 할 때마다 결과 집합에 메서드를 가져 오면 수행 할 작업이 하나의 행을 반환합니다 쿼리를 실행할 때 검색된 데이터 그래서 내가 가져올 호출하면 그것을 줄 것이다 나에게 하나의 행을 되 돌리면, 아니면 하나의 상자라고 생각할 수 있습니다 실제로 무엇이 결정될 것인가 – 어, 거기에 가져온 것의 형식은 무엇입니까? 실제로 setfetch 모드에 의해 결정됩니다 그 다음에 다시 올 것이다

연관 배열 (associative array)로서 데이터를 돌려 주라 그래서 상자에는 연관이 있어야합니다 배열을 사용할 수 있습니다 나가 나가고 시도하는 경우에 우리는 실제로 그것을 시도 할 수 있었다 이 시점에서 일부 출력 내가 에코를 말하면, ID :라고 말하자

그리고 나는 상자에서 말할 것이다 배열은 나에게 ID 필드의 값을주고, 그 후에는 너비를 추가 할 것이다 : 그리고 나서 내가 상자 배열에서 너비 키 값을 추가하고 그 이후로 나는 그곳에서 멈추지 않을 것이다 그냥 쉬라고 해두 죠 내가 다시 점프하면 브라우저를 열고이 페이지를 지금 다시 실행하면 이것이 실제로 끝나는 것입니다 돌아온다

ID 1 너비 50이라고 알려줍니다 실제로 그게 무슨 뜻인지는 그 두 가지 데이터입니다 내 데이터베이스 테이블에 넣은 첫 번째 상자 내가 높이를보고 싶으면 같은 방식으로 그렇게 할 수 있습니다 색상에 액세스하면 다시 똑같은 색상이됩니다

의회 단일 값에 대해 개별적으로 해당 값에 개별적으로 액세스하는 대신 상자, 예를 들어 모든 상자에 대한 데이터를 표시하려면 어떻게해야합니까? 글쎄, 우리는 잠재적으로 그렇게 할 수있는 것은 루프 내부에서 fetch 메소드를 여러 개 호출 할 수있는 것입니다 타임스 fetch 메소드를 여러 번 호출하려고한다면 알아야 할 것이다 본질적으로 얼마나 많은 다른 시간에 호출 할 것인가? 세트? 그것을 발견하기 위해서 우리는 호출 된 결과 집합에 대해 호출 할 수있는 메소드가 있습니다

실제로 얼마나 많은 행이 특정 결과의 일부인지 알려주는 rowCount 세트 예를 들어 echo가 있다고 할 수 있습니다 rowCount 메소드를 호출하면 그 후에 상자에 잠시 쉬라고 말하십시오 그리고 내가 브라우저에서 그것을 끌어 올리면 되돌아옵니다 정확한 3 개의 박스가 있다고 나에게 말한다

세 개의 상자는 얼마나 많은 상자입니까? 만들고 우리 테이블에 넣습니다 그래서 다른 것들을 함께 사용하면됩니다 그런 다음 우리가 원할 경우 데이터를 인쇄 할 수있는 루프를 작성할 수 있습니다 모든 다른 상자들 그 작은 코드를 주석으로 처리하겠습니다

난 그냥 해요 여기에 내 질문을 유지하려고합니다 같은 쿼리를 사용하면 다음과 같은 작업을 수행 할 수 있습니다 변수 i가 0에서 시작하는 변수를 말하며 변수 i는 행보다 작습니다 내 결과에서 셀 수, 실제로 얼마나 많은 결과를 얻었는지, 내가 갈수록 늘릴거야 이 루프를 통해이 루프 내부에서 실제로 인쇄 할 수 있습니다

내 상자에 대한 세부 정보 어쩌면 일련의 반향 설명을 통해이 작업을 수행 할 수 있습니까? 상자에 ID를 표시 할 수 있습니다 아, 물론, 여기 어딘가에 가져 오기를 호출해야합니다 안그래? 그래서 결과를 호출 할 때 돌아 오는 변수를 상자에 넣습니다 술책

그런 다음, 실제로 상자 변수에 해당 행에 대한 값이 있으면, 이전에했던 것과 똑같은 방법으로 간단하게 echo 문을 사용할 수 있습니다 그 그런 다음 echo 문을 복제하고 다른 측면에 대해 다시 수행하겠습니다 상자의 그래서 ID를 출력하고, 너비를 출력하고, 출력 할 것입니다

높이, 나는 그 색을 프린트 할 것이고, 그런 다음 그 키들을 my 배열을 사용하여 개별 데이터 조각 각각에 액세스합니다 우리가 있습니다 그리고 내가 간다면 그런 다음 브라우저에서 모든 상자에 대한 모든 데이터를 가져옵니다 상자 1 50 500 빨간색, 상자 2 100 x 100 파란색, 실제로 내 데이터베이스에 넣은 것과 정확히 같은 데이터 내가 작업대 도구에있을 때

따라서 실제로 쿼리 메서드를 사용하여 실행할 수 있습니다 select 쿼리는 나에게 결과 집합을 돌려 준다 거기에 얼마나 많은 가치가 있는지 알 수 있어요 그 결과는 rowCount 메서드를 사용하여 설정하고 나는 각 개별 행을 fetch 메소드를 사용하여 fetch 메소드가 데이터를 나에게 반환하는 형식 당신의 목적이 무엇인지에 따라 바뀌지 만 연관 배열은 기본값이며 일반적으로 잘 작동합니다

우리가 잠재적으로 할 수있는 또 하나의 가능성 여기에서 사용하는 것은 결과에서 얻은 모든 개별 결과를 처리하는 대신 우리가 여기있는 방식대로 한 번에 하나씩 설정하면 모든 결과를 한꺼번에 가져올 수 있습니다 단순히 fetchAll 인 fetch 대신에 사용할 수있는 또 다른 방법이 있습니다 예를 들어 boxes라는 새로운 배열을 만들 수 있습니다 결과 세트는 fetchAll 메소드를 호출하고 내 행 중 하나만 가져 오는 대신 내 상자는 이전에 fetch를 호출 할 때와 같은 방식으로, fetchAll은 이제 나를 돌려 줄 것이다 모든 상자

여기 상자는 배열을 통해 증가시킬 수 있어야합니다 모든 상자에 대한 데이터를 표시합니다 여기서 시도해 보겠습니다 악 foreach 루프를해라 그리고 나는 나의 박스 각각에 대해 말할 것이다, 박스로서 각각을 가져 가고, 그 다음 그 루프 안에서 내가 할 수있는 것은 본질적으로 이전에 해본 적이 있었지만 브라우저에서 어떻게 작동하는지 봅시다

브라우저로 돌아 가기 나는 새로 고침을했고 똑같은 결과를 얻었습니다 하지만, 여기에 한 번에 결과 세트에서 모든 결과를 추출하여 모두 저장하고 그 시점에서 전통적인 PHP 데이터처럼 작업 할 수 있습니다 이전에했던 것보다 훨씬 쉬워 졌기 때문에 이점이 있다고 생각합니다 대신에 우리가 여기에 있었던 것처럼 select 문을 사용하여 데이터베이스에서 데이터를 추출합니다 쿼리를 사용하여 데이터베이스의 데이터를 여러 가지 방법으로 작업 할 수있게하려면 어떻게해야합니까? 예를 들어, 새로운 데이터를 삽입하려면 어떻게해야합니까? 어떤면에서 우리가 데이터를 삽입하기 위해 PHP에서하는 것과 비슷할 것입니다

기본적인 근본적인 것 우리가해야할 일은 우리가 선택한 것처럼 SQL 문을 실행해야한다는 것입니다 질의와 비슷하지만, SQL 문 자체가 삽입되는 삽입 또는 업데이트와 같은 것 훨씬 더 복잡하다 예를 들어 워크 벤치 도구에있을 때마다 우리는 삽입 문을 처음으로 기억하기 위해 테이블에 데이터를 저장하려고했습니다 나는이 작은 선택 진술보다 훨씬 더 길었고, 훨씬 더 복잡했다 여기서 쓴거야

우리가 특별히 염려해야 할 것, 특히 여기에 PHP에서 매우 자주 삽입 값과 같은 값을 넣을 수 있습니다 문은 잠재적으로 사용자가 입력 한 값, 수집 된 값일 수 있습니다 예를 들어 사용자가 완성한 양식에서 우리는 매우 조심해야한다 그 이유는 우리가 특정 취약점의 영역에 있기 때문입니다 SQL 주입 공격이라고합니다

근본적인 문제는 사용자에게 양식을 제공하고 사용자는 올바른 방식으로 작성된 악의적 인 데이터를 해당 양식에 채운 다음 사용자가 우리에게 준 데이터를 가져 와서 SQL 쿼리로 파싱하면 잠재적으로 사용자가 데이터베이스를 손상 시키거나 다른 방법으로 우리를 위반할 수있게합니다 의도하지 않기 때문에 우리는 데이터를 취하는 방법과 그 데이터가 SQL로 작성한 삽입 문 및 업데이트 문과 같은 항목에 통합됩니다 PHP를 통해 이 PDO 라이브러리에 대한 좋은 점 중 하나는 일종의 내장 된 보호 기능으로 SQL 주입 공격으로부터 우리를 안전하게 지키려고 노력합니다 그만큼 일반적으로 작동하는 방식은 삽입 또는 업데이트와 같은 작업을 수행 할 때입니다

우리는 select 문과는 다른 방식으로 이러한 유형의 SQL 문을 수행합니다 무언가로 select 문과 같이이 쿼리 메서드를 사용하고 쿼리 메서드는 기본적으로 우리는 SQL 문을 여기에 가지고 있습니다 그것은 단단한 문자열입니다 그게 뭔가 있어야합니다 우리는 부수적 인 데이터가 아니라 여분의 데이터가 파싱 된 데이터가 아닙니다

다른쪽에 삽입 또는 업데이트 문장을 할 때 우리가 할 일은 데이터베이스에서 온 것입니다 우리는 준비된 선언문을 사용하려고합니다 실제 방법은 우리는 준비라는 방법이 될 것입니다 이 준비 방법으로 여기서 어떻게 될까요? 우리는 기본적으로 SQL 문에 대한 프레임 워크를 제공합니다 예를 들어 상자에 삽입하는 것과 같은 일을하십시오

삽입하고 싶은 필드를 말해 줄 것입니다 데이터를 삽입하여 데이터를 가로, 세로, 높이에 삽입하려고합니다 색상, 그리고 내가 삽입하고자하는 실제 값은이 괄호 안쪽에 있습니다 전통적인 PHP 문자열 조작을하는 대신 우리가 할 수있는 방법 내가 포함시키려는 다른 값들을 파싱 할 수있는 이전에 해왔 던 거기서,이 준비 문은 실제로 제가 할 수있는 것은 여기에 자리 표시자를 두는 것입니다 SQL 문으로 변환 한 다음 PDO 라이브러리 자체와 그렇게하면 채워지는 값을 확인하기 위해 조치를 취할 것입니다

SQL 인젝션 공격으로 이어질 수있는 값이 아닙니다 이제 저기에는 여기에있는 값을 실제로 대체 할 수있는 다양한 방법이 있습니다 하나의 우리가 할 수있는 방법은 명명되지 않은 자리 표시자를 사용하는 것입니다 이름이없는 자리 표시 자 우리가 할 일은 우리가 간단하게 넣을 것인가? 가치가있는 모든 곳 가다 그래서 내가 여기에 채워질 세 가지 가치가 있기를 원한다면 괄호 안에 3 개의 다른 물음표를 넣을 수 있습니다

각각의 그 물음표는 순서대로 내가 가치를 두는 곳이 될 것입니다 그곳에 그런 다음 실제 값을 그 자리 표시 자와 연결할 수있는 다른 방법이 있습니다 내가이 준비 문구를 여기 부르면 일어날 일은 나에게 줄 것이다 명령문 객체를 뒤로 – 나는 그것을 stmnt, statement 또는 명령문의 단축 버전이라고 부를 것이다 어쨌든 – 그 문장 객체에는 bindParam이라는 메서드를 호출 할 수 있습니다

이 bindParam 메서드를 사용하면 내가 원하는 값을 말할 수 있습니다 저 다른 장소의 각각으로 들어가십시오, 그래서 나는, 예를 들면, 장소 수 1 어떤 특정한 폭을 넣었습니다 나는 444 너비에 넣어 말할 수 있습니다 그런 다음 위치 2에 대해 바인드 매개 변수를 수행합니다 여기서 555의 높이를 가져온 다음 매개 변수를 바인딩합니다

색상은 3입니다 나는 그와 비슷한 방식으로 그것에 대해 갈 수 있었다 그것은 정말로 내가 선호하는 경향이있는 이유는 그것이 내가 가진 많은 다른 가치들 MySQL로 대체하려고합니다 많은 바인드 매개 변수 문이 필요할 것입니다 나는 조금 성가시다

이것이 잠재적으로 행해질 수있는 다른 방법 내가 훨씬 더 좋아한다는 것은 실제로이 SQL 문을 실행할 준비가되었을 때, 실제로 데이터베이스에서 실행할 준비가되면 내가 할 일은 나는 execute 메소드를 호출 할 것이다 만약 내가 바인드 경계선 퍼팅을했다면 그 자리 표시 자에 대한 값을 execute라고 부르며 그 시점에서 SQL 문 실행되면 실행됩니다 하지만 bind 매개 변수 문을 사용하고 싶지 않으면 대신 실제로 배열을 execute 문에 전달할 수 있습니다 그래서 여기에 예를 들어 444, 555 값과 녹색을 전달한다고 말할 수 있습니다 그러면 그것은 해당 배열의 값을 주어진 순서대로 가져 와서 자동으로 채 웁니다

물음표가있는 이름이없는 자리 표시 자에 넣습니다 그래서 444는 어디로 갈 것인가? 첫번째 ? 는 너비의 값에 해당하며, 555는 두 번째 ? 높이의 값에 해당합니다 내가 그 일을 할 수 있기 때문에 나는 그것을 좋아한다 여기에 멋진 삽입 문을 넣고 코드 대신 2 줄만 써도됩니다 이 모든 여분의 바인드 매개 변수 문을 거기에 넣어야합니다

이 배열 메서드는 난 그냥 많은 청소기를 쉽게 찾을 수 있습니다 우리가이 일을 할 수있는 또 다른 방법이 있습니다 그래도 나는 어떤면에서는 조금 더 멋지다고 생각합니다 우리가 할 수있는 또 다른 방법 잠재적으로 이러한 이름없는 매개 변수를 사용하는 대신이 작업을 수행 할 수 있습니다 명명 된 매개 변수라고합니다

그래서 3 개의 익명의 물음표 대신 여기 실제로 할 수있는 것은 내가 넣을 수있는 것입니다 : 내가 할 수있는 이름이 뒤따 랐습니다 : width, : height, 그리고 : color, 그리고 나서 실제로 값을 넣을 때 -와 함께 질의를 실행합니다 그 값들이 대체되고, 나는 배열을 다시 통과 할 수 있었고, 나는 그것을 할 수 있었다 연관 배열에서 키와 같은 이름을 다시 지정합니다 그래서 나는 구체적으로 말할 수 있었다 너비는 444의 값을 사용하고, 높이는 특별히 555의 값을 사용하고, 색상은 특히 녹색 값을 사용합니다

기술적으로 조금 더 타이핑, 좀 더 긴 코드를 작성해야하지만, 또한 생각합니다 더 읽기 쉽습니다 우리가 어떤 가치를 지니고 있는지 말해주는 배열에있는 사실 어떤 위치에 매우 구체적으로 이제 여기에서 자리 표시 자에 대해 알 수 있습니다

자체는 자리 표시자가 콜론으로 시작해야합니다 그것은 그 구문의 구문 일뿐입니다 공장 그러나 배열 자체에서 콜론을 앞에 놓지 않아도됩니다 실제 배열 키입니다

원한다면 할 수 있습니다 실제로 잘 작동합니다 콜론을 거기에 놓으십시오 그래서 지금 쓰여지는 것은 매번 일어날 일입니다 내 페이지에 액세스하여 명세서를 준비하고, 기본적으로 내부에 명세서를 작성합니다

데이터베이스 자체,이 삽입 문 그런 다음 그 진술을 실제로 실행한다고 말할 때 내가 전달한 값을 받아 들일 것이고, 그 값을 성명을 발표하고 그런 식으로 실행하십시오 그래서 지금 내 페이지를 실행할 때마다 내가 만든 쿼리와 가져 오기를 할 때 여기 아래에 새로운 색상이 생성됩니다 우리가 꾸준히 새로운 상자를 만들어야한다는 것을 알게 될 것입니다 뛰어 넘 으세요 브라우저에 연결하여 작동하는지 확인하십시오

브라우저로 돌아가서 나는 앞으로 나아갈 것이다 새로 고침을 누르고 새 값인 ID 4가있는 새 상자가 나타납니다 새로 고침을 클릭하면 다시 insert 문은 새로운 실행으로 다시 실행되고 거기에 우리가 간다 다른 상자가 ID 5로 생성됩니다 그래서이 페이지를 실행할 때마다 지금 삽입하십시오

실행하고 나는 그 값들로 생성 된 새로운 박스를 얻게된다 그 가치는 물론, 어디서든 올 수 있습니다 이 값들은 반드시 필요하지는 않습니다 be)이 같은 프로그램에 하드 코딩됩니다 대신 대개 이러한 대체 값 내가 양식에서 수집 한 값이거나 파일에서 읽은 값일 것입니다

다른 출처 이것이 우리가 일반적으로 진술을 준비하는 기본 방법입니다 그게 우리가 일반적으로 insert 문과 update 문 같은 것을 함께 쓰는 방식 모든 것이 꽤 잘 작동하는 것 같습니다 그와 함께가는 약간의 작은 비트는 우리가 여기에서하는 것처럼 insert 문을 실행할 때마다 statement 객체 그 자체는 언제나 되돌아 와서 우리에게 마지막 물체의 ID 번호를 알려줄 준비가되어 있습니다 방금 추가되었습니다

그래서, 예를 들어, 내가 말할 수있는 echo 문을 넣을 수 있습니다 추가 된 상자 ID는 – 그다지 좋은 언어는 아니죠? 그러나 나는 그것을 추측한다 작업 그리고 마지막 ID는 내 명세서 개체에 있습니다 데이터베이스 개체 자체에? 이것을 데이터베이스 객체 자체에 대해 호출 해 봅시다

lastInsertID라는 메서드가 있어야합니다 내가 가서 그걸로 휴식을 취할거야 모든 것을 읽을 수있는 방식으로 표시하려고 시도하고 실제로 얻는다 브라우저 위로 돌아가서 새로 고침하면 알려줍니다 마지막으로 추가 된 상자 ID 6이었고, ID가 6 인 새 상자가 만들어졌습니다

다시 새로 고침을 한 경우 7이라는 ID를 가진 새 상자가 추가되었다는 것을 알려줍니다 그래서 우리는 마지막으로 삽입 된 ID 메서드는 실제 데이터베이스 연결 자체가 아니라 해당 데이터베이스 연결에서 호출됩니다 내가 이전에 말하기 시작했듯이 성명서 객체는 ID가 무엇인지간에 항상 알려주고 서로 다른 시간에 편리하게 사용할 수 있도록 삽입되었습니다 다소간, 잘하면, 이 시점에서 당신은이 다른 것들이 어떻게 시작되는지에 대한 아이디어를 얻고 있습니다 함께

우리가하지 않은 유일한 일은 업데이트를하지 않은 것입니다 업데이트 중 본질적으로 삽입하는 것처럼 발생합니다 우리는 준비와 update 문을 실행할 때마다 메소드를 실행하고, 데이터를 업데이트하는 명령문을 실행한다 우리 테이블에 실제로 데이터를 삭제하려는 경우는 어떻습니까? 데이터를 삭제하거나 어떤 유형의 삭제 쿼리를 수행하면 execute라는 다른 메소드가 사용됩니다

방법 예를 들어 상자에서 삭제 실행을 할 수 있습니다 예를 들어 색상이 노란색입니다 우리는 데이터베이스 객체에서이를 호출 할 것입니다 실행 메소드가 사용 된 쿼리 메소드와 약간 다릅니다

선택을 위해 그리고 그것은 우리가 사용한 준비와 실행 방법과 매우 다릅니다 삽입 및 업데이트 기본적으로 쿼리는 데이터를 가져올 것으로 예상되는 상황에 대한 것입니다 결과와 마찬가지로 다시 돌아올 수는 있지만 실제로는 대체 할 수 없습니다 쿼리 자체 준비 및 실행은 일부 유형의 데이터가 잠재적으로 우리는 실제 상황에서 여러 유형의 업데이트를 수행해야 할 것입니다

실행중인 SQL 문 그런 다음 execute 메소드는 종종 삭제에 사용됩니다 데이터가 반환 될 것으로 기대하지 않는 상황입니다 우리는 실제 SQL 쿼리 자체에서 어떤 종류의 치환도하지 않을 것입니다 그래서, 어떤면에서는, 일종의 가장 엄격한 묶음

그러나 그 중 몇 가지 방법으로 실제로 데이터베이스에서 데이터 액세스 및 작업 PHP에서 전반적으로 패턴에 익숙해지면 작업하기가 대단히 어렵지 않습니다 우리가 쓰고 읽어야 할 모든 일보다 확실히 더 이상 플랫 파일에서 그리고 당연히 데이터베이스 자체로 작업하는 것은 또한 잠재적으로 많은 것을 가지고있다 우리가 얻을 수있는 추가 혜택 : 빠르고, 더 나은 동시 액세스, 향상된 보호 우리의 데이터 우리는 또한 새로운 보안 문제가 발생할 수 있음을주의해야합니다

예를 들어 SQL 인젝션 공격처럼 하지만 약간의 연습으로 전반적으로 PDO 라이브러리를 사용하여 PHP를 통해 데이터베이스 작업하기는 어렵지 않습니다 할 것