Чтение обновленных ссылочных значений в расширении PHP - PullRequest
1 голос
/ 07 мая 2019

Я пишу расширение PHP для отслеживания вызова базы данных и получения данных для расширения mysqli. Для этого я обновил обработчик метода для mysqli :: bind_result и mysqli :: fetch и ввел прокси-методы.

Теперь в методе прокси для mysqli :: bind_result я сохраняю входные ссылки, как показано ниже:

void proxy_mysqli_stmt_bind_result(INTERNAL_FUNCTION_PARAMETERS)
{
    original_bind_result(INTERNAL_FUNCTION_PARAM_PASSTHRU);

    zval *args;
    int argc;
    if (zend_parse_parameters(ZEND_NUM_ARGS(), "z/+", &args, &argc) == FAILURE) 
    {
       return;
    }

    HOOK_MYSQLI_G(args) = args;
    HOOK_MYSQLI_G(argc) = argc;        
}

В прокси-методе mysqli :: fetch я читаю обновленные значения -

void proxy_mysqli_stmt_fetch(INTERNAL_FUNCTION_PARAMETERS)
{
   original_fetch(INTERNAL_FUNCTION_PARAM_PASSTHRU);

   if (Z_TYPE_P(return_value) != IS_TRUE) return;

   zval *args = HOOK_MYSQLI_G(args);
   int  argc = HOOK_MYSQLI_G(argc);

   for (size_t i = 0; i < argc; i++)
   {
       log("%s", Z_STRVAL_P(Z_REFVAL_P(&args[i]));
   }
}

PHP скрипт -

$mysqli = new mysqli($host, $username, $password);
$mysqli->select_db($dbname);

$stmt = $mysqli->prepare($sql);
$stmt->execute();
$stmt->bind_result($id, $firstname, $lastname);

while ($stmt->fetch()) {
    printf ("%s (%s)\n", $firstname, $location);
}

У меня есть две записи в БД для целей тестирования. Вывод моего расширения в лог-файл (неправильный вывод)

Первая запись: id1, name1, фамилия1

Вторая запись:% s (% s) \ n, имя1, фамилия1

если я удалю printf из php-скрипта, вывод будет таким, как и ожидалось -

Первая запись: id1, name1, фамилия1

Вторая запись: id2, name2, фамилия2

В чем здесь проблема? Я храню ссылки на методы bind_result / fetch, почему метод printf обновляет ссылки?

...