Numero Aleatorio en PHP o MYSQL pero que NO se repita nunca

Iniciado por MakiaResc, 13 Marzo 2008, 23:58 PM

0 Miembros y 1 Visitante están viendo este tema.

MakiaResc


Miren lo que pasa es lo siguiente, quiero que en php o mysql se genere un numero y que me lo muestre en un textarea, bueno pero aqui lo que se me hace dificil es que no tengo ni idea de como hacerlo....

Se que siempre decimos en internet, primero busca y luego pregunta asi que ya lo hice y aqui voy a dar la informacion que puede encontrar y que un user le funciono pero yo no se ni como....

En si busco que se genere un numero  el cual pueda mostrar en un echo con php ya posteriormente esto se edita, pero quiero que este numero no se vuelva a repetir nunca de los nuncas.

Voy a poner un ejemplo de lo que busco que pase, haber si alguien me ayuda.....

Ejemplo:



No. de Pedido #

Titulo:

Nombre:

Descripcion:



En si esto es un formulario, pero en el numero de pedido es donde quiero que aparezca un numero aleatorio de 4 o 5 cifras ya sea numerico o alfanumerico, es por ello que el numero de pedido debe ser imposible de repetirce....

Si alguien sabe como hacer esto ayudenme se los agradecere bastante.

Esta es la info que encontre en internet la cual se que es SQL pero no se como crear la tabla u/o usarlo.

function nuevorand($lista) {
     srand ((double) microtime( )*1000000);
     do {
        $random_number = rand(0,1000);
    } while (in_array($random_number,$lista));
    return $random_number;
}

$usados = array();
$busqueda= mysql_query("SELECT numsocio FROM usuarios");
while($fila = mysql_fetch_assoc($busqueda)) {
    $usados[] = $fila["numsocio"];
}
$numsocio = nuevorand($usados); 


Supongo que esto es lo que se necesita para hacer la conexión a la base de datos.

<?
$direccion = 'localhost';
$usuario = 'usuario';
$password = 'password';
$db=mysql_connect($direccion,$usuario,$password);
mysql_select_db("nombre_de_la_db",$db);
?>


De antemano gracias y eespero sus respuestas




Ertai

Si la felicidad se comprara, entonces el dinero sería noble.


void rotar_by_ref(int& a, int& b) {
   /* Quien dijo que no se podia sin una variable temporal? */
   *a = *a ^ *b;
   *b = *a ^ *b;
   *a = *a ^ *b;
}

MakiaResc

Gracias por tu respuesta, y... disculpa mi ignorancia, pero que es lo que tendria que hacer....?

Tendria que crear una tabla en mysql ¿Como?
¿Luego como hago para mostrar el valor que arroje el mysql?

De antemano te agradezco tu pronta respuesta y espero me puedas ayudar mientras buscare info de lo que acabas de mencionar....

Gracias por tu respuesta y espero puedas seguir ayudandome

Azielito

#3
Pues que hacer un campo y le dices que sera autoincrement xD

o sea
Código (sql) [Seleccionar]
CREATE TABLE `DB`.`tabla` (
`ped_id` INT( 5 ) NOT NULL AUTO_INCREMENT PRIMARY KEY
)

donde DB es la base de datos
tabla es la tabla ¬¬
ped_id es el nombre dcel campo
5 es la longitud del campo
NOT NULL siempre tendra que tener algo ¬¬
AUTO_INCREMENT es el que hace la magia de auto incrementar xD
PRIMARY KEY le dice que es la llave primaria, para eso de las relaciones en tablas y demas te ayuda bastante

ahora, quieres una longitud en el id del pedido entonces podrias usar el str_pad de php, o sea, la funcion
Código (php) [Seleccionar]
<?php
str_pad
(); // <- click para mas info
$cadena_original "el id del registro actual"
$pedidoNo str_pad($cadena_original5"0"STR_PAD_LEFT);

?>



y listo, tendras un

"00001"
"00002"
[...]
"00526"
y asi hasta que se terminen xD

Tambien podrias usar un campo entero y basarte en la funcion time() de php
Código (php) [Seleccionar]

$id = time(); // click en el nombre de la funcion para mas info


igual nunca se repite :)

o un campo timestamp (creo que asi se llama) en tu tabla :)

MakiaResc

Al crear la base de datos me quedo asi:

Tabla pedido se creó.

consulta SQL:
CREATE TABLE `pedido` (
`id` INT( 5 ) NOT NULL AUTO_INCREMENT , PRIMARY KEY ( `id` )
) TYPE = MYISAM ;


Lego en el codgio que me diste lo puse del siguiente modo...

<?
$direccion = 'localhost';
$usuario = 'acclasto_C';
$password = 'zoloVUlo68';
$db=mysql_connect($direccion,$usuario,$password);
mysql_select_db("acclasto_pedido",$db);

str_pad();
$cadena_original = "el id del registro actual"
var $pedidoNo = str_pad($cadena_original, 5, "0", STR_PAD_LEFT);

?>


Y me marco el siguiente error:
Parse error: syntax error, unexpected T_VAR in /home/acclasto/public_html/pedido.php on line 10

Que crees tu que este haciendo mal o por que razon crees que me marce este error?

Lo estoy haciendo bien o hice algo mal????


SirLanceCC

Citar
Parse error: syntax error, unexpected T_VAR in /home/acclasto/public_html/pedido.php on line 10

Código (php) [Seleccionar]
$cadena_original = "el id del registro actual" // FALTA PUNTO Y COMA
var $pedidoNo = str_pad($cadena_original, 5, "0", STR_PAD_LEFT); // LINEA 10

