2017-03-08 6 views
0

구글 BigQuery의 문서에서 :구글의 BigQuery - 매개 변수화 된 쿼리 실행 - PHP

실행 매개 변수화 된 쿼리

의 BigQuery 쿼리 매개 변수를 지원하는 쿼리는 사용자 입력을 사용하여 구성 할 때 SQL 주입을 방지합니다. 이 기능은 표준 SQL 구문과 함께 사용 가능한 입니다.

명명 된 매개 변수를 지정하려면 @ 문자 다음에 @param_name과 같은 식별자를 사용하십시오.

Google Bigquery에는 매개 변수가있는 쿼리를 사용하는 python 및 Java 용 샘플 코드가 있습니다.

https://cloud.google.com/bigquery/querying-data#bigquery-query-params-python

구글 BigQuery를 여기에 매개 변수가있는 쿼리를 실행하기위한 PHP 샘플 코드를 가지고 있지 않습니다.

파이썬 및 자바 코드에서와 같이 PHP에서 @ 사용을 시도했지만 작동하지 않습니다.

어떤 조언이 필요합니까?

감사합니다.

나는 엘리엇과 Mosha

코드의 요청으로 코드를 추가 :

$query = "SELECT * FROM [myproject.mydateset.users] where user_id = '$userId' LIMIT 1000"; 
$queryResults = $this->bigQuery->runQuery($query); 

이 쿼리는 괜찮습니다. 그러나 그것은 SQL 인젝션을 방해하지 않습니다.

내가는 SQL 주입을 방지하기 위해

$query = "SELECT * FROM [myproject.mydateset.users] where user_id = '@$userId' LIMIT 1000"; 

또는

$query = "SELECT * FROM [myproject.mydateset.users] where user_id = @$userId LIMIT 1000"; 

에 쿼리를 변경했습니다. 두 쿼리가 작동하지 않습니다.

+0

실행 해 보았던 PHP 코드 샘플을 공유 할 수 있습니까? –

+0

코드 스 니펫, 특히 매개 변수 값 설정 방법을 보는 것이 도움이됩니다. "작동하지 않는 것"에 대한 자세한 설명은 의미합니다. –

답변

1

이 문제를 해결하기 위해 프로젝트를 설정하지 않았으므로 구문 오류 또는 기타 문제가있을 경우 사과하지만이 작동하는지 확인하십시오. 나는 이것을 PHP API in Github에 기반을 두었습니다. 레거시 SQL보다는 쿼리에 standard SQL을 사용해야합니다.

$bigQuery = new BigQueryClient([ 
    'projectId' => $projectId, 
]); 

$query = "SELECT COUNT(DISTINCT word) AS distinct_words 
FROM `bigquery-public-data.samples.shakespeare` 
WHERE corpus = @corpus_name;"; 

$queryResults = $bigQuery->runQuery(
    $query, 
    ['useLegacySql' => false], 
    ['queryParameter' => new QueryParameter([ 
     'name' => 'corpus_name', 
     'parameterType' => new QueryParameterType([ 
     'type' => 'STRING', 
     ]), 
     'parameterValue' => new QueryParameterValue([ 
     'value' => 'kingrichardii', 
     ]), 
    ], 
); 
+0

감사합니다! 그것은 작동합니다. – searain

+0

StackOverflow에서 답변으로 문제가 해결되면 [vote on it and accept it] (http://stackoverflow.com/help/someone-answers)를 클릭하십시오. –