Ver Mensaje Individual
  #3 (permalink)  
Antiguo 12/12/2003, 07:00
josemi
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 21 años, 10 meses
Puntos: 16
Hola,

Esos problemas de "duplicidad" lo podrias solucionar poniendo el campo fecha como clave primaria o indice unico, para no permitir duplicados.

Posiblemente tu problema ahora es que entre el momento que realizas el SELECT hasta el momento que haces el INSERT, otro script ha realizado el INSERT, con lo que estas haciendo 2 INSERT. Graficamente:

script1 hace el SELECT
script1 recibe que no hay registros
script2 hace el SELECT
script2 recibe que no hay registros
script1 hace INSERT
script2 hace INSERT

La ejecucion de una consulta si es atomica, pero no se garantiza que no se ejecuten otras consultas entre dos consultas del mismo script. Podrias bloquear la tabla con LOCK antes del SELECT.

Pero yo creo que la mejor forma es sin realizar el conteo previo. Realizas directamente el INSERT. Si la fecha (que es calve primaria o indice unico) existe, mysql_query() devolvera error de "clave duplicada". En ese caso realizas el UPDATE. El ejemplo anterior quedaria:

script1 hace el INSERT correctamente
script2 hace el INSERT, pero devuelve error
script2 hace el UPDATE

Como cada consulta es atomica, solo se ejecutara correctamente el primer INSERT que llege, el resto fallara. Y al fallar ejecutarian el UPDATE.

Esto en MySQL 4.1 se puede hacer esto en una sola SQL (INSERT ... ON DUPLICATE KEY ...) (http://www.mysql.com/doc/en/INSERT.html), pero para versiones anteriores seria algo asi:
Código PHP:
$el_error_de_clave_duplicada=123// no es este. Habria que buscar en el manual
$result=mysql_query("INSERT .... ");
if (!
$result && $el_error_de_clave_duplicada==mysql_errno()) {
  
// si el error es calve duplicada
  
mysql_query("UPDATE ....");
} else {
  
// el error no es clave duplicada
  
echo "error";

Espero haber sido de ayuda.

Suerte.
__________________
Josemi

Aprendiz de mucho, maestro de poco.