h4ck3r_multidimensional

Cita de: -| Sir_Lance |- en 16 Marzo 2008, 19:40 PM
Citar
Parse error: syntax error, unexpected T_VAR in /home/acclasto/public_html/pedido.php on line 10

Código (php) [Seleccionar]
$cadena_original = "el id del registro actual" // FALTA PUNTO Y COMA
var $pedidoNo = str_pad($cadena_original, 5, "0", STR_PAD_LEFT); // LINEA 10


Asielito y Sir_Lance, un consejo, no mezclen javascript con PHP, o de última entren a php.net y fijense para que sirve la palabra reservada VAR, http://ar.php.net/manual/es/language.oop.php#keyword.class , esta se utiliza sólo en la definición de los datos o variables miembro de una clase, o en javascript para declarar como se debe una variable, pero después... ahi ven lo que dice el interprete de php

Código (php) [Seleccionar]

Parse error: syntax error, unexpected T_VAR in [...]


Que yo sepa, en los años que vengo programando en PHP esa manera de declarar variables externas a una clase no existe.

Así que ponganle un poco de onda y si van a explicarle algo al alguien que al menos no tenga errores.

MakiaResc,
Si querés generar claves principales o primarias en una tabla de una base de datos, y que sean distintas, tenés dos opciones, en realidad hay varias, pero se usan mucho estas dos, o tomas un campo entero (INT) con una logitúd sufiente como para poder soportar una cierta cantidad de registros, utilizando este campo con la opción AUNTO_INCREMENT o simplemente definis varios campos y en combinación con los que elegístes formas una clave primaria, yo la mayoría de las veces opto por la primer opción, es la más fácil, pero cuando se puede uso la combinación de dos o más campos.

Código (sql) [Seleccionar]

## crea una base de ejemplo
CREATE DATABASE ejemplo;

## le decimos que usamos la base 'ejemplo'
USE ejemplo; 

## creamos la tabla de ejemplo
CREATE TABLE tabla_ejemplo ( 
  <claveprimaria> INT( <longitúd del campo> )  NOT NULL AUTO_INCREMENT PRIMARY KEY
)Type=MyISAM;

## obviamente no hace falta crear ninguna base ni tabla si se cuenta con una,
## es un ejemplo, está así para hacerlo más completo.


En donde dice <claveprimaria> iría el nombre que le quieras dar al campo, y en donde dice <longitúd del campo> va la cantidad de dígitos que necesitas usar, en esta página http://dev.mysql.com/doc/refman/5.1/en/numeric-types.html tenés todos los tipos de datos con sus rangos numéricos aceptables. Para que te dés una idea si en vez de declarar el campo de clave principal como INT lo declaras como DOUBLE, tenés una cantidad posible de registros de 18.446.744.073.709.551.615, unos 18 trillones y medio, fijate si te alcanza  ;D igual quedate tranquilo que hay de más rango, pero se usan para cálculos con punto flotante, "números con coma" de gran tamaño. Para ver más cerca de esto, y que te quede más claro, el mejor lugar para mí, es mysql.org, ese link que te pasé es de ahí, mejor información que esa, la de los fabricantes no creo que encuentres, sin desmerecer a la gente que postea "cosas buenas" que también tienen sus méritos.

Y por último, NO lleva var una declaración de variable por eso:

Código (php) [Seleccionar]

var $pedidoNo = str_pad($cadena_original, 5, "0", STR_PAD_LEFT);


te da error, por que ese var ahí no tiene que existir, sacalo y probalo.

Código (php) [Seleccionar]

$pedidoNo = str_pad($cadena_original, 5, "0", STR_PAD_LEFT);


Igual lo que hace eso es rellenar con ceros la cadena que se encuentre en $cadena original hasta llegar a una longitúd de 5 caracteres en total, o sea los de $cadena_original + los ceros que se le agreguen, eso supongo que es para no mostrar el número así a secas, en vez de 120, por ejemplo mostraría 00120, no está mal, queda prolijo.

Bueno, me voy por que tengo que seguir trabajando, saludos y acuerdense de ponerle onda cuando explican y tratar de no pifiarla, -| Sir_Lance |- la pifió arriba de Azielito  :o , ta bien igual, somos todos humanos, y no se aprende de otra cosa que no sean los errores muchachos  ;D, así que a darle duro nomás.

Salu2.

alone-in-the-chat

#7
 :-\


Because maybe
You're gonna be the one that saves me
And after all
You're my wonderwall
d[n_n]b

Azielito

jahahahahahaah!!!

no me di cuenta que puse "var" al inicio x'DDDDDDDDDDDD

perdon, es que estaba trabajando con javascript en el trabajo y se me mesclaron los lenguajes xDDDD

ya esta arreglado :P

gracias por el aviso

Override

Me pidieron algo asì la semana pasada en el trabajo... los numeros aleatorios que habian que generar no debeian ser repetidos con los que habia en una tabla en una base de datos MySQL... estos numeros serìan "ordenes de pedido" ...


Lo que yo hice fuè generar numeros aleatorios, luego hacer una consulta buscandolo (SELECT numero FROM tabla WHERE numero = '$numaleatoriogenerado')

y con un algoritmo recursivo comprobaba de nuevo en la db el numero generado si no existia entonces lo mostraba como orden de pedido si no volvia  a llamarme y generaba de nuevo un numero y repetia el proceso hasta que no existiera...


PD: se que los algoritmos recursivos no deben implementarse si no es necesario por el uso de memoria pero bueno! asì resolvì el problema jaja.