Hola, voy a tratar de ser lo mas explicit posible.
Tengo un sistema de Ordenes de trabajo que funciona con sesiones, a cada orden de trabajo se le pueden ir agregando productos como con un carrito de compras, hasta aqui todo va bien. Cada producto tiene un codigo que se debe de ir incrementando segun en los ultimos 3 digitos algo asi: 31253301
001
esstos ultimos digitos los toma de un campo de una base de datos mysql, o sea lo toma de la base le incrementa 1, lo guarda en una session:
Código PHP:
$productos = $_SESSION['PRODUCTOS'];
$i=1;
if(!isset($productos))
{
$connector->w_sql = "SELECT * FROM maestro WHERE codigo = '$id_modelo'";
$connector->WMySQLQuery();
$resultado = $connector-> WMySQLResult();
$row = mysql_fetch_array($resultado);
$codigo_inc = $row['folio'] + 1;
switch ($codigo_inc) {
case ($codigo_inc < 10) :
$prefijo = "0";
break;
case ($codigo_inc >9 && $folio < 100) :
$prefijo = "";
break;
}
$codigo = $id_modelo.$prefijo.$codigo_inc;
$productos = array ( array ('id_orden' => $id_orden , 'codigo' => $codigo ,'producto' => $producto, 'id_modelo' => $id_modelo,
'id_cliente' => $id_cliente, 'id_vendedor' => $id_vendedor, 'folio' => $row['folio'], 'color' => $color ));
}
else
{
$connector->w_sql = "SELECT * FROM maestro WHERE codigo = '$id_modelo'";
$connector->WMySQLQuery();
$resultado = $connector-> WMySQLResult();
$row = mysql_fetch_array($resultado);
foreach($productos as $ind => $item) {
if ($item['id_modelo'] == $row['codigo'] && $item['color'] == $row['master'])
{
$i++;
}
}
$codigo_inc = $row['folio'] + $i;
switch ($codigo_inc) {
case ($codigo_inc < 10) :
$prefijo = "0";
break;
case ($codigo_inc >9 && $folio < 100) :
$prefijo = "";
break;
}
$codigo = $id_modelo.$prefijo.$codigo_inc;
array_push($productos, array ('id_orden' => $id_orden , 'codigo' => $codigo ,'producto' => $producto, 'id_modelo' => $id_modelo, 'id_cliente' => $id_cliente, 'id_vendedor' => $id_vendedor, 'folio' => $codigo_inc,'color' => $color));
}
$_SESSION['PRODUCTOS'] = $productos;
El codigo funciona , sin embargo no cambia el numero de folio de la base de datos maestro hasta que no se cierra la orden, esto para evitar que se generen codigos en la base de datos si el usuario decide salirse del sistema sin terminar la orden. hasta aqui todo bien, el problema es si dos usuarios entran al mismo tiempo y los dos deciden cerar el mismo modelo de producto al mismo tiempo, el algoritmo toma el mismo numero de concecutivo de la base de datos y esto podria generar un brinco del concecutivo. me explique?
Alguien tiene una idea de como puedo proteger el uso de este cosecutivo si alguien esta capturando una orden?