2016-08-18 4 views
0

Я хочу просто инициализацию \AsyncMysqlConnectionResult $connec; объектНе удается инициализировать AsyncMysqlQueryResult объект

<?hh 

namespace Connection; 

require_once("ini.php"); 

/** 
* Class for execute and fetch query 
*/ 
class MyQuery 
{ 
/** 
* if connection isn't valid recreate pool 
*/ 
private ?\AsyncMysqlConnectionPool $pool; 

/** 
* \AsyncMysqlConnection object, store $conn 
*/ 
private \AsyncMysqlConnection $connec; 

/** 
* \AsyncMysqlQueryReturn object, store return query 
*/ 
private \AsyncMysqlQueryResult $result; 

/** 
* check if $conn object isValid(), if not release 
* connection 
*/ 
public function __construct(\AsyncMysqlConnection $conn) 
{ 
    if ($conn->isValid() == false) 
    { 
     $this->pool = new MyPool(); 
     $this->connec = $this->pool->connect(); 
    } 
    else 
     $this->connec = $conn; 

    $this->result = object; 
} 

/** 
* escape query and execute it 
*/ 
public async function query(string $query): Awaitable<\AsyncMysqlQueryResult> 
{ 
    $query = $this->connec->escapeString($query); 
    echo "Query escape\n"; 

    /* Try to execute the query, if fail display error */ 
    try 
    { 
     $this->result = await $this->connec->query($query); 
     //log request with ini 
    } 
    catch (Exception $e) 
    { 
     echo "Couldn't execute the request, error with message :<br>"; 
     var_dump($e->getMessage()); 
     //log request with fail 
    } 

    echo "Query done succefully\n"; 
    return $this->result; 
} 

/** 
* escape Map array and execute the request 
*/ 
public async function queryf(HH\FormatString<HH\SQLFormatter> $query, array<string> $params): Awaitable<\AsyncMysqlQueryResult> 
{ 
    $i = 0; 

    while ($params[$i++]) 
     $params[$i] = $this->connec->escapeString($params[$i]); 

    /* Try to execute the query, if fail display error */ 
    try 
    { 
     $result = await $this->connec->queryf($query, implode(', ', $params)); 
     //log request with ini 
    } 
    catch (Exception $e) 
    { 
     echo "Couldn't execute the request, error with message :<br>"; 
     var_dump($e->getMessage()); 
     //log request with fail 
    } 

    echo "Query done succefully\n"; 
    return $this->result; 
} 
} 

newtype AsyncMysqlConnectionResult = object; 
newtype FormatString<T> = string; 

async function simple_query(\AsyncMysqlConnection $conn): Awaitable<Vector> 
{ 
    $connec = new MyQuery($conn); 
    $ret = await $connec->query('SELECT * FROM users'); 
    return $ret->vectorRows(); 
} 

function run_query(\AsyncMysqlConnection $conn): void 
{ 
    $r = \HH\Asio\join(simple_query($conn)); 
    var_dump($r); 
} 

run_query ($ сопп);

Для этого объекта я использую класс https://docs.hhvm.com/hack/reference/class/AsyncMysqlConnectionPool/connect/ и метод connect() для этого: \ AsyncMysqlConnectionResult $ connec object.

я не могу найти способ для инициализации этого переменного типа, я пытаюсь создать Newtype AsyncMysqlConnectionResult = объект, но filechecker вернуть меня: Unbound name: Connection\object (an object type)

+0

Не совсем ответ на ваш вопрос, но в документации есть несколько примеров: https://docs.hhvm.com/hack/async/examples#accessing-mysql –

+0

Спасибо за ссылку, я много читал документацию hhvm, но не эту страницу. Я застрял в другой проблеме с HH \ FormatString типа функции queryf, я не могу отправить тип строки в эту функцию, я не знаю, почему у них есть тип complexe .... – bbichero

+0

queryf требуется буквальная строка, так что заполнители строк форматирования могут быть статически проверены на тип. Информация здесь: https://docs.hhvm.com/hack/reference/class/AsyncMysqlConnection/queryf/ –

ответ

0

Это единственный способ найти переписать метод queryf().

public async function queryf($query, array<int, string> $params): Awaitable<\AsyncMysqlQueryResult> 
{ 
    $result = ""; 

    /* Try to execute the query, if fail display error */ 
    try // execute query 
    { 
     $result = await $this->connec->queryf($query, implode(', ', $params)); 

     // If log_request === TRUE log request with ini 
     if ($this->log_request === TRUE) 
      await $this->logRequest($query, 0); 
    } 
    catch (Exception $e) // If the query can't be execute display error 
    { 
     echo "\nCouldn't execute the request, error with message :<br>\n"; 
     var_dump($e->getMessage()); 
     //log request with fail 

     await $this->logRequest((string)$query, -1); 
    } 
    return (object)$result; 
} 

У меня нет ошибки, и все работает нормально. Если у кого-то есть лучшее и решение, я здесь.

0

Вместо того, чтобы хранить результат в классе, почему ваши методы запроса просто не возвращают результат. Например:

public async function query(string $query): Awaitable<\AsyncMysqlQueryResult> 
{ 
    $query = $this->connec->escapeString($query); 
    return await $this->connec->query($query); 
} 

или если вы действительно хотите, чтобы результат был сохранен в классе, сделайте его нулевым. Это позволит вам не устанавливать его в конструкторе и устанавливать его только после того, как запрос был сделан.

private ?\AsyncMysqlQueryResult $result; 
+0

Я не вынужден хранить эту переменную в классе, но я могу " t отправить запрос в строку, его прототип: 'public function queryf (HH \ FormatString $ query, ... $ args): Awaitable {}' – bbichero

+0

queryf требует строкового литерала – alexriedl