Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Incrementar digito si nº registros mayor o igual y repetir funcion

Estas en el tema de Incrementar digito si nº registros mayor o igual y repetir funcion en el foro de PHP en Foros del Web. Buenos Dias. Quiero dar las gracias anticipadas a cualquier persona que pueda echarme una mano u orientarme sobre este tema. Estoy con un proyecto, el ...
  #1 (permalink)  
Antiguo 25/09/2014, 02:11
 
Fecha de Ingreso: octubre-2013
Ubicación: Madrid
Mensajes: 53
Antigüedad: 11 años, 1 mes
Puntos: 1
Incrementar digito si nº registros mayor o igual y repetir funcion

Buenos Dias.

Quiero dar las gracias anticipadas a cualquier persona que pueda echarme una mano u orientarme sobre este tema.

Estoy con un proyecto, el cual, devuelve una URL corta con el siguiente código.

Código PHP:
<?php

substr
(str_shuffle('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'), 05); // Donde 5 es la cantidad de digitos que cogerá cada vez.

?>
Lo que quiero hacer es que empiece a dar URLs desde 2 dígitos y vaya aumentando los digitos segun los registros que haya en la base de datos. Según he calculado con permutaciones, en total tiene 62 caracteres para recoger, con lo que con 2 dígitos habria un total de 1891 combinaciones posibles si la calculadora no falla, con 3 digitos habria 37820 combinaciones posibles. Lo que necesito es, cada vez que se solicite una URL, contar el numero de registros que hay en la tabla y si es inferior o igual a 1891 que asigne "2" al substr. y continuar así... Si los registros son de 1892 a 37820 asignar "3" al substr.

Esto lo quiero poner el práctica con lo siguiente, pero necesito saber antes si es viable, es una locura o directamente no es posible.

Combinado con lo anterior y despues de ello, necesitaria comprobar si la URL que obtendré existe o no en la base de datos. Si no existe que la guarde y si existe que vuelva a hacer la funcion hasta dar con una que no exista y pueda guardarla.

Mi mayor preocupacion es lo siguiente, dado que selecciona los caracteres aleatoriamente, si cuando por ejemplo este cerca de los 1891 registros con 2 digitos, y solo quedan 2 URLs posibles, va a estar media hora y a sobrecargar el servidor hasta dar con las 2 urls que faltan...

El código que tengo hasta ahora es este, claro esta, me faltan estas dos cosas, pero antes me gustaria saber si se puede hacer, es viable y alguna noción de como empezar.

Código PHP:
<?php

require_once("include/connect.php");

$lurl $_GET['lurl'];
$surl substr(str_shuffle('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'), 05);
date_default_timezone_set("Europe/Madrid");
$date date("d/m/Y");
$hits "1";

if (
strlen($lurl) && filter_var($lurlFILTER_VALIDATE_URL)) {

mysql_query("INSERT INTO wst_uss (wst_lurl, wst_surl, wst_date, wst_hits) VALUES

(
'"
.addslashes($lurl)."',
'"
.$surl."',
'"
.$date."',
'"
.$hits."'
)

"
);

header('Location: shorted.php?lurl='.$lurl.'&surl='.$surl);

}

else {

header('Location: errordocs/wrong-url.php');
        
}

mysql_close();

?>
Mis nociones de PHP y mySQL son básicas, por eso os pido consejo. Esto que os digo puede hacerse? Es viable o va a hacer que se sobrecargue el servidor? Si es así hay alguna otra manera de hacerlo sin que ocurra esto?


Mil gracias de antemano.
Un Saludo.
  #2 (permalink)  
Antiguo 25/09/2014, 07:08
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 8 meses
Puntos: 2534
Respuesta: Incrementar digito si nº registros mayor o igual y repetir funcion

Es posible, y no es una locura: es una tontería.

¿Por qué?

De entrada el "algoritmo" es bastante fragil, str_shuffle() podría llegar a repetir la misma secuencia de letras y entonces tendrías que hacer un loop() para descartar duplicados, y a la vez comparar en la BD, etc.

¿No te parece demasiado desperdicio de procesamiento?

Ir y venir de la BD, hacer loops, y luego si se acabaron las posibilidades, incrementar la cantidad de letras a comparar y repetir todo de nuevo, cada vez, siempre.

Usa tu sentido común.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 25/09/2014, 08:18
 
Fecha de Ingreso: octubre-2013
Ubicación: Madrid
Mensajes: 53
Antigüedad: 11 años, 1 mes
Puntos: 1
Respuesta: Incrementar digito si nº registros mayor o igual y repetir funcion

Ante todo, gracias por tu respuesta.

Hombre, una tontería quizá para quien sea entendido, para mi, que como decía en mi mensaje anterior, tengo nociones básicas, me parece algo más complicado aunque tenga perfectamente claro, usando mi sentido común, como debe hacerse y lo que tiene que hacer exactamente el "algoritmo".

