source

"WHERE column ="에 있는 MySQL에서 물음표의 중요성은 무엇입니까?

manysource 2022. 11. 14. 21:46

"WHERE column ="에 있는 MySQL에서 물음표의 중요성은 무엇입니까?

코드를 분석하다가 이걸 발견했어요

$sql = 'SELECT page.*, author.name AS author, updator.name AS updator '
     . 'FROM '.TABLE_PREFIX.'page AS page '
     . 'LEFT JOIN '.TABLE_PREFIX.'user AS author ON author.id = page.created_by_id '
     . 'LEFT JOIN '.TABLE_PREFIX.'user AS updator ON updator.id = page.updated_by_id '
     . 'WHERE slug = ? AND parent_id = ? AND (status_id='.Page::STATUS_REVIEWED.' OR status_id='.Page::STATUS_PUBLISHED.' OR status_id='.Page::STATUS_HIDDEN.')';

WHERE 스테이트먼트에서 "?"는 무엇을 하는지 궁금합니다.일종의 파라미터 홀더인가?

준비된 스테이트먼트는 MySQL에서?를 사용하여 스테이트먼트에 대한 바인딩을 허용합니다.올바르게 사용하면 SQL 주입에 대해 더 안전하다고 간주됩니다.또한 요청을 한 번만 컴파일하면 재사용할 수 있으므로 SQL 쿼리를 더 빠르게 수행할 수 있습니다.

물음표는 나중에 대체될 파라미터를 나타냅니다.매개 변수화된 쿼리를 사용하는 것이 매개 변수를 쿼리에 직접 포함하는 것보다 더 안전합니다.

SQL Server는 이 매개 변수 크기 쿼리를 호출하고 Oracle은 이를 바인딩 변수라고 합니다.

사용 방법은 쿼리를 실행하는 언어에 따라 달라집니다.

다음은 PHP에서 사용하는 방법의 예입니다.

라고 가정하면$mysqli데이터베이스 연결입니다.people는 4개의 컬럼으로 이루어진 테이블입니다.

$stmt = $mysqli->prepare("INSERT INTO People VALUES (?, ?, ?, ?)");

$stmt->bind_param('sssd', $firstName, $lastName, $email, $age);

'sssd'나머지 파라미터를 식별하는 플래그입니다.s문자열과d디지트를 나타냅니다.

?MySQL에는 특별한 의미가 없습니다.WHERE =스테이트먼트, 준비된 스테이트먼트만

가장 흔히 볼 수 있는 경우는 특별한 의미가 부여되어 있기 때문이다.?PHP 및 Rails와 같은 여러 웹 프레임워크에서 사용할 수 있습니다.

?는 구문 오류에 불과합니다.

CREATE TABLE t (s CHAR(1));
SELECT * FROM t WHERE s = ?;

따옴표 없이 다음 형식으로 되어 있기 때문입니다.

INSERT INTO t VALUES ('a');
INSERT INTO t VALUES ("?");
SELECT * FROM t WHERE s = '?';

반환:

s
?

특별한 의미는 없는 것 같습니다.

MySQL 5.0 준비문

MySQL 5.0은 웹 프레임워크에서 물음표와 유사한 의미를 갖는 준비된 문장 기능을 추가했습니다.

문서의 예:

PREPARE stmt1 FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
SET @a = 3;
SET @b = 4;
EXECUTE stmt1 USING @a, @b;

출력:

hypotenuse
5

이러한 문자는, 예상대로 특수 문자도 이스케이프 합니다.

PREPARE stmt1 FROM 'SELECT ? AS s';
SET @a = "'";
EXECUTE stmt1 USING @a;

출력:

s
'

레일 예시

예를 들어 Rails에서 물음표는 라이브러리의 프로그래밍 언어(Ruby) 변수에 의해 주어진 인수로 대체됩니다. 예:

Table.where("column = ?", "value")

버그나 SQL 주입을 피하기 위해 자동으로 인수를 따옴표로 나타내며 다음과 같은 문장이 생성됩니다.

SELECT * FROM Table WHERE column = 'value';

이 견적을 통해 다음과 같은 경우에 대비할 수 있습니다.

Table.where("column = ?", "; INJECTION")

다음은 준비된 스테이트먼트입니다.준비된 스테이트먼트는 두 가지 주요 이점을 제공합니다.

쿼리는 한 번만 구문 분석(또는 준비)하면 되지만 동일하거나 다른 매개 변수를 사용하여 여러 번 실행할 수 있습니다.쿼리가 준비되면 데이터베이스는 쿼리 실행 계획을 분석, 컴파일 및 최적화합니다.복잡한 쿼리의 경우 이 프로세스에 충분한 시간이 걸리고 다른 파라미터로 같은 쿼리를 여러 번 반복해야 할 경우 응용 프로그램의 속도가 현저하게 느려질 수 있습니다.준비된 문을 사용함으로써 어플리케이션은 분석/컴파일/최적화 사이클을 반복하지 않습니다.즉, 준비된 스테이트먼트는 리소스를 적게 사용하기 때문에 실행 속도가 빨라집니다.

준비된 스테이트먼트에 대한 파라미터는 따옴표가 필요 없습니다.드라이버가 자동으로 처리합니다.응용 프로그램이 준비된 문을 단독으로 사용하는 경우 개발자는 SQL 주입이 발생하지 않음을 확인할 수 있습니다(단, 쿼리의 다른 부분이 이스케이프되지 않은 입력으로 빌드되는 경우 SQL 주입은 여전히 가능합니다).

http://php.net/manual/en/pdo.prepared-statements.php

언급URL : https://stackoverflow.com/questions/675010/what-is-the-question-marks-significance-in-mysql-at-where-column