"; exit; } // 2.- Variable para comprobar que hay suficientes artículos de TODA la cesta $bien=true; // 3.- Poner el autocommit en false para que sea una transación mysqli_autocommit($bd, false); // 4.- Vamos uno a uno de los artículos de la cesta foreach($carrito as $codigo => $cantidad){ // 5.- Bloquear el stock del artículo en cuestión $orden1="SELECT stock FROM productos WHERE codigo=? FOR UPDATE"; // Prepara la consulta $consulta1=mysqli_prepare($bd,$orden1); //Comprobación de errores if (!$consulta1){ echo "Ha ocurrido el error 1
"; exit; } // Agrega el codigo (entero) a la sentencia como parametro mysqli_stmt_bind_param($consulta1,"i",$codigo); // Ejecuta la consulta preparada (Bloquea el stock del producto correspondientes) mysqli_stmt_execute($consulta1); // Vincula las variables con la consulta preparada para almacenar resultados mysqli_stmt_bind_result($consulta1,$stock); // Obtiene los resultados de una consulta preparada mysqli_stmt_fetch($consulta1); // Cerramos la consulta preparada mysqli_stmt_close ($consulta1); // 6.- Si tiene suficientes artículos para vender if ($stock>=$cantidad) { // 7.- Hacemos el update $orden2="UPDATE productos SET stock=? WHERE codigo=?"; $consulta2=mysqli_prepare($bd,$orden2); if (!$consulta2){ echo "Ha ocurrido el error 2
".mysqli_connect_error().mysqli_connect_errno(); exit; } $quedan=$stock-$cantidad; mysqli_stmt_bind_param($consulta2,"ii",$quedan,$codigo); mysqli_stmt_execute($consulta2); mysqli_stmt_close ($consulta2); } else { // 8.- Si no hay suficientes artículos me chivo $bien=false; break; } } // 9.- Si algo hay mal, rollback. Si todo bien, commit if (!$bien) { mysqli_rollback($bd); echo "

La compra ha sido anulada

"; } else { mysqli_commit($bd); echo "

Has realizado la compra correctamente

"; } mysqli_close($bd); ?>