Google Bigquery - 运行参数化查询 - php

Posted

技术标签:

【中文标题】Google Bigquery - 运行参数化查询 - php【英文标题】:Google Bigquery - Running parameterized queries - php 【发布时间】:2017-03-08 17:28:16 【问题描述】:

来自 Google Bigquery 文档:

运行参数化查询

BigQuery 支持查询参数以帮助防止 SQL 注入 查询是使用用户输入构建的。此功能仅 可用于标准 SQL 语法。

要指定命名参数,请使用 @ 字符后跟 标识符,例如@param_name。

Google Bigquery 提供了 Python 和 Java 使用参数化查询的示例代码。

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

Google Bigquery 没有用于在此处运行参数化查询的 php 示例代码。

我尝试在 php 中使用@,就像在 python 和 java 代码中一样,它不起作用。

有什么建议吗?

谢谢!

我根据 Elliott 和 Mosha 的要求添加了代码

代码:

 $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注入。 这两个查询都不起作用。

【问题讨论】:

您能分享一个您尝试运行的 PHP 代码示例吗? 看看代码 sn-ps 会很有帮助,尤其是如何设置参数值;并更详细地解释“不起作用”的含义。 【参考方案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',
       ]),
     ],
);

【讨论】:

在 *** 上,如果答案解决了您的问题,请vote on it and accept it。【参考方案2】:

我试过这个并且成功了..[google-BigQuery]

$cloud = new ServiceBuilder([
    'keyFilePath' => 'project-auth-file.json'
]);

$bigQuery = $cloud->bigQuery();

 $query = 'select id 
             from `api-project-id.dbname.tablename` 
            where userId = @user_id;';

 $_userId = 202;

 $queryJobConfig = $bigQuery->query($query)
      ->parameters([
          'user_id' => (int)$_userId
      ]);

  $queryResults = $bigQuery->runQuery($queryJobConfig);

  foreach ($queryResults as $row) 
      echo "<br>". $row['id'];
  

google-BigQuery

【讨论】:

以上是关于Google Bigquery - 运行参数化查询 - php的主要内容,如果未能解决你的问题,请参考以下文章

Google BigQuery 中的参数化查询错误

IN()表达式中的nodejs bigquery参数化查询

将参数化 BigQuery 自定义查询连接到数据洞察

Google BQ:运行参数化查询,其中参数变量是BQ表目标

Airflow 中的 BigQuery 参数化查询

BigQuery 在参数化查询中使用数组