2017-03-08 88 views
0

從谷歌的BigQuery文檔:谷歌的BigQuery - 運行參數化查詢 - PHP

運行參數化查詢

BigQuery支援查詢參數,以幫助防止SQL注入時 查詢使用的用戶輸入構造。此功能僅適用於標準SQL語法的 。

要指定一個命名參數,請使用@字符,後跟 標識符,例如@param_name。

而谷歌Bigquery有python和Java使用參數化查詢的示例代碼。

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

谷歌的BigQuery沒有PHP的範例代碼,這裏運行參數化查詢。

我嘗試使用@在PHP就像在那裏的Python和Java代碼,它不起作用。

有什麼建議嗎?

謝謝!

我加入了代碼由Elliott和魔煞

代碼的請求:

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

該查詢是罰款。但它並不妨礙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"; 

防止SQL注入攻擊。 這兩個查詢都不起作用。

+0

您可以分享您嘗試運行的PHP代碼的示例嗎? –

+0

查看代碼片段會很有幫助,特別是如何設置參數值;並且更詳細地解釋什麼是「不起作用」的意思。 –

回答

1

我沒有設置項目來嘗試這個,所以如果有語法錯誤或其他疏漏,我很抱歉,但請看看它是否有效。我基於PHP API in Github。您將需要確保爲您的查詢使用standard SQL而不是傳統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上,如果答案解決了您的問題,請[對其進行投票並接受它](http://stackoverflow.com/help/someone-answers)。 –