Php mysqli_stmt_execute() возвращает false без сообщений об ошибках в mysql v8.0.36-28Php

Кемеровские программисты php общаются здесь
Anonymous
Php mysqli_stmt_execute() возвращает false без сообщений об ошибках в mysql v8.0.36-28

Сообщение Anonymous »

Мой хостинг (Siteground) только что перенес MySql с версии 5.7 на версию 8.0.
Теперь некоторые части моего кода больше не работают.
Версия PHP (v7.4) не изменилась.
Нарушающий элемент включает вызов mysqli_stmt_execute(), который теперь генерирует исключение.
Вот мой исходный код (который отлично работал под MySql v5.7): -

Код: Выделить всё

if (!mysqli_stmt_execute($stmt))
{
error_log("mysql error: " . mysqli_error($mysqli));
error_log("prep_bind_exec_2(): mysqli_stmt_execute returned false");
return false;
}

В MySql v8.0 этот же код теперь выдает исключение: -

Код: Выделить всё

Incorrect arguments to mysqld_stmt_execute in
Stack trace:
mysqli_stmt_execute(Object(mysqli_stmt))
prep_bind_exec_2(Object(mysqli), '  SELECT DISTIN...', 'ssssssdd', '2', '1', '2', '3', '4', '4', 0, 1000000000)

На странице документации PHP я вижу, что в процедурном стиле синтаксис mysqld_stmt_execute() следующий: -

Код: Выделить всё

mysqli_stmt_execute(mysqli_stmt $statement, ?array $params = null): bool
Второй необязательный аргумент $params, очевидно, необходим только начиная с PHP версии 8.1.
Тем не менее, я изменил свой код следующим образом, чтобы увидеть, может ли это иметь значение:-

Код: Выделить всё

if (!mysqli_stmt_execute($stmt, ['2','1','2','3','4','4','0','1000000000']))
{
error_log("mysql error: " . mysqli_error($mysqli));
error_log("prep_bind_exec_2(): mysqli_stmt_execute returned false");
return false;
}

Результат: mysqli_stmt_execute() теперь возвращает false, но mysqli_error() возвращает пустую строку.
Итак, теперь я немного озадачен, поскольку нахожусь не знаю, нужен ли mysqli_stmt_execute() массив $params или нет.
SQL выглядит следующим образом: -

Код: Выделить всё

SELECT DISTINCT CONTACT.contact_id, CONTACT.address_region, CONTACT.cost_to_request
FROM CONTACT
LEFT JOIN STAKEHOLDER       ON CONTACT.contact_id = STAKEHOLDER.contact_id
LEFT JOIN PRODUCT_RANGE     ON CONTACT.contact_id = PRODUCT_RANGE.contact_id
LEFT JOIN CAPABILITY        ON CONTACT.contact_id = CAPABILITY.contact_id
LEFT JOIN PRODUCT_FEATURE   ON CONTACT.contact_id = PRODUCT_FEATURE.contact_id
WHERE
CONTACT.active = '1'
AND STAKEHOLDER.role_id IN (?)
AND CAPABILITY.technology_id IN (?,?,?,?)
AND PRODUCT_RANGE.product_type_id IN (?)
LIMIT ?,?

со связанными параметрами (заполнителями) следующим образом:-

Код: Выделить всё

params=["2","1","2","3","4","4",0,1000000000]
Есть идеи, что я делаю неправильно?

Подробнее здесь: https://stackoverflow.com/questions/784 ... mysql-v8-0

Вернуться в «Php»