[SQL] MySQL의 문 안에 PHP 변수를 포함하는 방법
SQLMySQL의 문 안에 PHP 변수를 포함하는 방법
나는 내용 테이블에 값을 삽입하기 위해 노력하고있어. 내가 VALUES 안에 PHP 변수가없는 경우 잘 작동합니다. 내가 VALUES 내부 변수 $ 유형을 넣었을 때 다음이 작동하지 않습니다. 내가 도대체 뭘 잘못하고있는 겁니까?
$type = 'testing';
mysql_query("INSERT INTO contents (type, reporter, description)
VALUES($type, 'john', 'whatever')");
해결법
-
==============================
1.어떤 MySQL의 문의 PHP 변수의 내부를 추가하는 규칙은 평범하고 단순하다 :
어떤 MySQL의 문의 PHP 변수의 내부를 추가하는 규칙은 평범하고 단순하다 :
귀하의 예제는 데이터 리터럴을 포함 그래서, 모든 변수는 자리 (또한 매개 변수)를 추가해야합니다. 이렇게하려면 :
그리고 여기에 모든 인기있는 PHP 데이터베이스 드라이버 방법으로 할 수 있습니다 :
이러한 드라이버가 존재하지 않습니다.
$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 쿼리를 실행하는 기사뿐만 아니라 극적 과정을 용이하게하는 솔루션에서 찾을 수 있습니다.
$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 절에서 필드 이름을 추가, 내 다른 문서에 설명되어 있습니다 :
다음은 그 예이다 :
$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"); }
그들 중 하나입니다 허용 변종 중 하나 같거나 던져 오류가있을 것 같은 그런 코드 후, $ 방향과 $ ORDERBY 변수 모두 안전하게 SQL 쿼리에 넣어 수 있습니다.
마지막 것은 그들은 또한 특정 데이터베이스 구문에 따라 포맷해야합니다, 식별자에 대해 언급합니다. MySQL을 위해 그것은 식별자의 주위에 문자를 역 따옴표해야합니다. 예에 의해 우리의 주문에 대한 최종 쿼리 문자열이 될 것이다 그래서
$query = "SELECT * FROM `table` ORDER BY `$orderby` $direction";
-
==============================
2.그것이 문자열만큼 - 따옴표 안에 넣어해야
그것이 문자열만큼 - 따옴표 안에 넣어해야
$type = 'testing'; mysql_query("INSERT INTO contents (type, reporter, description) VALUES('$type', 'john', 'whatever')");
다니가 adviced으로 그리고, 예 : 당신은) (당신이 mysql_real_escape_string를 함께 쿼리에 넣어 모든 문자열을 살균한다
-
==============================
3.BE와 삽입 문을 SQL 주입을 방지하려면
BE와 삽입 문을 SQL 주입을 방지하려면
$type = 'testing'; $name = 'john'; $description = 'whatever'; $stmt = $con->prepare("INSERT INTO contents (type, reporter, description) VALUES (?, ?, ?)"); $stmt->bind_param("sss", $type , $name, $description); $stmt->execute();
-
==============================
4.$ 유형 내의 텍스트 따라서 MySQL은이 도착, 삽입 문자열로 직접 치환된다 :
$ 유형 내의 텍스트 따라서 MySQL은이 도착, 삽입 문자열로 직접 치환된다 :
... VALUES(testing, 'john', 'whatever')
테스트 주위에 따옴표가 없음을 통지, 당신은 너무 같은 이들을 둘 필요가 :
$type = 'testing'; mysql_query("INSERT INTO contents (type, reporter, description) VALUES('$type', 'john', 'whatever')");
또한 매개 변수 전달이 종류의 시도를 해킹하는 경향이있다 당신이 사용되는 데이터를 소독하지 않는 경우, SQL 주입에 읽을 권장합니다 :
-
==============================
5.즉, 쉽게 대답 :
즉, 쉽게 대답 :
$query="SELECT * FROM CountryInfo WHERE 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'] . "'";
-
==============================
6.최선의 선택은 준비된 문이다. 시세 및 탈출로 장난하는 것은 어려워로 시작하는 일,하고 유지하기 어렵다. 조만간 당신이 종료됩니다 실수로 그런 일까지 뭔가를 인용 또는 두 번 같은 문자열을 이스케이프 결국, 또는 혼란을 잊고. 당신이 버그의 그 유형을 찾을 수 년 전에 될 수 있습니다.
최선의 선택은 준비된 문이다. 시세 및 탈출로 장난하는 것은 어려워로 시작하는 일,하고 유지하기 어렵다. 조만간 당신이 종료됩니다 실수로 그런 일까지 뭔가를 인용 또는 두 번 같은 문자열을 이스케이프 결국, 또는 혼란을 잊고. 당신이 버그의 그 유형을 찾을 수 년 전에 될 수 있습니다.
http://php.net/manual/en/pdo.prepared-statements.php
-
==============================
7.이 시도:
이 시도:
$type = 'testing'; mysql_query("INSERT INTO contents (type, reporter, description) VALUES('$type', 'john', 'whatever')");
당신은 '$ 유형을'둘 필요가 아니라 $ 유형
-
==============================
8.변수는 사용자 입력 또는 기타 데이터를 포함하는 경우는 없습니다 신뢰, 데이터를 탈출 확신 할 수 있습니다. 이 같이 :
변수는 사용자 입력 또는 기타 데이터를 포함하는 경우는 없습니다 신뢰, 데이터를 탈출 확신 할 수 있습니다. 이 같이 :
$query = sprintf("INSERT INTO contents (type) VALUES ('%s')", mysql_real_escape_string($type)); $result = mysql_query($query);
-
==============================
9.여기
여기
$type='testing' //it's string mysql_query("INSERT INTO contents (type, reporter, description) VALUES('$type', 'john', 'whatever')");//at that time u can use it(for string) $type=12 //it's integer mysql_query("INSERT INTO contents (type, reporter, description) VALUES($type, 'john', 'whatever')");//at that time u can use $type
-
==============================
10.나는이 질문에 대한 몇 가지 답변이 있었다 알고 있지만 나는 다음과 같은 구문을 따르는 경우에, 나는 다시 오류에 문제가 없었 것을 추가 할 생각했다. 당신이 사용하는 테이블이 추가되는 열이 어떤 질문이 없습니다.
나는이 질문에 대한 몇 가지 답변이 있었다 알고 있지만 나는 다음과 같은 구문을 따르는 경우에, 나는 다시 오류에 문제가 없었 것을 추가 할 생각했다. 당신이 사용하는 테이블이 추가되는 열이 어떤 질문이 없습니다.
$query = "INSERT INTO contents (type, reporter, description) VALUES('".$type."', '".$reporter."', '"$whatever."')";
-
==============================
11.내부 : 당신은 작은 따옴표 나 큰 따옴표, 다음 괄호 다음 변수 이름 ($ abc 방송 예)에서 변수를 작성해야합니다.
내부 : 당신은 작은 따옴표 나 큰 따옴표, 다음 괄호 다음 변수 이름 ($ abc 방송 예)에서 변수를 작성해야합니다.
예:
SELECT * FROM log WHERE id = '{$id}';
from https://stackoverflow.com/questions/7537377/how-to-include-a-php-variable-inside-a-mysql-statement by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 어떻게 매개 변수화 된 SQL 쿼리를 만들려면 어떻게해야합니까? 왜해야 내가? (0) | 2020.03.06 |
---|---|
[SQL] 존재하는 경우 MySQL의 테이블 또는 업데이트에 삽입 (0) | 2020.03.06 |
[SQL] 하위 쿼리 대 가입 (0) | 2020.03.06 |
[SQL] MySQL의에서 중복 행을 제거 (0) | 2020.03.06 |
[SQL] 어떻게 SQL Server에서 쿼리 실행 계획을 얻을 수 있습니까? (0) | 2020.03.06 |