PHP - Ciclo para ver si un dato es Numerico

 
Vista:
Imágen de perfil de Kathyu
Val: 1.797
Plata
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Ciclo para ver si un dato es Numerico

Publicado por Kathyu (531 intervenciones) el 05/09/2019 17:37:13
Saludos, tengo el siguiente dilema.

Tengo un formulario que pide factura y numero, tengo un campo varchar en una tabla para ello, este puede aceptar números y letras que vienen del formulario, se me ha pedido que si en el formulario no ingresan nada que yo coloque un numero correlativo.

Fue fácil, hice una funcion getLastDoc() me voy a la tabla, selecciono el ultimo numero y le sumo uno (1), asi si en la tabla no habia nada, me pone 1, y al siguiente le pone 2 y así sucesivamente...
1
2
3
4
5
6
7
8
9
// Datos en la Tabla de la DB
NumDoc
1
2
3
...
25
26
27

El problema me resulta cuando en el campo anterior hay un dato alfanumérico, por ejemplo C-3PO, entonces mi función getLastDoc() no puede sumar uno a mi dato porque este no es numérico, entonces con la función is_numeric compruebo si el dato es numero y le sumo uno, pero que pasa si mi dato es alfanumérico? tengo que hacer un ciclo hasta llegar al ultimo numero puro
1
2
3
4
5
6
7
8
9
10
11
// Datos en la Tabla de la DB
NumDoc
1
2
3
...
25
26
27
RTFM-29
C-3PO

Entonces no encuentro la lógica para el ciclo (while creo) correcto. He hecho pruebas (que terminan en un infinity loop) pero creo que la lógica iría algo así:
1
2
3
4
5
$ultimoNum = ''; // Solo declaro la variable
while (is_numeric($ultimoNum) == FALSE) { // Mientras el resultado de la función is_numeric($ultimoNum) sea FALSO
   $ultimoNum = $querys->getLastDoc()[0]['documento_num']; // Que se meta a la DB y siga trayendo el otro numero que le sigue
}
$ultimoNum = $ultimoNum + 1; // Cuando $ultimoNum sea numérico que le sume uno que el programa continué

Básicamente el primer dato que recorrería seria C-3PO y como no es numérico volvería a ir a la DB, el segundo seria RTFM-29 y volvería a ir a la base, pero el tercero (la tercer vuelta del ciclo) seria 27 entonces le sumaria 1 y mi variable $ultimoNum ahora valdría 28, fácil verdad?

Lastima que no funciona, alguna idea?
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
Imágen de perfil de joel
Val: 2.007
Plata
Ha aumentado 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

Ciclo para ver si un dato es Numerico

Publicado por joel (556 intervenciones) el 05/09/2019 20:16:46
Hola Kathyu, he intentado simular tu código y me ha funcionado... haber si te sirve...
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
 
$valores=["C-3PO", "RTFM-29", 27, 26];
$siguienteValor=0;
 
foreach($valores as $valor) {
    if (is_numeric($valor)) {
        $siguienteValor=$valor+1;
        break;
    }
}
 
echo $siguienteValor;
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 Kathyu
Val: 1.797
Plata
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Ciclo para ver si un dato es Numerico

Publicado por Kathyu (531 intervenciones) el 06/09/2019 17:35:41
Para este caso (que ya había considerado) tendría antes que tener el array de los datos para hacer el ciclo for, pero que pasa si la base tiene dentro de un tiempo muchos datos, seria como que algo tardado buscar en todos los registros solo para hacer un contador automático, por eso había desestimado esta vía aunque es muy valida tambien.
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 Alejandro
Val: 1.840
Plata
Ha disminuido 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

Ciclo para ver si un dato es Numerico

Publicado por Alejandro (594 intervenciones) el 05/09/2019 20:59:08
En MS-SQL seria así
1
SELECT MAX(documento_num)+1 AS LastDocNum FROM tuTabla WHERE ISNUMERIC(documento_num)=1
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
Imágen de perfil de joel
Val: 2.007
Plata
Ha aumentado 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

Ciclo para ver si un dato es Numerico

Publicado por joel (556 intervenciones) el 06/09/2019 07:57:57
Muy bueno Alejandro!!!
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 Kathyu
Val: 1.797
Plata
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Ciclo para ver si un dato es Numerico

Publicado por Kathyu (531 intervenciones) el 06/09/2019 17:40:41
Alejando, este respuesta es muy buena, ahora mi duda es si ISNUMERIC es correcto en MySQL?? porque no me funciona, he probado varias y no son correctas