Entiendo que si se puede hacer, pero no entiendo a que te refieres con "¿No te parece demasiado desperdicio de procesamiento?".

Gracias de nuevo.
  #4 (permalink)  
Antiguo 25/09/2014, 10:28
 
Fecha de Ingreso: octubre-2013
Ubicación: Madrid
Mensajes: 53
Antigüedad: 11 años, 1 mes
Puntos: 1
Respuesta: Incrementar digito si nº registros mayor o igual y repetir funcion

Hola de nuevo.

He estado trasteando y he sacado bastante, lo que no estoy seguro de que este bien... Ni bien ordenado. Lo que he observado es que al comprobar si existe el registro en la base de datos da igual que se ponga "x1aBd" que "X1AbD" puesto que no distingue entre mayúsculas y minúsculas. Hay alguna forma de hacer que haga distinción? es decir, case sensitive?

Este es el codigo que tengo hasta ahora.

Código PHP:
<?php

require_once("include/connect.php");

$range "0";
$lurl $_GET['lurl'];
date_default_timezone_set("Europe/Madrid");
$date date("d/m/Y");
$hits "1";
$regcountquery "SELECT count(*) FROM wst_uss"//cuento los registros de la table
$regcountresult mysql_query($regcountquery); 
$regcountshow mysql_fetch_array($regcountresult);
$regcount $regcountshow[0];

if (
$regcount <= "5") { $range "2"; } //segun los registros, selecciono x o y dígitos
if ($regcount >= "6" && $regcount <= "10") { $range "3"; }
if (
$regcount >= "11" && $regcount <= "20") { $range "4"; }

function 
getsurl() {

    
$surl substr(str_shuffle('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'), 0$range); //esto lo he convertido en funciona para poder llamarla, no se si esta bien.

}

getsurl(); //llamo a la función para obtener la short url.

if (strlen($lurl) && filter_var($lurlFILTER_VALIDATE_URL)) {

$existquery "SELECT wst_surl FROM wst_uss WHERE wst_surl='$surl'";
$existqueryresult mysql_query($existquery); //compruebo si la short url generada existe o no
$exist mysql_num_rows($existqueryresult);

if (
$exist ) { //sino existe inserto en la db

mysql_query("INSERT INTO wst_uss (wst_lurl, wst_surl, wst_date, wst_hits) VALUES

(
'"
.addslashes($lurl)."',
'"
.$surl."',
'"
.$date."',
'"
.$hits."'
)

"
);

}

else {

getsurl(); //si existe, repito la función, tampoco estoy seguro de que sea correcto.

}

header('Location: shorted.php?lurl='.$lurl.'&surl='.$surl);

}

else {

header('Location: errordocs/wrong-url.php');
        
}

mysql_free_result($regcountresult);
mysql_free_result($existqueryresult);
mysql_close();

?>
Agradezco cualquier aporte.
Muchísimas gracias.
  #5 (permalink)  
Antiguo 26/09/2014, 01:15
 
Fecha de Ingreso: octubre-2013
Ubicación: Madrid
Mensajes: 53
Antigüedad: 11 años, 1 mes
Puntos: 1
Respuesta: Incrementar digito si nº registros mayor o igual y repetir funcion

Hola de nuevo.

Creo que lo he logrado con do-while... Pero no se si esta bien ordenado el código, entre otras cosas, porque me salta un error en el "else" despues de usar "while". No se si es correcto usarlo así, en el manual de php.net no he encontrado ningun ejemplo para usar ese con do-while. Puede alguien, por favor, echarle un vistazo a este código?

Código PHP:
<?php 

require_once("include/connect.php"); 

$lurl $_GET['lurl']; // URL original
date_default_timezone_set("Europe/Madrid");
$date date("d/m/Y");
$hits "1";

function 
getsurl() {

$range "0"// Asigno rango "0"

$regcountquery "SELECT count(*) FROM wst_uss"// Cuento los registros de la tabla 
$regcountresult mysql_query($regcountquery);  
$regcountshow mysql_fetch_array($regcountresult); 
$regcount $regcountshow[0];

if (
$regcount <= "5") { $range "2"; } // Segun los registros, selecciono rango para X o Y dígitos 
if ($regcount >= "6" && $regcount <= "10") { $range "3"; } 
if (
$regcount >= "11" && $regcount <= "20") { $range "4"; } 

$surl substr(str_shuffle('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'), 0$range); // Obtengo "surl"

$existquery "SELECT wst_surl FROM wst_uss WHERE wst_surl='$surl'"
$existqueryresult mysql_query($existquery); // Compruebo si la "surl" generada existe o no 
$exist mysql_num_rows($existqueryresult);

}

