Foros del Web » Programando para Internet » PHP »

problema con eliminacion de varios registros

Estas en el tema de problema con eliminacion de varios registros en el foro de PHP en Foros del Web. hola compañeros, pues veran, estoy trabajando en conjunto con un par de ejemplo ke pusieron aki en el foro, se trata de un sistema de ...
  #1 (permalink)  
Antiguo 14/03/2006, 02:15
Avatar de ZydRick  
Fecha de Ingreso: febrero-2005
Ubicación: Lima
Mensajes: 750
Antigüedad: 19 años, 2 meses
Puntos: 4
problema con eliminacion de varios registros

hola compañeros, pues veran, estoy trabajando en conjunto con un par de ejemplo ke pusieron aki en el foro, se trata de un sistema de mensajes privados y el script de las FAQ's ke puso Cluster sobre eliminar mas de un registro con checkbox pues veran mi problema es ke no me elimina mas de un registro, aki pongo el codigo de script ke muestra la lista de mensajes privados y el script ke los elimina en grupo

leer_privados.php
Código PHP:
<?php
    
include("config.php"); //conexion a la BD MYSQL
    
include("funcionfecha.php");
    
$sqlmysql_query("SELECT * FROM mensajes WHERE para='".$_SESSION['usuario']."' ORDER by msgid DESC"); // hacemos la consulta a la tabla de mensajes
    
print "<table width=720 border=0 cellpadding=0 cellspacing=0 bgcolor=#ffffff>";
    print 
"<tr><td colspan='5'><form action='dropmsg2.php' method='post'><input type='submit' value='Eliminar mensajes seleccionados' name='borrar' /></td></tr>";
    print 
"<tr>
        <td width=40 class=cabeza>&nbsp;</td>
        <td width=250 class=cabeza>Asunto</td>
        <td width=140 class=cabeza>Enviado por</td>
        <td width=90 class=cabeza>Fecha</td>
        <td width=180 class=cabeza2>Acción</td>
      </tr>"
;
    while (
$row mysql_fetch_array($sql) ){
    
$msgid $row['msgid'];
    
$asunte $row['asunto']; // obtenemos el asunto
    
$fecha obtener_fecha_dmY($row['fecha']);
    print 
"<tr><td width=40 class='memb2'>";
    echo 
"<input type='checkbox' name='msgid[]' value='$msgid' />";
    print 
"</td><td width=250 class='memb'>";
    echo 
"<a class=vinculo href=leer_privados2.php?msgid=".$msgid.">$asunte</a>";
    print 
"</td><td width=140 class='memb'>";
    echo 
"<a class=vinculo href='perfiles/".$row['de']."'>".$row['de']."</a>";
    print 
"</td><td width=90 class='memb'>";
    echo 
$fecha;
    print 
"</td><td width=160 class='memb2'>";
    echo 
"<a class='vinculo' href=dropmsg.php?msgid=".$msgid." onclick=\"if(!confirm('Estás apunto de eliminar este mensaje. Estás seguro de realizar esta operación?')) return false;\">Eliminar mensaje</a>";
    print 
"</form></td></tr>"; }
    print 
"</table>";
?>
dropmsg2.php
Código PHP:
<?php 
    
include("config.php");
    
// Generamos una lista de los ID's (campo value= ..) que tenemos en nuestro array.
    
$lista=implode(','$_POST['msgid']);
    
// Y lo aplicamos al SQL correspondiente y ejecutamos la consulta.
    
mysql_query("DELETE FROM mensajes WHERE msgid IN(".$lista.")");
    
$redirect $_SERVER['HTTP_REFERER'];
    
header("Location: $redirect");
?>
Como repito el problema esta en ke si selecciono dos o mas registros y le doy a eliminar no elimina ninguno, alguien me puede decir ke esta fallando en dichos scripts?, se lo agradecere mucho

Saludos
  #2 (permalink)  
Antiguo 14/03/2006, 03:51
 
