programing

MySQL 문에 PHP 변수를 포함하는 방법

goodsources 2022. 12. 9. 21:54
반응형

MySQL 문에 PHP 변수를 포함하는 방법

목차에 값을 삽입하려고 합니다.VALUES 내부에 PHP 변수가 없으면 정상적으로 동작합니다.변수를 넣으면$type안에서.VALUES그럼 이건 안 되겠어내가 뭘 잘못하고 있지?

$type = 'testing';
mysql_query("INSERT INTO contents (type, reporter, description) 
     VALUES($type, 'john', 'whatever')");

MySQL 문 안에 PHP 변수를 추가하는 규칙은 단순하고 간단합니다.

  1. SQL 데이터 리터럴을 나타내는 변수(간단히 말하면 SQL 문자열 또는 숫자)는 준비된 문을 통해 추가해야 합니다.예외는 없습니다.
  2. SQL 키워드, 테이블 또는 필드 이름 또는 연산자와 같은 다른 쿼리 부분은 화이트리스트를 통해 필터링해야 합니다.

따라서 예제에는 데이터 리터럴만 포함되므로 모든 변수는 자리 표시자(모수라고도 함)를 통해 추가해야 합니다.그러기 위해서는:

  • SQL 문에서 모든 변수를 자리 표시자로 바꿉니다.
  • 결과 쿼리를 준비하다
  • 자리 표시자에 변수 바인딩
  • 쿼리를 실행하다

모든 인기 있는 PHP 데이터베이스 드라이버로 실행하는 방법은 다음과 같습니다.

mysql ext를 사용하여 데이터 리터럴 추가

그런 운전자는 존재하지 않는다.

를 사용하여 데이터 리터럴 추가mysqli

$type = 'testing';
$reporter = "John O'Hara";
$query = "INSERT INTO contents (type, reporter, description) 
             VALUES(?, ?, 'whatever')";
$stmt = $mysqli->prepare($query);
$stmt->bind_param("ss", $type, $reporter);
$stmt->execute();

코드는 조금 복잡하지만 이 모든 연산자에 대한 자세한 설명은 Mysqli를 사용하여 INSERT 쿼리를 실행하는 방법 및 프로세스를 극적으로 용이하게 하는 솔루션에서 찾을 수 있습니다.

SELECT 쿼리의 경우 콜만 추가하면 됩니다.get_result()친해지는 방법mysqli_result일반적인 방법으로 데이터를 가져올 수 있습니다.

$reporter = "John O'Hara";
$stmt = $mysqli->prepare("SELECT * FROM users WHERE name=?");
$stmt->bind_param("s", $reporter);
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc(); // or while (...)

PDO를 사용한 데이터 리터럴 추가

$type = 'testing';
$reporter = "John O'Hara";
$query = "INSERT INTO contents (type, reporter, description) 
             VALUES(?, ?, 'whatever')";
$stmt = $pdo->prepare($query);
$stmt->execute([$type, $reporter]);

PDO에서는 바인드 부품과 실행 부품을 조합할 수 있기 때문에 매우 편리합니다.PDO는 이름 있는 플레이스 홀더도 지원합니다.이러한 플레이스 홀더는 매우 편리합니다.

키워드 또는 식별자 추가

키워드나 식별자(데이터베이스, 테이블 또는 필드명)와 같이 쿼리의 다른 부분을 나타내는 변수를 추가해야 하는 경우가 있습니다.드문 일이지만 대비하는 것이 좋다.

이 경우 스크립트에 명시적으로 기술된 값 목록과 대조하여 변수를 확인해야 합니다.이는 사용자의 선택에 따라 ORDER BY 절에 필드 이름 추가라는 다른 글에서 설명합니다.

안타깝게도 PDO에는 식별자(테이블 및 필드 이름)에 대한 자리 표시자가 없으므로 개발자는 수동으로 식별자를 필터링해야 합니다.이러한 필터는, 허가되지 않은 값을 리스트 하는 「블랙 리스트」가 아니고, 「화이트 리스트」(허용치만을 리스트 하는 경우)라고 불립니다.

따라서 PHP 코드에 가능한 모든 변형을 명시적으로 나열하고 그 중에서 선택해야 합니다.

다음은 예를 제시하겠습니다.

$orderby = $_GET['orderby'] ?: "name"; // set the default value
$allowed = ["name","price","qty"]; // the white list of allowed field names
$key = array_search($orderby, $allowed, true); // see if we have such a name
if ($key === false) { 
    throw new InvalidArgumentException("Invalid field name"); 
}

방향에도 정확히 동일한 접근방식을 사용해야 한다.

$direction = $_GET['direction'] ?: "ASC";
$allowed = ["ASC","DESC"];
$key = array_search($direction, $allowed, true);
if ($key === false) { 
    throw new InvalidArgumentException("Invalid ORDER BY direction"); 
}

뒤에 둘 다.$direction ★★★★★★★★★★★★★★★★★」$orderby변수는 허용된 변형 중 하나와 같거나 오류가 발생하므로 SQL 쿼리에 안전하게 넣을 수 있습니다.

식별자에 대해서는 마지막으로 특정 데이터베이스 구문에 따라 형식을 지정해야 합니다. MySQL 、backtick식별자 주위의 문자. 우리 에 대한 은 예를 , 래래 for for for for for for for for for for for for for for for for for for for for for for for for for for for for for for for for for for for for for for for for for for for.

$query = "SELECT * FROM `table` ORDER BY `$orderby` $direction";

SQL 주입을 방지하려면 be가 있는 삽입문을 사용합니다.

$type = 'testing';
$name = 'john';
$description = 'whatever';

$con = new mysqli($user, $pass, $db);
$stmt = $con->prepare("INSERT INTO contents (type, reporter, description) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $type , $name, $description);
$stmt->execute();

가장 좋은 옵션은 준비된 문장입니다.인용문과 탈출구를 만지작거리는 것은 처음에는 어렵고 유지하기가 어렵습니다.조만간 당신은 우연히 무언가를 인용하는 것을 잊거나, 같은 끈을 두 번 벗어나거나, 혹은 그와 같은 것을 망치게 될 것이다.그런 종류의 벌레를 찾으려면 몇 년이 걸릴지도 몰라.

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

$type 내의 텍스트는 삽입 문자열로 직접 대체되므로 MySQL은 다음과 같이 가져옵니다.

... VALUES(testing, 'john', 'whatever')

테스트에 대한 견적은 없습니다.다음과 같이 입력해야 합니다.

$type = 'testing';
mysql_query("INSERT INTO contents (type, reporter, description) VALUES('$type', 'john', 'whatever')");

또한 SQL 주입에 대해서도 읽어볼 것을 권장합니다.사용하는 데이터를 삭제하지 않으면 이러한 파라미터 전달은 해킹을 시도하기 쉽기 때문입니다.

간단한 답변입니다.

$query="SELECT * FROM CountryInfo WHERE Name = '".$name."'";

'어울리지 않다'를 정의합니다.$name네가 원하는 대로 해
방법으로는

$query = " SELECT '" . $GLOBALS['Name'] . "' .* " .
         " FROM CountryInfo " .
         " INNER JOIN District " .
         " ON District.CountryInfoId = CountryInfo.CountryInfoId " .
         " INNER JOIN City " .
         " ON City.DistrictId = District.DistrictId " .
         " INNER JOIN '" . $GLOBALS['Name'] . "' " .
         " ON '" . $GLOBALS['Name'] . "'.CityId = City.CityId " .
         " WHERE CountryInfo.Name = '" . $GLOBALS['CountryName'] .
         "'";
Try This simply 
$type = 'testing';
mysql_query("INSERT INTO contents (type, reporter, description) 
 VALUES('$type', 'john', 'whatever')");

언급URL : https://stackoverflow.com/questions/7537377/how-to-include-a-php-variable-inside-a-mysql-statement

반응형