Могу ли я указать, какие поля я хочу получать из запроса при использовании HandlerSockets?

Могу ли я указать, какие поля я хочу получать из запроса при использовании HandlerSockets?

Вот мой пример таблицы

CREATE TABLE pushed_media
(
    user_id BINARY(12) NOT NULL,
    story_id BINARY(12) NOT NULL,
    sent_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
    PRIMARY KEY ( user_id, story_id )
);

PHP-код, который запрашивает это ниже

$hs = new HandlerSocket($host, $port);
if (!($hs->openIndex(1, $dbname, $table, HandlerSocket::PRIMARY, 'user_id,story_id,sent_date')))
{
    echo $hs->getError(), PHP_EOL;
    die();
}

$user_id = pack('H*', substr(md5('ruslan'), 0, 24));
$story_id = pack('H*', substr(md5('story1'), 0, 24));

$retval = $hs->executeSingle(1, '=', array($user_id, $story_id), 1, 0);

Все что мне нужно это sent_date потому что я уже знаю два других значения. Можно ли их снова не передавать по сети?

2 ответа

Решение

Вы можете указать поля, которые вы хотите получить из запроса, просто указав их в field параметр метода openIndex.
Как вы можете прочитать здесь, этот код:

<?php
$hs->openIndex(1, 'db', 'table', 'PRIMARY', 'k,v');
$ret = $hs->executeSingle(1, '>=', array('K1'));
var_dump($ret);
?>

Эквивалентно следующему оператору SQL:

SELECT k,v FROM table WHERE k >= 'K1' LIMIT 1

Вернемся к вашему примеру, если вы хотите прочитать только sent_date значение поля:

$hs = new HandlerSocket($host, $port);
if (!$hs->openIndex(1, $dbname, $table, myHandlerSocket::PRIMARY, 'sent_date')) {
    die($hs->getError());
}

$user_id  = pack('H*', substr(md5('ruslan'), 0, 24));
$story_id = pack('H*', substr(md5('story1'), 0, 24));

$retval = $hs->executeSingle(1, '=', array($user_id, $story_id), 1, 0);
die("<pre>".print_r($retval,true)."</pre>");

Полученный результат должен быть примерно таким:

Array
(
    [0] => 0
    [1] => 1
    [2] => 2013-02-01 22:18:39
)

Документация протокола HandlerSocket гласит:

Как только запрос 'open_index' выполнен, плагин HandlerSocket открывает указанный индекс и сохраняет его открытым до тех пор, пока клиентское соединение не будет закрыто. Каждый открытый индекс идентифицируется . Если уже открыт, старый открытый индекс закрывается. Вы можете открыть одну и ту же комбинацию несколько раз, возможно, с разными <столбцами>. Для эффективности сохраняйте небольшим, насколько это возможно.

Как насчет executeMulti?

$retval = $hs->executeMulti(array(
  array(1, '=', array($user_id), 1, 0),
  array(2, '=', array($story_id), 1, 0),
));
Другие вопросы по тегам