Dopo aver recuperato tutti i risultati nel ciclo di esecuzione, dovresti ottenere il set di righe successivo e quindi chiudere il cursore prima di tentare di eseguire nuovamente la procedura memorizzata. Prova questo:
foreach($data_arr AS $key => $val){
$values = $val;
$stmt->execute();
$res = $stmt->fetchAll();
$stmt->nextRowset(); // NEW: Get the next rowset after fetching your results
$stmt->closeCursor(); // NEW: Close the cursor
}
L'aggiunta davvero importante qui è la chiamata a nextRowSet() . Sotto il cofano, PDO sta restituendo un secondo insieme di righe a cui è necessario accedere prima di eseguire una seconda (e successiva) stored procedure sulla stessa connessione.