Ошибка подготовленных операторов Cassandra с драйвером datastax php

Я сталкиваюсь со странной ошибкой с подготовленными заявлениями с драйвером DataStax php 1.0.0-rc и Cassandra 2.2.3. Я получил исключение в этой строке:

$statement = $this->session->prepare("SELECT ? FROM ? WHERE ? = ?");

Я вижу эту ошибку:

"error_code":33562624
"error_message":"Bind variables cannot be used for keyspace names"

Ниже заглушка класса используется для общения с Кассандрой:

class ClsCassandra extends ClsDbObject
{
private $hostname="";
private $username="";
private $password="";
private $keyspace="";
private $poi_table="";
private $poi_table_key_field="";
private $poi_table_content_field="";

private $cluster = NULL;
private $session = NULL;

private $threads = 1;

function __construct()
{
...
...
//
// i set up all the properties above
//
...
...
}

public function runQuery(&$error)
{
try
{
$this->cluster   = Cassandra::cluster()
->withContactPoints($this->hostname)
->withCredentials($this->username, $this->password)
->withIOThreads($this->threads)
->build();

$this->session = $this->cluster->connect($this->keyspace);

// error on next line...
$statement = $this->session->prepare("SELECT ? FROM ? WHERE ? = ?");
$results = $this->session->execute($statement, new Cassandra\ExecutionOptions(array(
'arguments' => array($this->poi_table_content_field, $this->poi_table, $this->poi_table_key_field, $keypattern)
)));

}
catch(Cassandra\Exception $ce)
{
$error->setError($ce->getCode(), $ce->getMessage(), $ce->getTraceAsString());
$this->log(LOG_LEVEL, $error->getErrorMessage(), __FILE__, __LINE__, __CLASS__);
return false;
}
return true;
}

...
...
...
}

Если я использую Simple Statemetn со стандартным запросом выбора, вместо этого он работает.

Какие-либо предложения?

2

Решение

Вы видите эту ошибку, потому что вы можете только связать переменные с предложением WHERE. Механизм подготовленных операторов — это не просто прославленный форматировщик строк. В нем есть правила о том, что может и не может быть связано, и как вы должны связывать вещи, чтобы устранить двусмысленность при отправке в Кассандру.

Вам нужно будет попробовать что-то вроде этого:

$statement = $this->session->prepare(
"SELECT key1, key2, col1, col2 FROM yourKeyspaceName.yourTableName WHERE key1 = ? AND key2 = ?");
$results = $this->session->execute($statement, new Cassandra\ExecutionOptions(array(
'arguments' => array($key1,$key2)
)));
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]