Я пишу расширение 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 обновляет ссылки?