云数据存储API - php - GqlQuery - " SELECT * FROM kind_name WHERE __key __"

时间:2014-09-13 16:48:17

标签: php google-app-engine gql google-cloud-datastore

我在GAE上有一个应用程序:php运行时,我正在使用Google Cloud Datastore API从我的PHP应用程序连接到数据存储区。

我的问题:

如何使用密钥查询我的数据库,类似于Sql中的"SELECT * FROM table_name WHERE id <= 1410611039"

我的代码:(我见过有人使用这种查询字符串语法,它适用于它们)

$gql_query = new Google_Service_Datastore_GqlQuery();
$gql_query->setQueryString("SELECT * FROM notification WHERE __key__ = KEY('notification', 1410611039)");

我得到的错误的一部分是 Fatal error: Uncaught exception ... (400) Disallowed literal: KEY...

我的数据存储控制台视图: enter image description here

在将WHERE __key__ = KEY('notification', 1410611039)追加到query_string之前,一切都很好。

2 个答案:

答案 0 :(得分:2)

密钥在Cloud Datastore GQL中被视为文字,需要特殊处理。

如果用户将在运行时提供值,我们建议使用参数绑定。这有助于防止注入攻击等恶意行为。

有两种方法可以做到这一点;两者都以一个关键值开头:

$key_path_element = new Google_Service_Datastore_KeyPathElement();
$key_path_element->setKind('notification');
$key_path_element->setId(1410611039);

$key = new Google_Service_Datastore_Key();
$key.setPath([$key_path_element]);

$key_value = new Google_Service_Datastore_Value();
$key_value->setKeyValue($key);
然后可以将

$key_value用作命名参数:

$gql_query = new Google_Service_Datastore_GqlQuery();
$gql_query->setQueryString("SELECT * FROM notification WHERE __key__ = $theKey");

$name_arg = new Google_Service_Datastore_GqlQueryArg();
$name_arg->setName("theKey");
$name_arg->setValue($key_value);

$gql_query->setNameArgs([$name_arg]);

或作为位置参数:

$gql_query = new Google_Service_Datastore_GqlQuery();
$gql_query->setQueryString("SELECT * FROM notification WHERE __key__ = @1");

$number_arg = new Google_Service_Datastore_GqlQueryArg();
$number_arg->setValue($key_value);

$gql_query->setNumberArgs([$number_arg]);

如果没有向查询添加用户提供的输入,另一个选项是明确允许请求中的文字:

$gql_query = new Google_Service_Datastore_GqlQuery();
$gql_query->setQueryString("SELECT * FROM notification WHERE __key__ = KEY('notification', 1410611039)");
$gql_query->setAllowLiteral(true);

以下是argument binding的其他详细信息,此处为full GQL reference

答案 1 :(得分:0)

使用Java数据存储区API时遇到了同样的问题。 Java中的解决方案如下所示:

vagrant plugin install vagrant-dsc