2016-09-02 3 views
1

Проблема:mysqli_commit терпит неудачу, когда добавляется оператор выбора

Невозможно хранить данные с MySql хранимой процедуры с mysqli_begin_transaction.

Детали:

Код ниже будет делать простой insert и select с использованием MySQL хранимой процедуры. Код работает нормально безselect заявление. Однако после добавления оператора select он не будет передавать никаких данных, даже если запрос возвращает успех на стороне PHP.

Отрывки (РНР):

$DB_DRRM_SQLI = mysqli_connect("localhost","root","", "sandbox_db"); 
mysqli_begin_transaction($DB_DRRM_SQLI); 

$SQL_QUERY_CODE = "CALL SANDBOX_TEST()"; 
$DB_QUERY = mysqli_query($DB_DRRM_SQLI, $SQL_QUERY_CODE); 


// ERROR REPORTING 
if($DB_QUERY === false) 
{ 
    echo mysqli_error($DB_DRRM_SQLI); 
    mysqli_rollback($DB_DRRM_SQLI); 
} 
else 
{ 
    echo 'success'; 
    mysqli_commit($DB_DRRM_SQLI); 
} 
exit; 

Отрывки (MySql хранимой процедуры):

BEGIN 
    INSERT INTO 
    `sandbox_table` 
    (
     `SOME_STRING` 
    ) 
    VALUES 
    (
     'ABCDEFGHIJKL...' 
    ); 

    SELECT 
     LAST_INSERT_ID() AS INSERTED_ID, 
     'ABCDE...' AS OTHER_PARAMS; 
END 

базы данных (таблица sandbox_table):

  1. RECORD_PRIMARY_ID (Int - Авто инкремент)
  2. SOME_STRING (Varchar - 500 длина)

Spec:

  • PHP версия: 5.6.14
  • 10.1.8- MariaDB
  • Хранение Двигатель: InnoDB

Примечания:

  • Если сделка совершается в хранимой процедуре отлично работает, но мне нужно PHP удалось транзакции для обработки нескольких запросов запросов и ответа в зависимости от результата запроса.
  • (Это может быть возможно последним средством, если нет другого решения, где мне нужно, чтобы преобразовать весь PHP код хранимой процедуры и нужно передать тонн параметра)

Методы Испытано:

  • Пробуется с другой версией PHP версии 7.0.9 с таким же результатом (10.1.16-MariaDB)
  • Протестировано новой базой данных без каких-либо других данных, кроме sandbox_table и выше хранимой процедуры.
  • Протестировано без дополнительных библиотек (проверено с использованием исключительно над фрагментами).
+0

Как вы знаете, что MySQLi фиксация не удалась? –

+0

Почему вы не обрабатываете транзакции в сохраненной процедуре? – Shadow

+0

@ Ваш общий смысл. Он не сохранит запись на 'sandbox_table', для этого образца она должна добавить одну запись со строкой« ABCDEFGHIJKL ... »в поле« SOME_STRING ». – FrozenFire

ответ

0

Решение:

Это было вызвано команд из синхронизации ошибки при mysqli_commit. Кажется, что mysqli не разрешает совершать транзакции, пока запрос открыт, что происходит, если вы добавите оператор select в приведенную выше хранимую процедуру.

Чтобы обработать это, он должен сначала закрыть запрос или поместить запрос в буфер.

Отрывки (PHP):

// SQL Database 
$DB_DRRM_SQLI = mysqli_connect("localhost","root","", "sandbox_db"); 
mysqli_begin_transaction($DB_DRRM_SQLI); 

$SQL_QUERY_CODE = "CALL SANDBOX_TEST()"; 
$DB_QUERY = mysqli_query($DB_DRRM_SQLI, $SQL_QUERY_CODE); 

// ERROR REPORTING 
if($DB_QUERY === false) 
{ 
    echo mysqli_error($DB_DRRM_SQLI); 
    mysqli_rollback($DB_DRRM_SQLI); 
} 
else 
{ 
    // Must free current query result before committing transaction 
    @mysqli_free_result($DB_QUERY); 
    @mysqli_next_result($DB_DRRM_SQLI); 

    if(mysqli_commit($DB_DRRM_SQLI) === false) 
    { 
     echo mysqli_error($DB_DRRM_SQLI); 
    } 
    else 
    { 
     echo 'success'; 
    } 
} 
exit; 
Смежные вопросы