云数据存储API-php-GqlQuery-";选择“从种类”名称中的“键”;

云数据存储API-php-GqlQuery-";选择“从种类”名称中的“键”;,php,google-app-engine,gql,google-cloud-datastore,Php,Google App Engine,Gql,Google Cloud Datastore,我在GAE:php运行时上有一个应用程序,我正在使用googleclouddatastoreapi从我的php应用程序连接到数据存储 我的问题: 如何使用键查询我的数据库,类似于从表\u name中选择*,其中id键在云数据存储GQL中被视为文本,需要特殊处理 如果用户将在运行时提供值,我们建议使用参数绑定。这有助于防止恶意行为,如注入攻击 有两种方法可以做到这一点;它们都以键值开始: $key_path_element = new Google_Service_Datastore_KeyPat

我在GAE:php运行时上有一个应用程序,我正在使用googleclouddatastoreapi从我的php应用程序连接到数据存储

我的问题:


如何使用键查询我的数据库,类似于从表\u name中选择*,其中id键在云数据存储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\u 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__ = $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);

以下是有关的一些附加详细信息,以下是。

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

datastore = DatastoreOptions.builder()
.authCredentials(AuthCredentials.createApplicationDefaults())
.build()
.service();
String id = "asdf123";
Query<Entity> query = Query.gqlQueryBuilder(
    Query.ResultType.ENTITY, 
    "SELECT * FROM Task WHERE id = '"+id+"'")
    .allowLiteral(true)
    .build();
QueryResults<Entity> result = datastore.run(query);
while(result.hasNext()){
    Entity temp = result.next();
    //(...)
}
datastore=DatastoreOptions.builder()
.authCredentials(authCredentials.createApplicationDefaults())
.build()
.service();
字符串id=“asdf123”;
Query Query=Query.gqlQueryBuilder(
Query.ResultType.ENTITY,
“从任务中选择*,其中id=”“+id+””)
.allowLiteral(真)
.build();
QueryResults result=datastore.run(查询);
while(result.hasNext()){
实体温度=结果。下一步();
//(...)
}

Cloud Datastore GQL与App Engine GQL稍有不同。但我不确定这里的确切问题:您是否尝试过不带引号的
notification
?是的,我只是尝试了不带引号的
notification
,但仍然存在相同的错误。不幸的是,对于数据存储API,没有关于如何生成GQL字符串的指南。我没有hink
KEY('kind','name/id')
是一种生成数据存储密钥的方法,但它无法通过API工作。感谢您的清晰解释。因此,我缺少了
$gql\u query->setAllowLiteral(true);
。我的问题是我不知道“密钥被视为文本”“说实话,由于我的英语水平,我仍然不知道这意味着什么!如果有人能给我一个线索就好了。