Fecha de Ingreso: abril-2005
Mensajes: 139
Antigüedad: 19 años
Puntos: 1
Hola ZydRick, no entiendo que pretendes hacer con el implode en dropmsg2.php.

Prueba con un foreach, seria algo asi:

Código PHP:
// recibimos los datos de los checkbox como un array con iguales nombres=>registros y distintos values=>$
// lo paasamos a otro array recogiendo los datos del formulario
$borra $_POST['msgid'];  // aqui le aplico algun filtro para qu no tenga nada raro  

$conn db_conecta(); // funcion que yo uso para conectar con la db
  
if (!$conn){
                   
// gestion del error
                  
}

// recorremos el array borrando a cada paso del nuevo array 
 
foreach($borra AS $id)

// borramos el articulo  
$resultmysql_query("delete from mensajes where msgid='$id'");
 if (!
$result){
                   
// gestion del error
                  
}

 } 

//mensaje de todo correcto 
Este sisitema lo utilizo yo en mis webs sin problema,espero que te sirva.
__________________
Ciao y suerte.
  #3 (permalink)  
Antiguo 14/03/2006, 07:20
Avatar de ZydRick  
Fecha de Ingreso: febrero-2005
Ubicación: Lima
Mensajes: 750
Antigüedad: 19 años, 2 meses
Puntos: 4
hola pleniluni0, mira he hecho unos pekeños cambios en el codigo ke me pusiste y al probarlo solo me elimina 1 registro a pesar ke selecciono 2 o mas

Código PHP:
<?php 
    
include("config.php");
    
$borra $_POST['msgid'];  // aqui le aplico algun filtro para qu no tenga nada raro  
    
foreach($borra AS $id) { 
    
// borramos el articulo  
    
$resultmysql_query("DELETE FROM mensajes WHERE msgid='$id'");
        if (!
$result){
         echo 
"fallo";
        }
    }
?>
donde puede estar la falla ?, llevo desde ayer poniendo el script de cabeza y solo me keda esto para terminarlo, gracias por la ayuda
  #4 (permalink)  
Antiguo 14/03/2006, 09:04
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Parece que el problema lo tienes con tus comillas .. Los "IDs" para atacar a la sentencia IN() de SQL deberían estar entre comillas. Es decir; debes generar algo tipo:

IN ('1','2','4')

Asegurate que es eso lo que generas .. define tu DELETE (sentencia SQL) bajo una variable para que le puedas hacer un echo y usa las comillas mencionadas:

$lista=implode("','", $_POST['msgid']);

Por otro lado .. visualiza los mensajes de error (a nivel SQL o conexión) que puedas tener usando:

mysql_query($sql) or die (mysql_error());

y por el momento quitando la redirección que haces con header() (para que puedas ver el mensaje de error si lo hay con tranquilidad).

Revisa también que:
$_POST['msgid'];
sea un array (si seleccionas sólo una opción NO es un array lo que se genera sino una variable simple .. OJO con eso).

para comprobarlo fielmente en todo caso . .usa:

Código PHP:
<?
echo "<pre>";
print_r($_POST['msgid']);
echo 
"</pre>";
?>
(al principio de tu script y recondando NO usar por el momento header() ...)

Un saludo,
  #5 (permalink)  
Antiguo 14/03/2006, 09:14
Avatar de ZydRick  
Fecha de Ingreso: febrero-2005
Ubicación: Lima
Mensajes: 750
Antigüedad: 19 años, 2 meses
Puntos: 4
hola Cluster he puesto eso de las comillas y me sigue eliminando solo un registro y al hacer el print_r me arroja esto

Array
(
[0] => 12
)

y no entiendo ke kiere decir, hoy ando muy nublado y no me entero de nada :S
  #6 (permalink)  
Antiguo 14/03/2006, 09:28
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Eso te dice que de tu anterior código sólo está generandose un array con un elemento -sólo- .. Es decir .. la rutina del "DELETE" (ese script en concreto) funciona correctamente .. hace su trabajo. El problema viene del otro script que no genera bien sus N checkbox para tus N registros a seleccionar o realmente no selecciones más que una opción?..

Se observa por otro lado un problema:

No sé donde abres tu formulario (<form .....>) .. en cualquier caso debe ser antes de entrar a tu bucle while() ..

Pero lo que si que se vé es que tienes el cierre del "form" en cada pasada del bucle:

print "</form></td></tr>"; }

ese "</form>" debería quedar FUERA del bucle while(){------} .. no dentro!!.

Como en HTML no se pueden "anidar" formularios .. tu "submit" de ese formaulrio que tampoco se vé donde lo usas .. ¿O pretendes hacer con?:

Código PHP:
echo "<a class='vinculo' href=dropmsg.php?msgid=".$msgid." onclick=\"if(!confirm('Estás apunto de eliminar este mensaje. Estás seguro de realizar esta operación?')) return false;\">Eliminar mensaje</a>";
    print 
"</form></td></tr> 
Toma el último (el más hacia fuera) bloque de <form ...> y su cierre </form>

Lo mejor para ver este tipo de problemas es ver el código HTML que se genera de la ejecución de tu script PHP .. eso lo puedes ver en tu navegador -> ver código fuente. Si tienes claro el HTML que debes generar o HTML en general podrás ver si hay algo que no es correcto para solventar algún problema tipo "despiste" (como "ops!" me dejé el </form> antes de mi } del while() ...)

Un saludo,
  #7 (permalink)  
Antiguo 14/03/2006, 09:46
Avatar de ZydRick  
Fecha de Ingreso: febrero-2005
Ubicación: Lima
Mensajes: 750
Antigüedad: 19 años, 2 meses
Puntos: 4
juaz ya no se ni como hacerle para ordenar esos datos en una tabla html, mira aki lo he hecho de otra manera ahora mi GRAN LIO es hacer ke se muestre el boton Eliminar mensajes seleccionados, pk si lo meto en uno de los <tr><td> se repite tantas veces como filas tenga la tabla de mensajes, alguna idea ?? aki dejo el codigo

Código PHP:
<?
  session_start
();
?>
<table width="720" border="0" cellpadding="0" cellspacing="0">
      <tr>
        <td style="width: 40px;" class="cabeza">&nbsp;</td>
        <td style="width: 250px;" class="cabeza">Asunto</td>
        <td style="width: 140px;" class="cabeza">Enviado por...</td>
        <td style="width: 90px;" class="cabeza">Fecha</td>
        <td style="width: 180px;" class="cabeza2">Eliminar</td>
      </tr>
      <?  
        
include("config.php"); //conexion a la BD MYSQL
        
include("funcionfecha.php");
        
$sqlmysql_query("SELECT * FROM mensajes WHERE para='".$_SESSION['usuario']."' ORDER by msgid DESC"); // hacemos la consulta a la tabla de mensajes
        
while ($row mysql_fetch_array($sql) ){
        
$msgid $row['msgid'];
        
$asunte $row['asunto']; // obtenemos el asunto
        
$fecha obtener_fecha_dmY($row['fecha']);
      
?>    
      <tr>
      <form action="dropmsg2.php" method="post">
        <td class="memb2" style="width: 40px;"><input type="checkbox" name="msgid[]" value="<?=$msgid?>" /></td>
        <td class="memb" style="width: 250px;"><a class="vinculo" href="leer_privados2.php?msgid=<?=$msgid?>"><?=$asunte?></a></td>
        <td class="memb" style="width: 140px;"><a class="vinculo" href="perfiles/<?=$row['de']?>/"><?=$row['de']?></a></td>
        <td class="memb" style="width: 80px;"><?=$fecha?></td>
        <td class="memb2" style="width: 180px;"><a class="vinculo" href="dropmsg.php?msgid=<?=$msgid?>" onclick="if(!confirm('Estás apunto de eliminar este mensaje. Estás seguro de realizar esta operación?')) return false;">Eliminar mensaje</a></td>
      </form>
      </tr>
      <?
           
}
      
