PHP - Problema al converir en entero una cadena de caractéres de un vector.

 
Vista:
sin imagen de perfil

Problema al converir en entero una cadena de caractéres de un vector.

Publicado por forero (2 intervenciones) el 15/11/2016 16:15:14
Buenas tardes,

Estoy haciendo una revisión de una parte de un programa en php en el que actualmente se generan códigos de cliente que son una cadena de caracteres de 6 números (no hay letras ni símbolos). Por ejemplo. 080001, 080002, 280004, etc.

Ahora queremos que los nuevos códigos sean una cadena sea de 2 letras + 4 números. Por ejemplo, ES0001, ES0002, PT0001, etc.

El código del programa funcional que lee de la base de datos los códigos existentes y busca huecos vacíos (viene de un sistema que se escogía el código al gusto del que creaba el cliente) es:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
$codclientes = $this->db->select("SELECT ".$this->db->sql_to_int('codcliente')." AS cod FROM ".$this->table_name." ORDER BY cod ASC;");
    if($codclientes)
    {
        foreach($codclientes as $n)
        {
            if( intval($n['cod']) > $num)
            {
                $encontrado = TRUE;
                break;
            }
            else
                $num++;
        }
    }
    else
    {
        return sprintf('%06s',  intval($num));
    }
}
    if($encontrado)
    {
       return sprintf('%06s', intval($num));
    }
    else
    {
        if ($num<$max)
        {
           return sprintf('%06s', intval($num));
        }
        else
        {
            return sprintf('%06s','NO_HAY');
        }
    }

Donde codclientes es un array que almacena cada uno de los códigos existentes (por ejemplo codclientes=("080001"," 080002", "280004",...).

Mi revisión es la siguiente. Como tengo que eliminar los dos primeros caracteres, la búsqueda en la base de datos la he reemplazado por:
1
$codclientes = $this->db->select("SELECT ".$this->db->sql_to_int('codcliente')." AS cod FROM ".$this->table_name." WHERE codcliente REGEXP '^$rest' ORDER BY cod ASC;")

Donde $rest es igual a los dos caracteres a eliminar (por ejemplo "ES"). El resultado probado directamente en mysql es correcto y devuelve ("ES0001", "ES0002")

Y simplemente he sustituido:
1
intval($n['cod']) > $num

por:
1
intval(substr($n['cod'],-4)) > $num

Donde substr me deja simplemente los 4 últimos caracteres que son números. Por ejemplo 0001.

Pues en vez de devolver un 1 (en el ejemplo), devuelve siempre 0.

Curiosamente, si en vez de
1
substr($n['cod'],-4)
pongo como prueba
1
substr("ES0001",-4)
, lo hace correctamente.

Deduzco que es un problema de cómo interpreta substr el array pero por más que he buscado no he encontrado nada que me de una pista de como resolver el problema.

¿Alguna idea?

Muchas gracias de antemano por vuestra ayuda.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

Problema al converir en entero una cadena de caractéres de un vector.

Publicado por Debugsito (18 intervenciones) el 15/11/2016 23:58:41
Hola, me parece que estas recibiendo otro tipo de variable en $n,
puedes poner
1
var_dump($n); exit;
antes de
1
if( intval($n['cod']) > $num)
y copiar aquí el resultado?
Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de kip
Val: 2.944
Oro
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Problema al converir en entero una cadena de caractéres de un vector.

Publicado por kip (877 intervenciones) el 16/11/2016 01:02:38
Hola, eso se debe a que cuando haces el substr aun te esta tomando algun otro valor que intval no puede procesar, estas seguro de que aquella query te trae los codigos como los colocas 'ES0001' ?

Si estas seguro entonces intentalo asi, usando expresiones regulares, de todas formas con la expresion que esta mas abajo tomaras solo los ultimo 4 digitos numericos de tu cadena:


1
2
3
4
5
<?php
 
preg_match('/\d{4}$/', 'es0099', $match);
 
if (intval($match[0]) > 1)

Pruebalo y nos cuentas.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problema al converir en entero una cadena de caractéres de un vector.

Publicado por forero (2 intervenciones) el 16/11/2016 15:42:42
Hola @kip y @debugsito.

En otro foro ya me dieron una solución.

El problema está en la consulta y en el REGEXP. Si en vez de:

1
$codclientes = $this->db->select("SELECT ".$this->db->sql_to_int('codcliente')." AS cod FROM ".$this->table_name." WHERE codcliente REGEXP '^$rest' ORDER BY cod ASC;");

Uso:

1
$codclientes = $this->db->select("SELECT codcliente AS cod FROM ".$this->table_name." WHERE codcliente LIKE '$rest%' ORDER BY cod ASC;");

El programa funciona correctamente

Pero curiosamente, atacando directamente la base de datos con REGEXP saca un resultado coherente.

http://imgur.com/Elb2VtO

Gracias a los dos por vuestra ayuda.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Problema al converir en entero una cadena de caractéres de un vector.

Publicado por Debugsito (18 intervenciones) el 16/11/2016 15:54:49
Hola, que interesante. Gracias por la info,
Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar