Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] If not exist hacer insert

Estas en el tema de If not exist hacer insert en el foro de PHP en Foros del Web. Hola a todos.... tengo la siguiente consulta Código PHP:   foreach( $_POST [ "clave3" ] as  $key  =>  $value ){    $updateSQL  =  sprintf ( "insert  into tabla1 (clave, concepto, periodo) values (%s, %s,%s) ...
  #1 (permalink)  
Antiguo 30/06/2014, 18:31
Avatar de Briss  
Fecha de Ingreso: junio-2011
Mensajes: 1.293
Antigüedad: 13 años, 4 meses
Puntos: 12
If not exist hacer insert

Hola a todos.... tengo la siguiente consulta
Código PHP:
 foreach($_POST["clave3"] as $key => $value){
  
$updateSQL sprintf("insert  into tabla1 (clave, concepto, periodo) values (%s, %s,%s)
  "
,
                
                       
GetSQLValueString($_POST['clave3'][$key],  "text"), 
                       
GetSQLValueString($_POST['concepto'][$key], "text") ,
                       
GetSQLValueString($_POST['periodo'], "text")
                       ); 
lo que hago es un insert y funciona pero me gustaría que si la clave y el periodo ya existe no se inserten (para evitar registros duplicados)...
alguien puede orientarme
GRACIAS
  #2 (permalink)  
Antiguo 30/06/2014, 18:55
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 16 años, 3 meses
Puntos: 2237
Respuesta: If not exist hacer insert

Una opción sería usar REPLACE en lugar de INSERT y el efecto es:

1- Si ya existe el registro, lo elimina, creo que depende de que exista un índice de clave única para que funcione
2- Realiza la inserción

La otra opción es hacer otra consulta dentro del foreach para verificar si ya existe el registro
__________________
- León, Guanajuato
- GV-Foto
  #3 (permalink)  
Antiguo 30/06/2014, 20:14
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: If not exist hacer insert

Código SQL:
Ver original
  1. INSERT IGNORE INTO tabla...
El IGNORE omite la inserción si el valor clave genera un error, pero no devuelve mensaje de error alguno.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 30/06/2014, 20:46
Avatar de Briss  
Fecha de Ingreso: junio-2011
Mensajes: 1.293
Antigüedad: 13 años, 4 meses
Puntos: 12
Respuesta: If not exist hacer insert

Gracias a los dos... pero no tengo que comparar con el id... sino con la clave y periodo....

tengo un listado de clientes... a estos les voy a cargar conceptos (pero esta la opción de que previamente se le cargue individualmente a alguno... después tengo que carga los concepto a todos los clientes... por eso necesito que no se inserten todos... si ya existe la clave del cliente y los conceptos lo omita e inserte los demás (para evitar cargos duplicados))

he encontrado esto
INSERT INTO poblaciones(Nombre)
SELECT 'Bergantiños'
FROM dual
WHERE NOT EXISTS (SELECT Nombre FROM poblaciones WHERE Nombre = ‘Bergantiños’ LIMIT 1)

lei esto
se usa SELECT FROM dual, un nombre de tabla que se especifica en MySQL, Oracle o PostgreSQL como nombre de tabla falsa en asignaciones en las que no usamos tablas realmente. De esta forma podemos usar la condición WHERE NOT EXISTS...
pero se me complica tratar de pasarlo por el for.... agradezco su ayuda
  #5 (permalink)  
Antiguo 01/07/2014, 10:38
Avatar de Briss  
Fecha de Ingreso: junio-2011
Mensajes: 1.293
Antigüedad: 13 años, 4 meses
Puntos: 12
Respuesta: If not exist hacer insert

Intente con esto pero de todas maneras se duplican mis registros (se hace el insert con los que ya existian en la tabla)

Código PHP:
 foreach($_POST["clave3"] as $key => $value){
 
$c$_POST['clave3'][$key];
 
$p=$_POST['periodo'];
 
$co=$_POST['concepto'];

  
$updateSQL sprintf("insert  into tabla1 (clave, concepto, periodo) values (%s, %s,%s)
  "
,
                
                       
GetSQLValueString($_POST['clave3'][$key],  "text"), 
                       
GetSQLValueString($_POST['concepto'][$key], "text") ,
                       
GetSQLValueString($_POST['periodo'], "text")
                       );
  
" SELECT FROM dual  NOT EXISTS ( SELECT clave,periodo,concepto FROM tabla1 Where clave='$c' and periodo='$p' and concepto='$co') 

Última edición por Briss; 01/07/2014 a las 10:43 Razón: error
  #6 (permalink)  
Antiguo 01/07/2014, 10:56
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 16 años, 3 meses
Puntos: 2237
Respuesta: If not exist hacer insert

Briss, ese tema deberías consultarlo en Base de Datos -> MySQL.

Como te comenté en el primer mensaje, la opción con PHP sería algo como:

Código PHP:
Ver original
  1. // Si estos dos son siempre lo mismo, asígnalos fuera del foreach
  2. $periodo=$_POST['periodo'];
  3. $concepto=$_POST['concepto'];
  4. foreach($_POST['clave3'] as $key => $clave3) {
  5.        // Consulta para saber si ya existe
  6.        $sql = sprintf('SELECT concepto FROM tabla1 WHERE clave3 = %s AND periodo = %s',
  7.                   GetSQLValueString($clave3,  "text"),
  8.                   GetSQLValueString($periodo,  "text"));
  9.        $res = mysql_query($sql) or die('Error en consulta: ' . mysql_error());
  10.        if(mysql_num_rows($res) == 0) {
  11.                 // El registro no existe, entonces insertas
  12.        } else {
  13.                // El registro ya existe, ¿qué se debe hacer?
  14.        }
  15. }
__________________
- León, Guanajuato
- GV-Foto
  #7 (permalink)  
Antiguo 01/07/2014, 11:41
Avatar de Briss  
Fecha de Ingreso: junio-2011
Mensajes: 1.293
Antigüedad: 13 años, 4 meses
Puntos: 12
Respuesta: If not exist hacer insert

Cita:
Iniciado por Triby Ver Mensaje
Briss, ese tema deberías consultarlo en Base de Datos -> MySQL.

Como te comenté en el primer mensaje, la opción con PHP sería algo como:

Código PHP:
Ver original
  1. // Si estos dos son siempre lo mismo, asígnalos fuera del foreach
  2. $periodo=$_POST['periodo'];
  3. $concepto=$_POST['concepto'];
  4. foreach($_POST['clave3'] as $key => $clave3) {
  5.        // Consulta para saber si ya existe
  6.        $sql = sprintf('SELECT concepto FROM tabla1 WHERE clave3 = %s AND periodo = %s',
  7.                   GetSQLValueString($clave3,  "text"),
  8.                   GetSQLValueString($periodo,  "text"));
  9.        $res = mysql_query($sql) or die('Error en consulta: ' . mysql_error());
  10.        if(mysql_num_rows($res) == 0) {
  11.                 // El registro no existe, entonces insertas
  12.        } else {
  13.                // El registro ya existe, ¿qué se debe hacer?
  14.        }
  15. }
GRACIAS Triby mis variables las deje dentro del foreach ya que no son las mismas es por cliente (varios) probé lo que me indicaste y quedo perfecto
GRACIAS OTRA VEZ !!!!
  #8 (permalink)  
Antiguo 01/07/2014, 16:10
Avatar de Briss  
Fecha de Ingreso: junio-2011
Mensajes: 1.293
Antigüedad: 13 años, 4 meses
Puntos: 12
For each solo toma en cuenta algunos registros

Hola de nuevo tengo una duda tengo un listado de clientes... a estos les voy a cargar conceptos (pero esta la opción de que previamente se le cargue individualmente a alguno... después tengo que carga los concepto a todos los clientes... necesito que no se inserten todos... si ya existe la clave del cliente y los conceptos y periodo... lo omita e inserte los demás (para evitar cargos duplicados))
tengo el siguiente código que hace un insert siempre y cuando los valores no existan previamente...

.... funciona aparentemente bien solo para los primeros registros.... (para ser las pruebas utilizo 3 conceptos, por el momento ya que pueden ser mas...) y en los primeros registros se inserta el cliente A concepto 1 periodo x.... segundo registro cliente A concepto 2 periodo x... tercer registro cliente A concepto 3 periodo x.... cuarto registro cliente B concepto 1 periodo x... ETC... pero después no se pasan los conceptos y no entiendo porque....(se quedan como NULL)

OJALA ALGUIEN PUEDA ORIENTARME no si tengo q hacer otro for ????

Código PHP:
<?  
if ((isset($_POST["MM_update"])) && ($_POST["MM_update"] == "form1")) { 

  foreach(
$_POST["clave3"] as $key => $value){ 
//ACA hice en un echo al principio si pasan los conceptos despues no// 
     
echo "Concepto"$c$_POST['concepto'][$key]; 
    echo 
"Periodo"$p=$_POST['periodo']; 
    echo 
"cliente"$a=$_POST['clave3'][$key]; 
     
$sql sprintf'SELECT clave,periodo,concepto FROM tabla1 Where clave= %s AND periodo = %s AND concepto = %s'
                        
GetSQLValueString($_POST['clave3'][$key],  "text"),  
                        
GetSQLValueString($_POST['periodo'], "text"), 
                        
GetSQLValueString($_POST['concepto'][$key], "text") ); 
   
      
$res mysql_query($sql$connection) or die('Error en consulta: ' ." "mysql_error()); 
       
       
       if(
mysql_num_rows($res) == 0) { 
            
$updateSQL sprintf("insert  into tabla1 (clave, concepto, periodo) values (%s, %s,%s)"
                     
GetSQLValueString($_POST['clave3'][$key],  "text"),  
                      
GetSQLValueString($_POST['concepto'][$key], "text") , 
                      
GetSQLValueString($_POST['periodo'], "text"));                        
  
mysql_select_db($database_connection$connection); 
  
$Result1 mysql_query($updateSQL$connection) or die(mysql_error()); 
       } else { 
               
       } 
  


  
$updateGoTo "CRegistradas.php?"
  
  
header(sprintf("Location: %s"$updateGoTo)); 

  } 
   
  
?>
  #9 (permalink)  
Antiguo 01/07/2014, 16:18
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 7 meses
Puntos: 2534
Respuesta: For each solo toma en cuenta algunos registros

La pregunta habitual contigo: ¿qué estás haciendo para depurar lo que ocurre?

Es decir, leyendo tu código no vamos a adivinar lo que realmente se ejecuta, tampoco sabemos lo que contiene $_POST, etc.

Deberías brindar más información al respecto.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #10 (permalink)  
Antiguo 01/07/2014, 16:28
Avatar de Briss  
Fecha de Ingreso: junio-2011
Mensajes: 1.293
Antigüedad: 13 años, 4 meses
Puntos: 12
Respuesta: For each solo toma en cuenta algunos registros

Cita:
Iniciado por pateketrueke Ver Mensaje
La pregunta habitual contigo: ¿qué estás haciendo para depurar lo que ocurre?

Es decir, leyendo tu código no vamos a adivinar lo que realmente se ejecuta, tampoco sabemos lo que contiene $_POST, etc.

Deberías brindar más información al respecto.

He checado mi base de datos y con el echo

obtengo estos resultados
Concepto30ClienteAPeriodoX
Concepto29ClienteAPeriodoX
Concepto28ClienteAPeriodoX
Concepto30ClienteAPeriodoX
Concepto29ClienteBPeriodoX
Concepto28ClienteBPeriodoX
ConceptoClienteBPeriodoX
ConceptoClienteBPeriodoX
ConceptoClienteCPeriodoX
ConceptoClienteCPeriodoX
ConceptoClienteCPeriodoX
ConceptoClienteCPeriodoX


AL principio pasan bien mis conceptos después ya no....
de mis POST $_POST['clave3'][$key] VIENE LA CLAVE LA CUAL SE INSERTA SIN PROBLEMAS, al igual que mi periodo... $_POST['concepto'][$key] solo pasa bien algunos

lo saco asi

$query_a = sprintf("SELECT * FROM...'");
$a = mysql_query($query_a, $connection) or die(mysql_error());

$arreglo = array();
while ($abc = mysql_fetch_assoc($a)){
$arreglo= $abc['idconcepto'] ;
echo "<input type='text' name='concepto[]' ' value='$arreglo' size='10' />";

se crean 3 cajas por cliente y todas tienen datos... en el insert es cuando los ultimos registros pierden su concepto
  #11 (permalink)  
Antiguo 01/07/2014, 16:41
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 7 meses
Puntos: 292
Respuesta: For each solo toma en cuenta algunos registros

Hola,

foreach() no tiene la culpa...... si haces un var_dump($_POST) veras que solo itera lo que hay en clave3

Otra cosa......esos nombres que usas para los campos, tu los entiendes ?
__________________
Salu2!
  #12 (permalink)  
Antiguo 01/07/2014, 16:42
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 12 años
Puntos: 84
Respuesta: For each solo toma en cuenta algunos registros

¿Segura que esto iterará tantas veces como esperas?

Código PHP:
Ver original
  1. foreach($_POST["clave3"] as $key => $value)
__________________
Ayúdame a hacerlo por mi mismo.
  #13 (permalink)  
Antiguo 01/07/2014, 17:57
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 16 años, 3 meses
Puntos: 2237
Respuesta: If not exist hacer insert

Muestra cómo armas el formulario, seguramente ahí está el error. Igual te serviría ver el código fuente en el navegador para confirmarlo o var_dump($_POST); para ver si la cantidad de elementos en concepto es diferente que en clave3.

P.D. No es necesario abrir otro tema, ya quité la marca de "Solucionado" a este.
__________________
- León, Guanajuato
- GV-Foto
  #14 (permalink)  
Antiguo 01/07/2014, 18:41
Avatar de Briss  
Fecha de Ingreso: junio-2011
Mensajes: 1.293
Antigüedad: 13 años, 4 meses
Puntos: 12
Respuesta: If not exist hacer insert

Cita:
Iniciado por Triby Ver Mensaje
Muestra cómo armas el formulario, seguramente ahí está el error. Igual te serviría ver el código fuente en el navegador para confirmarlo o var_dump($_POST); para ver si la cantidad de elementos en concepto es diferente que en clave3.

P.D. No es necesario abrir otro tema, ya quité la marca de "Solucionado" a este.
Gracias Triby me salvaste nuevamente efectivamente el error estaba en que duplique el nombre de mi clave
gracias nuevamente, perdon por duplicar el tema no habia visto tu respuesta
nuevamente gracias ;)
  #15 (permalink)  
Antiguo 01/07/2014, 19:12
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 16 años, 3 meses
Puntos: 2237
Respuesta: If not exist hacer insert

Briss, no hay tanto problema por haber creado otro tema, pero supongo que te habrás dado cuenta que fue comenzar de cero y que era mejor continuar en el original porque ya había antecedentes y era más viable encontrar la causa del error.

Para estos casos usa el para reportar el tema y pedir que quiten la marca de "Solucionado".
__________________
- León, Guanajuato
- GV-Foto
  #16 (permalink)  
Antiguo 02/07/2014, 11:49
Avatar de Briss  
Fecha de Ingreso: junio-2011
Mensajes: 1.293
Antigüedad: 13 años, 4 meses
Puntos: 12
Respuesta: If not exist hacer insert

Cita:
Iniciado por Triby Ver Mensaje
Briss, no hay tanto problema por haber creado otro tema, pero supongo que te habrás dado cuenta que fue comenzar de cero y que era mejor continuar en el original porque ya había antecedentes y era más viable encontrar la causa del error.

Para estos casos usa el para reportar el tema y pedir que quiten la marca de "Solucionado".
Gracias Triby

Etiquetas: exist, insert, mysql, registro, registros, select, sql, tabla, toma
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 07:14.