if (
strlen($lurl) && filter_var($lurlFILTER_VALIDATE_URL)) { // Si la URL original es válida

do { // Ejecuto la función...
    
getsurl();
} while (
$exist ); // ...mientras "surl" exista en la DB

else { // Si no existe...

mysql_query("INSERT INTO wst_uss (wst_lurl, wst_surl, wst_date, wst_hits) VALUES 


'"
.addslashes($lurl)."', // ...inserto en la DB 
'"
.$surl."', 
'"
.$date."', 
'"
.$hits."' 


"
); 

header('Location: shorted.php?lurl='.$lurl.'&surl='.$surl); // Redirijo a pagina "Completado"

}

else { 
// Si la URL original no es válida...

header('Location: errordocs/wrong-url.php'); // ...redirijo a la pagina "Error"
         
}

mysql_free_result($regcountresult); 
mysql_free_result($existqueryresult); 
mysql_close(); 

?>
Muchas Gracias.
Un Saludo.
  #6 (permalink)  
Antiguo 26/09/2014, 02:58
 
Fecha de Ingreso: septiembre-2014
Mensajes: 180
Antigüedad: 10 años, 3 meses
Puntos: 14
Respuesta: Incrementar digito si nº registros mayor o igual y repetir funcion

Hola,

No sé si al final has resuelto lo de la consulta que no distingue entre mayúsculas y minúsculas. Si no lo has hecho prueba a cambiar tu consulta por esta:

SELECT wst_surl FROM wst_uss WHERE wst_surl LIKE BINARY '$surl'

A ver si así te funciona. Un saludo!
  #7 (permalink)  
Antiguo 26/09/2014, 11:19
 
Fecha de Ingreso: octubre-2013
Ubicación: Madrid
Mensajes: 53
Antigüedad: 11 años, 1 mes
Puntos: 1
Respuesta: Incrementar digito si nº registros mayor o igual y repetir funcion

Hola json.

Muchísimas gracias por tu respuesta.
No lo he solucionado aun, y con lo que me dices me devuelve el siguiente warning:

Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in

Aun así agradezco mucho tu ayuda. Yo sigo probando.
  #8 (permalink)  
Antiguo 26/09/2014, 12:39
 
Fecha de Ingreso: octubre-2013
Ubicación: Madrid
Mensajes: 53
Antigüedad: 11 años, 1 mes
Puntos: 1
Respuesta: Incrementar digito si nº registros mayor o igual y repetir funcion

Hola de nuevo.

Llevo probando toda la tarde el código y bueno... No saca ningún error e inserta todo en la base de datos menos la "surl", posteriormente lleva a la página de confirmación pero sin ningun valor puesto que no obtiene la "surl" creo que debe haber algun problema con la función, la he probado por partes, una a una, y con ninguna funciona. En que me estoy equivocando?

Código PHP:
<?php

function getsurl() {

$regcountquery "SELECT count(*) FROM wst_uss";
$regcountresult mysql_query($regcountquery);  
$regcountshow mysql_fetch_array($regcountresult); 
$regcount $regcountshow[0];

if (
$regcount <= "5") { $range "2"; }
if (
$regcount >= "6" && $regcount <= "10") { $range "3"; } 
if (
$regcount >= "11" && $regcount <= "20") { $range "4"; } 

$surl substr(str_shuffle('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'), 0$range);

$existquery "SELECT wst_surl FROM wst_uss WHERE wst_surl = '$surl'"
$existqueryresult mysql_query($existquery);
$exist mysql_num_rows($existqueryresult);

}

?>
Y la llamo así...

Código PHP:
do {
    
getsurl();
} while (
$exist 0); 
  #9 (permalink)  
Antiguo 27/09/2014, 08:57
 
Fecha de Ingreso: octubre-2013
Ubicación: Madrid
Mensajes: 53
Antigüedad: 11 años, 1 mes
Puntos: 1
Respuesta: Incrementar digito si nº registros mayor o igual y repetir funcion

Hola de nuevo.

Ya lo tengo solucionado.
Solo había que ordenar el código correctamente.

Gracias de nuevo a json por su ayuda, la forma correcta para hacer case sensitive la consulta es:

Código PHP:
SELECT wst_surl FROM wst_uss WHERE BINARY wst_surl '$surl' 
Asi si que funciona correctamente.
  #10 (permalink)  
Antiguo 29/09/2014, 03:27
 
Fecha de Ingreso: septiembre-2014
Mensajes: 180
Antigüedad: 10 años, 3 meses
Puntos: 14
Respuesta: Incrementar digito si nº registros mayor o igual y repetir funcion

Hola!

Me alegro que haya funcionado, se ve que me colé al poner el orden de "BINARY" jeje. Un saludo!

Etiquetas: funcion, igual, incrementar, mayor, mysql, registro, registros, repetir, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:40.