簡體   English   中英

datastax php 驅動程序的 Cassandra Prepared Statements 錯誤

[英]Cassandra Prepared Statements error with datastax php driver

我在使用 DataStax php 驅動程序 1.0.0-rc 和 Cassandra 2.2.3 的 Prepared Statements 時遇到了奇怪的錯誤。 我在這條線上得到了一個例外:

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

我看到這個錯誤:

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

下面是用於與 Cassandra 通信的類的存根:

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 與標准選擇查詢一起使用,則它可以工作。

有什么建議?

您看到此錯誤是因為您只能將變量綁定到 WHERE 子句。 准備好的語句機制不僅僅是一個美化的字符串格式化程序。 它有關於什么可以綁定和什么不能綁定的規則,以及在發送到 Cassandra 時你必須如何綁定以消除任何歧義。

你需要嘗試這樣的事情:

$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)
    )));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM