쿼리를 작성하는 가장 좋은 방법을 배우려고합니다. 또한 일관성의 중요성을 이해합니다. 지금까지는 아무 생각없이 작은 따옴표, 큰 따옴표 및 백틱을 무작위로 사용했습니다.
예:
$query = 'INSERT INTO table (id, col1, col2) VALUES (NULL, val1, val2)';
또한, 상기 예에서, 그 고려 table
, col1
, val1
등의 변수 일 수있다.
이것의 표준은 무엇입니까? 너 뭐하니?
약 20 분 동안 비슷한 질문에 대한 답변을 읽었지만이 질문에 대한 명확한 대답이없는 것 같습니다.
답변
백틱은 테이블 및 열 식별자에 사용되지만 식별자가 MySQL 예약 키워드 이거나 식별자에 공백 문자 또는 한정된 세트를 벗어난 문자가 포함 된 경우에만 필요합니다 (아래 참조). 예약 키워드를 사용하지 않는 것이 좋습니다. 인용 문제를 피하면서 가능하면 열 또는 테이블 식별자로 사용하십시오.
VALUES()
목록 에서와 같이 문자열 값에는 작은 따옴표를 사용해야 합니다. 문자열 값은 MySQL에서 큰 따옴표를 지원하지만 다른 RDBMS에서는 작은 따옴표를 더 널리 사용하므로 큰 따옴표 대신 작은 따옴표를 사용하는 것이 좋습니다.
MySQL은 또한 리터럴 값이 DATE
와 DATETIME
같은 문자열로 작은 따옴표로 묶기를 기대 '2001-01-01 00:00:00'
합니다. 문의 날짜 및 시간 리터럴 하이픈을 사용하여 특정 대안에 자세한 내용은 문서를, -
날짜 문자열에서 세그먼트 구분 기호로.
따라서 예제를 사용하여 PHP 문자열을 큰 따옴표로 묶고 값에 작은 따옴표를 사용합니다 'val1', 'val2'
. NULL
는 MySQL 키워드이며 특수 (비) 값이므로 인용 부호가 없습니다.
이 테이블 또는 열 식별자는 예약어이거나 인용이 필요한 문자를 사용하지 않지만 어쨌든 백틱으로 인용했습니다 (나중에 자세히 설명합니다).
RDBMS에 고유 한 함수 (예 : NOW()
MySQL에서)는 인용 할 수 없지만 인수에 이미 언급 된 동일한 문자열 또는 식별자 인용 규칙이 적용됩니다.
백틱 (`) 테이블 및 열 ───────┐ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ $ query = " 테이블에 삽입하기 (`id`,`col1`,`col2`,`date`,`updated`) 값 (NULL, 'val1', 'val2', '2001-01-01', NOW ()) "; ↑↑↑↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑↑↑↑↑ 따옴표없는 키워드 ─────┴┴┴┘ │ │ │ │ │ │ ││││││ 작은 따옴표 ( ') 문자열 ───────────┴────┴──┴────┘ │ │ │││││ 작은 따옴표 ( ') 날짜 ─────────────────────────────────── │ 따옴표없는 기능
변수 보간
변수의 인용 패턴은 변경되지 않지만 문자열에서 변수를 직접 보간하려는 경우 PHP에서 큰 따옴표를 사용해야합니다. SQL에서 사용하기 위해 변수를 올바르게 이스케이프했는지 확인하십시오. ( SQL 주입을 방지하기 위해 준비된 명령문을 지원하는 API를 대신 사용하는 것이 좋습니다 ).
// 일부 변수 대체와 같은 것 // 여기서 변수 테이블 이름 $ table은 역 따옴표로 묶이고 변수는 // VALUES 목록에서 작은 따옴표로 묶습니다. $ query = " `$ table '에 삽입 (`id`,`col1`,`col2`,`date`) 값 (NULL, '$ val1 ' , '$ val2 ' , '$ date ' )";
준비된 진술
준비된 진술로 작업 할 때 설명서의 자리 표시자를 인용해야하는지 여부를 확인하려면 설명서를 참조하십시오. PHP, PDO 및 MySQLi에서 사용할 수있는 가장 인기있는 API는 다른 언어에서 가장 준비된 명령문 API와 같이 인용 부호가없는 자리 표시자를 예상 합니다.
// PDO example with named parameters, unquoted
$query = "INSERT INTO `table` (`id`, `col1`, `col2`, `date`) VALUES (:id, :col1, :col2, :date)";
// MySQLi example with ? parameters, unquoted
$query = "INSERT INTO `table` (`id`, `col1`, `col2`, `date`) VALUES (?, ?, ?, ?)";
식별자에서 역 따옴표를 요구하는 문자 :
MySQL 문서에 따르면 다음 문자 세트를 사용하여 식별자를 인용 (백틱) 할 필요가 없습니다.
ASCII :
[0-9,a-z,A-Z$_]
(기본 라틴 문자, 숫자 0-9, 달러, 밑줄)
예를 들어 공백을 포함하여 해당 세트 이상의 문자를 테이블 또는 열 식별자로 사용할 수 있지만 인용 부호 (백틱) 를 사용해야 합니다.
답변
MySQL에는 두 가지 유형의 따옴표가 있습니다.
'
문자열 리터럴을 묶기위한 것`
테이블 및 열 이름과 같은 식별자를 묶는 데 사용
그리고 "
특별한 경우가 있습니다. MySQL 서버에 따라 한 번 에 위에서 언급 한 목적 중 하나로 사용될 수 있습니다 sql_mode
.
- 기본적 으로
"
문자는 다음과 같이 문자열 리터럴을 묶는 데 사용될 수 있습니다'
- 에서
ANSI_QUOTES
모드"
캐릭터처럼 식별자를 둘러싸는 데 사용 할 수 있습니다`
다음 쿼리는 SQL 모드에 따라 다른 결과 (또는 오류)를 생성합니다.
SELECT "column" FROM table WHERE foo = "bar"
ANSI_QUOTES 비활성화
쿼리는 "column"
열 foo
이 문자열과 같은 문자열 리터럴을 선택 합니다."bar"
ANSI_QUOTES 활성화
쿼리는 열 column
이 열과 foo
같은 열을 선택합니다bar
사용시기
"
코드가 SQL 모드와 독립적이되도록 사용하지 않는 것이 좋습니다.- 모범 사례이므로 항상 식별자를 인용하십시오 (SO에 대해 몇 가지 질문을하십시오).
답변
(질문의 SQL 특성과 관련하여 위의 좋은 답변이 있지만 PHP를 처음 사용하는 경우에도 관련이 있습니다.)
아마도 PHP는 작은 따옴표와 큰 따옴표로 묶인 문자열을 다르게 처리한다고 언급하는 것이 중요합니다 …
작은 따옴표로 묶인 문자열은 ‘리터럴’이며 거의 WYSIWYG 문자열입니다. 큰 따옴표로 묶인 문자열은 가능한 변수 대체를 위해 PHP에 의해 해석됩니다 (PHP의 백틱은 정확히 문자열이 아니며 셸에서 명령을 실행하고 결과를 반환 함).
예 :
$foo = "bar";
echo 'there is a $foo'; // There is a $foo
echo "there is a $foo"; // There is a bar
echo `ls -l`; // ... a directory list
답변
역 따옴표는 일반적으로를 나타내는 데 사용됩니다 identifier
뿐만 아니라 수 안전한 실수로 사용에서 예약 된 키워드 .
예를 들면 다음과 같습니다.
Use `database`;
여기서 백틱은 서버가 database
실제로 데이터베이스 식별자가 아니라 데이터베이스의 이름 임을 이해하는 데 도움 이됩니다.
테이블 이름과 필드 이름에 대해서도 동일하게 수행 할 수 있습니다. 데이터베이스 식별자를 백틱으로 래핑 하는 경우 이는 매우 좋은 습관 입니다.
백틱에 대한 자세한 내용을 보려면 이 답변을 확인하십시오 .
큰 따옴표 및 작은 따옴표에 대해 이제
그러나 값을 정의하려면 작은 따옴표 나 큰 따옴표를 사용해야합니다. 다른 예를 보자.
INSERT INTO `tablename` (`id, `title`) VALUES ( NULL, title1);
여기서 나는 title1
따옴표 로 감싸는 것을 잊어 버렸습니다 . 이제 서버는 title1
열 이름 (즉, 식별자)으로 사용합니다. 따라서 값임을 나타내려면 큰 따옴표 나 작은 따옴표를 사용해야합니다.
INSERT INTO `tablename` (`id, `title`) VALUES ( NULL, 'title1');
이제 PHP와 함께 큰 따옴표와 작은 따옴표를 사용하면 쿼리 작성 시간이 훨씬 쉬워집니다. 질문에 수정 된 버전의 검색어를 보겠습니다.
$query = "INSERT INTO `table` (`id`, `col1`, `col2`) VALUES (NULL, '$val1', '$val2')";
이제 PHP에서 따옴표를 사용하여, 당신은 변수를 만들 것입니다 $val1
, 그리고 $val2
따라서 완벽하게 유효한 쿼리를 만들고 그 값을 사용합니다. 처럼
$val1 = "my value 1";
$val2 = "my value 2";
$query = "INSERT INTO `table` (`id`, `col1`, `col2`) VALUES (NULL, '$val1', '$val2')";
할 것
INSERT INTO `table` (`id`, `col1`, `col2`) VALUES (NULL, 'my value 1', 'my value 2')
답변
MySQL은, 이러한 기호는 쿼리를 구분하는 데 사용되는 `
, "
, '
와 ()
.
-
"
또는'
문자열과 같은 값을 둘러싸에 사용됩니다"26-01-2014 00:00:00"
또는'26-01-2014 00:00:00'
. 이 기호는 집계되지 기능이 좋아, 단지 문자열입니다now
,sum
또는max
. -
`
테이블 또는 열 이름을 묶는 데 사용됩니다 (예 :select `column_name` from `table_name` where id='2'
-
(
및)
쿼리 예를 들어 단순히 묶으 부분select `column_name` from `table_name` where (id='2' and gender='male') or name='rakesh'
.
답변
MySQL과 PHP의 문자열 리터럴은 동일합니다.
문자열은 작은 따옴표 ( ” ‘”) 또는 큰 따옴표 ( “” “) 문자로 묶인 일련의 바이트 또는 문자입니다.
따라서 문자열에 작은 따옴표가 포함 된 경우 큰 따옴표를 사용하여 문자열을 인용하거나 큰 따옴표가 포함 된 경우 작은 따옴표를 사용하여 문자열을 인용 할 수 있습니다. 그러나 문자열에 작은 따옴표와 큰 따옴표가 모두 포함되어 있으면 문자열을 인용 할 때 사용한 따옴표를 이스케이프해야합니다.
대부분 SQL 문자열 값에는 작은 따옴표를 사용하므로 PHP 문자열에는 큰 따옴표를 사용해야합니다.
$query = "INSERT INTO table (id, col1, col2) VALUES (NULL, 'val1', 'val2')";
PHP의 큰 따옴표로 묶은 문자열에 변수를 사용할 수 있습니다.
$query = "INSERT INTO table (id, col1, col2) VALUES (NULL, '$val1', '$val2')";
그러나 작은 따옴표 가 $val1
있거나 $val2
포함되어 있으면 SQL이 잘못됩니다. 따라서 SQL에서 사용하기 전에 이스케이프 처리해야합니다. 그것이 무엇 mysql_real_escape_string
을위한 것입니다. (준비된 진술이 더 낫지 만)
답변
PHP와 MySQL을 함께 사용하면 큰 따옴표와 작은 따옴표를 사용하여 쿼리 작성 시간을 훨씬 쉽게 만들 수 있습니다.
$query = "INSERT INTO `table` (`id`, `col1`, `col2`) VALUES (NULL, '$val1', '$val2')";
이제 직접 사후 변수를 MySQL 쿼리에 사용한다고 가정하면 다음과 같이 사용하십시오.
$query = "INSERT INTO `table` (`id`, `name`, `email`) VALUES (' ".$_POST['id']." ', ' ".$_POST['name']." ', ' ".$_POST['email']." ')";
이것은 PHP 변수를 MySQL에 사용하는 가장 좋은 방법입니다.