https://stackoverflow.com/questions/5064977/detect-if-value-is-number-in-mysql
http://www.tufuncion.com/isnumeric-mysql
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 Alejandro
Val: 1.840
Plata
Ha disminuido 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

Ciclo para ver si un dato es Numerico

Publicado por Alejandro (594 intervenciones) el 06/09/2019 17:46:44
¿Quizá una de estas formas?
1
SELECT MAX(documento_num)+1 AS LastDocNum FROM tuTabla WHERE documento_num REGEXP '^[0-9]+$'

1
SELECT MAX(documento_num)+1 AS LastDocNum FROM tuTabla WHERE CONVERT(documento_num, SIGNED INTEGER) IS NOT NULL
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
Imágen de perfil de Kathyu
Val: 1.797
Plata
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Ciclo para ver si un dato es Numerico

Publicado por Kathyu (531 intervenciones) el 06/09/2019 19:20:15
En efecto en los links que puse mencionan esas formas, la primera debo decir que no me funciono y con la segunda tengo lo siguiente

1
2
3
SELECT MAX(documento_num)+1 AS LastDocNum
FROM donacion
WHERE CONVERT(documento_num, SIGNED INTEGER) IS NOT NULL

"Funciona", pero funciona si y solo si mi columna tiene números únicamente, al momento de usar un código como C-3PO me retorna un 1 aunque este ya este en uso y ese campo no puede ser duplicado, así que he llegado a ese impase, aun estoy probando otras sugerencias de los links a ver si se puede.

Alejandro, desde PHP no le encontró forma?


Alejandro y Joel gracias por sus coments, este tema se ha vuelto muy interesante, sera que abuso de ustedes si pido opiniones del TEMA DE HEROKU???
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 Alejandro
Val: 1.840
Plata
Ha disminuido 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

Ciclo para ver si un dato es Numerico

Publicado por Alejandro (594 intervenciones) el 06/09/2019 20:26:23
La idea es que el SELECT te devuelva solo valores numéricos
1
SELECT documento_num  FROM tuTabla WHERE documento_num REGEXP '[0-9]+'
una vez que tienes solo numéricos es obtener el mayor, si no te da con MAX() puedes usar ORDER BY
1
SELECT documento_num  FROM tuTabla WHERE documento_num REGEXP '[0-9]+' ORDER BY documento_num DESC
Ordenados el primer registro seria el maximo, en MS-SQL uso TOP en MySQL se que es LIMIT mas no lo recuerdo bien
1
SELECT documento_num  FROM tuTabla WHERE documento_num REGEXP '[0-9]+' ORDER BY documento_num DESC LIMIT 1
quizá sea necesario convertir el dato del campo a numérico
1
SELECT CONVERT(documento_num, SIGNED INTEGER) AS documento_num  FROM tuTabla WHERE documento_num REGEXP '[0-9]+' ORDER BY documento_num DESC LIMIT 1

En PHP con el ejemplo de @joel y la consulta así:
1
2
3
4
5
6
7
8
$consulta ="SELECT documento_num  FROM tuTabla ORDER BY documento_num DESC"
$query = mysqli_query($conexion,$consulta)
while($row = mysqli_fecth_assoc($query)){
   if(is_numeric($row['documento_num '])){
      $siguienteValor=$row[]+1;
      break;
   }
}

Desconosco Heroku
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 Kathyu
Val: 1.797
Plata
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Ciclo para ver si un dato es Numerico

Publicado por Kathyu (531 intervenciones) el 06/09/2019 22:48:05
Lo voy a seguir probando a ver que tal, con su ultima query me trae un valor alfanumérico y pues vuelvo al inicio, voy a seguir modificando el código y si encuentro solución la compartiré

Gracias a ambos
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 Kathyu
Val: 1.797
Plata
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Ciclo para ver si un dato es Numerico

Publicado por Kathyu (531 intervenciones) el 06/09/2019 22:58:46
ummm no tarde mucho después de todo

1
2
3
4
SELECT documento_num FROM donacion
WHERE documento_num * 0 != documento_num
ORDER BY id DESC
LIMIT 1

Realmente no se como explicar el != documento_num la cosa es que toma el ultimo valor numérico de la columna no importando que sea alfanumérico o no, y si el primer dato que encuentra en toda la tabla es alfanumérico pues pone null y en PHP le sumo 1 y ya puedo iniciar.

Bueno, después de tanto esa seria la solución de encontrar un numero en una columna con varios tipos de datos.


Gracias a ambos de nuevo
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