我在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...
我的数据存储控制台视图:
在将WHERE __key__ = KEY('notification', 1410611039)
追加到query_string之前,一切都很好。
答案 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