?>
</table>
saludos
  #8 (permalink)  
Antiguo 14/03/2006, 10:01
Avatar de ZydRick  
Fecha de Ingreso: febrero-2005
Ubicación: Lima
Mensajes: 750
Antigüedad: 19 años, 2 meses
Puntos: 4
por fin !!!! lo he logrado !!, la solucion fue ke en el archivo ke enlista los mensajes abri <form> antes de <table> y cerre </form> despues del </table> y el boton ke envia el array lo puse exactamente despues de <form>

y en el archivo ke elimina los mensajes cambie esta linea

Código PHP:
<?
  $lista
=implode("','"$_POST['msgid']); // aconsejada por Cluster y me daba un error de sintaxis xD
?>
por esta otra:

Código PHP:
<?
  $lista
=implode(","$_POST['msgid']);
?>
y ahora funciona correctamente, gracias por la ayuda

Saludos
  #9 (permalink)  
Antiguo 14/03/2006, 10:22
 
Fecha de Ingreso: abril-2005
Mensajes: 139
Antigüedad: 19 años
Puntos: 1
Entonces como dijo cluster el problema no estaba en los codigos que te hemos pasado sino en el bucle del script del formulario xd.

Mi pregunta va para cluster,
Con tu sistema desde luego se utiliza solo una llamada a la base de datos, merece la pena que cambie mis scripts con tu sistema?

Lo pregunto por saber la diferencia entre ambas formas de hacerlo.

Un saludo
__________________
Ciao y suerte.
  #10 (permalink)  
Antiguo 14/03/2006, 10:35
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
Con tu sistema desde luego se utiliza solo una llamada a la base de datos, merece la pena que cambie mis scripts con tu sistema?
Te refieres a la alternativa que propongo de uso de SQL y su funcion(alidad):

IN(lista de valores) ?

Si es así .. Por lo general un uso de "SQL" más óptimo (cuando disponemos de tal o cual función) es eso mismo .. No es lo mismo entregarle vía esa función un grupo de "id's" para que ejecute el "motor" de Mysql cierta acción .. que ir pasando por "PHP" para ir entregando uno a uno cada proceso.

Es cierto que si bien en rendimiento no sería óptimo hacerlo por la vía "bucle" PHP y sentencia SQL simple (Where ... id=$id), eso te dá más control para ver si tal ID falla concretamente y así tratar el tema como corresponda. (Igual la función IN() dá su mesajito de error SQL característico si algún ID no existe o hay problemas .. )

Un saludo,

Última edición por Cluster; 14/03/2006 a las 10:43
  #11 (permalink)  
Antiguo 14/03/2006, 10:46
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
Iniciado por ZydRick
por fin !!!! lo he logrado !!, la solucion fue ke en el archivo ke enlista los mensajes abri <form> antes de <table> y cerre </form> despues del </table> y el boton ke envia el array lo puse exactamente despues de <form>

y en el archivo ke elimina los mensajes cambie esta linea

Código PHP:
<?
  $lista
=implode("','"$_POST['msgid']); // aconsejada por Cluster y me daba un error de sintaxis xD
?>
por esta otra:

Código PHP:
<?
  $lista
=implode(","$_POST['msgid']);
?>
y ahora funciona correctamente, gracias por la ayuda

Saludos
Realmente da igual si tu <form> o </form> está antes de tu <table> o </table>, lo que importa es tu bucle (while() en tu caso) .. que se defina -antes- de entrar el <form ...> y que se cierre el </form> despues de su cierre } ... (eso a nivel de los datos que genereas en tu formulario .. el tema de la visualización o generación de ese código HTML para tu tabla es otro cuento que ya solventastes).

Un saludo,
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 21:13.