Foros del Web » Programando para Internet » PHP »

Problemas al insertar datos PHP+SQL

Estas en el tema de Problemas al insertar datos PHP+SQL en el foro de PHP en Foros del Web. Buenas. Estoy liado con un proyecto que cuando tenga algo hecho pretendo compartirlo con quien esté interesado. Pero estoy en el desarrollo del mismo. Pongo ...
  #1 (permalink)  
Antiguo 10/03/2011, 12:59
Avatar de zibor  
Fecha de Ingreso: diciembre-2006
Mensajes: 80
Antigüedad: 17 años, 4 meses
Puntos: 1
Pregunta Problemas al insertar datos PHP+SQL

Buenas.
Estoy liado con un proyecto que cuando tenga algo hecho pretendo compartirlo con quien esté interesado. Pero estoy en el desarrollo del mismo.
Pongo la situación. Tengo un formulario para crear documentos donde especificas el titulo, privacidad, el contenido y etiquetas(temas)... la insercción del mismo no tengo ningún problema.

La idea está en que cada documento puede tener "x" etiquetas, separadas por comas. Me he creado un script que consigo separar cada etiqueta para tratarlas individualmente...
Por cada etiqueta que contraigo de un documento compruebo sí la he guardado en una tabla llamada etiquetas, sino la guardo despues recupero su ID y el ID del documento que lleva dicha etiqueta y guardo la relacion de las 2 IDs en una tabla relacional... y asi con cada etiqueta....

Mi problema es que si creo un documento que tiene 3 etiquetas me guarda solo 2 de ellas y las relaciones pero la ultima no me lo hace...
Llevo varios días comiendome la cabeza pero no veo en que fallo...
Les pongo mi archivo que recoge los datos de dicho formulario ...

Código PHP:
<?php
$titulo 
trim($_POST['titulo']);
$etiquetas trim($_POST['etiquetas']);
$textarea trim($_POST['textarea']);
$privacidad trim($_POST['privacidad']);
$fecha date("Y-m-d H:i:s");


$link abrirBD();
$sql "INSERT INTO tDocumentos VALUES ('','".$titulo."','".$etiquetas."','".$textarea."','".$privacidad."','".$fecha."')";

if(
mysql_query($sql,$link)){
    
etiquetas($etiquetas,$fecha);
    echo 
"<div class='infoEditor'>Documento guardado con exito.</div>";
    
?>
    <!-- redirecciono al inicio tras guardarse el documento.  
    <script language="javascript" type="text/javascript">
            setTimeout('location.href="index.php"',2000)
    </script>-->
    <?
}else{
    
errorBD($link);
}

cerrarBD($link);


function 
etiquetas($etiquetas,$fecha){
    
//funcion chop: elimino los posibles saltos de lineas y espacios en blanco al final de la cadena
    
$etiquetas strtoupper(chop($etiquetas));
    
//funcion explode: divido una cadena especificando un separador, devolviendo un array
    
$eti explode(",",$etiquetas);
    
$con abrirBD();
    for(
$i 0$eti[$i]; $i++){
        
$etiqueta trim($eti[$i]);
        
$sql "SELECT id FROM tEtiquetas WHERE nombre='".$etiqueta."'";
        
$resul=mysql_query($sql,$con);
        
$total=mysql_num_rows($resul);
        
//compruebo por el numero de resultados $total si existe la etiqueta o no.
        
if($total == 0){
            
//insertar nueva etiqueta.
            
$sql "INSERT INTO tEtiquetas VALUES ('','".$etiqueta."')";
            if(
mysql_query($sql,$con)){
                
$sql "SELECT id FROM tEtiquetas WHERE nombre='".$etiqueta."'";
                
$resul=mysql_query($sql,$con);
                
$total=mysql_num_rows($resul);
                
//compruebo por el numero de resultados $total si existe la etiqueta o no.
                
if($total != 0){
                    while (
$row mysql_fetch_array($resul)) {
                        
insertarEtiDocu($row["id"],$fecha);
                    }
                }else{
                    
errorBD($con);
                }
            }else{
                
errorBD($con);
            }
        }else{
            
//existe etiqueta.
            
while ($row mysql_fetch_array($resul)) {
                
insertarEtiDocu($row["id"],$fecha);
            }
        }
    }
    
cerrarBD($con);
}


function 
insertarEtiDocu($idEti,$fecha){
    
$conn abrirBD();
    
$sql "SELECT id FROM tDocumentos WHERE fecha = '".$fecha."'";

    
$resul=mysql_query($sql,$conn);
    
$total=mysql_num_rows($resul);

    if(
$total == 1){
        while (
$row mysql_fetch_array($resul)) {
            
$sql "INSERT INTO DocuEti VALUES (".$row["id"].",".$idEti.")";
            if(!
mysql_query($sql,$conn)){
                
errorBD($conn);
            }
        }
    }else{
        echo 
"error en insertarEtiDocu.";
    }
    
cerrarBD($conn);
}
?>
Gracias de antemano.
Saludos.
  #2 (permalink)  
Antiguo 10/03/2011, 14:03
 
Fecha de Ingreso: marzo-2011
Mensajes: 30
Antigüedad: 13 años, 1 mes
Puntos: 2
Respuesta: Problemas al insertar datos PHP+SQL

Intenta esto, no se si resuelta tu problema pero dale un intento:

en tu funcion etiquetas tu ciclo este:

for($i = 0; $eti[$i]; $i++){

intenta decirle que tu ciclo sea desde 0 hasta la cantidad de elementos en tu arreglo:

con algo asi:

for($i = 0; $i<=count($eti); $i++){

algo un poco mas eficiente y comentado seria:

$elementos_array = count($eti); // Cuenta los elementos del arreglo
for($i = 0; $i<=$elementos_array; $i++){

nos avisas si funciona!!
  #3 (permalink)  
Antiguo 10/03/2011, 14:06
 
Fecha de Ingreso: septiembre-2010
Mensajes: 4
Antigüedad: 13 años, 6 meses
Puntos: 0
Respuesta: Problemas al insertar datos PHP+SQL

Hola, a mí la parte que me hace sospechar... es esta:


for($i = 0; $eti[$i]; $i++){ ........


habría que probar bien esa parte, yo pondría un foreach... quizás me equivoco... soy novato en PHP... pero eso es lo que yo probaría... por cada etiqueta... realizar una acción... y no tener que loopear como haces vos (con un for "comun y corriente").

Espero haber ayudado... aunque sea en una pista, sino... la intencion estuvo jeje
Salu2!
  #4 (permalink)  
Antiguo 10/03/2011, 16:05
Avatar de zibor  
Fecha de Ingreso: diciembre-2006
Mensajes: 80
Antigüedad: 17 años, 4 meses
Puntos: 1
Respuesta: Problemas al insertar datos PHP+SQL

De ante mano gracias por almenos interesarse. He contado el array para poner el for con mas precisión como me ha comentado pplu1gui... pero sigue dandome fallos.

Intento por ejemplo poner 4 etiquetas, y en el for he puesto un hecho por ver si me coge todas las etiquetas individualmente ...
Me las muestra bien, pero despues solo me guarda en la BD las 2 primeras... aparte de darme errores...

Código:
ETIQUETA1
ETIQUETA2
ETIQUETA3

Warning: mysql_query(): 6 is not a valid MySQL-Link resource in /var/www/Docuteca/modulos/editor/recogerDatosDocu.php on line 45

Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in /var/www/Docuteca/modulos/editor/recogerDatosDocu.php on line 46

Warning: mysql_query(): 6 is not a valid MySQL-Link resource in /var/www/Docuteca/modulos/editor/recogerDatosDocu.php on line 51

Warning: mysql_errno(): 6 is not a valid MySQL-Link resource in /var/www/Docuteca/nucleo/config/BD/conexionBD.php on line 54

Warning: mysql_error(): 6 is not a valid MySQL-Link resource in /var/www/Docuteca/nucleo/config/BD/conexionBD.php on line 55
ETIQUETA4

Warning: mysql_query(): 6 is not a valid MySQL-Link resource in /var/www/Docuteca/modulos/editor/recogerDatosDocu.php on line 45

Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in /var/www/Docuteca/modulos/editor/recogerDatosDocu.php on line 46

Warning: mysql_query(): 6 is not a valid MySQL-Link resource in /var/www/Docuteca/modulos/editor/recogerDatosDocu.php on line 51

Warning: mysql_errno(): 6 is not a valid MySQL-Link resource in /var/www/Docuteca/nucleo/config/BD/conexionBD.php on line 54

Warning: mysql_error(): 6 is not a valid MySQL-Link resource in /var/www/Docuteca/nucleo/config/BD/conexionBD.php on line 55


Warning: mysql_query(): 6 is not a valid MySQL-Link resource in /var/www/Docuteca/modulos/editor/recogerDatosDocu.php on line 45

Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in /var/www/Docuteca/modulos/editor/recogerDatosDocu.php on line 46

Warning: mysql_query(): 6 is not a valid MySQL-Link resource in /var/www/Docuteca/modulos/editor/recogerDatosDocu.php on line 51

Warning: mysql_errno(): 6 is not a valid MySQL-Link resource in /var/www/Docuteca/nucleo/config/BD/conexionBD.php on line 54

Warning: mysql_error(): 6 is not a valid MySQL-Link resource in /var/www/Docuteca/nucleo/config/BD/conexionBD.php on line 55

Warning: mysql_close(): 6 is not a valid MySQL-Link resource in /var/www/Docuteca/nucleo/config/BD/conexionBD.php on line 47
PD: abrirBD() y cerrarBD() son funciones creadas por mi q abren la conexion a la BD y la cierran. Aunque dichas funciones no esten expuestas es porque están incluidas en el index del proyecto... No creo que sea problema de esto pues me inserta documentos perfectamente....
  #5 (permalink)  
Antiguo 10/03/2011, 19:20
Avatar de Kev_Joseph  
Fecha de Ingreso: marzo-2011
Mensajes: 4
Antigüedad: 13 años, 1 mes
Puntos: 0
Respuesta: Problemas al insertar datos PHP+SQL

No sera por esto VALUES ('','".$titulo."',
  #6 (permalink)  
Antiguo 11/03/2011, 04:31
Avatar de zibor  
Fecha de Ingreso: diciembre-2006
Mensajes: 80
Antigüedad: 17 años, 4 meses
Puntos: 1
De acuerdo Respuesta: Problemas al insertar datos PHP+SQL

Bueno, resulta que los problemas que tenía era por el tema de las conexiones de la BD "$link".
Como he hecho varias sentencias y por no liarme yo mismo con mi propio codigo, he utilizado funciones y el tema de las conexiones no las estaba gestionando correctamente.
Alfinal he pasado una misma conexión por todo el fichero, pasandolo a las funcíones para no liarme...

solucionado.

Código PHP:
$titulo = trim($_POST['titulo']);
$etiquetas = trim($_POST['etiquetas']);
$contenido = trim($_POST['textarea']);//contenido de la textarea
$privacidad = trim($_POST['privacidad']);
$fecha = date("Y-m-d H:i:s");

$link = abrirBD();
//funcion mysql_real_escape_string(): Escapa caracteres especiales en una cadena para ser usado en una sentencia SQL
$textarea = mysql_real_escape_string($contenido,$link);
$sql = "INSERT INTO tDocumentos VALUES ('','".$titulo."','".$textarea."','".$privacidad."','".$fecha."')";

if(mysql_query($sql,$link)){
    etiquetas($etiquetas,$fecha,$link);
    echo "<div class='infoEditor'>Documento guardado con exito.</div>";
    ?>
    <!-- redirecciono al inicio tras guardarse el documento.  -->
    <script language="javascript" type="text/javascript">
            setTimeout('location.href="index.php"',2000)
    </script>
    <?
}else{
    
errorBD($link);
}

cerrarBD($link);


function 
etiquetas($etiquetas,$fecha,$link){
    
//funcion chop: elimino los posibles saltos de lineas y espacios en blanco al final de la cadena
    
$etiquetas strtoupper(chop($etiquetas));
    
//funcion explode: divido una cadena especificando un separador, devolviendo un array
    
$eti explode(",",$etiquetas);
    
$arrEti count($eti);
    for(
$i 0$i $arrEti$i++){
        
$etiqueta trim($eti[$i]);
        echo 
$etiqueta."<br>";
        
$sql "SELECT id FROM tEtiquetas WHERE nombre='".$etiqueta."'";
        
$resul=mysql_query($sql,$link);
        
$total=mysql_num_rows($resul);
        
//compruebo por el numero de resultados $total si existe la etiqueta o no.
        
if($total == 0){
            
//insertar nueva etiqueta.
            
$sql "INSERT INTO tEtiquetas VALUES ('','".$etiqueta."')";
            if(
mysql_query($sql,$link)){
                
$sql "SELECT id FROM tEtiquetas WHERE nombre='".$etiqueta."'";
                
$resul=mysql_query($sql,$link);
                
$total=mysql_num_rows($resul);
                
//compruebo por el numero de resultados $total si existe la etiqueta o no.
                
if($total != 0){
                    while (
$row mysql_fetch_array($resul)) {
                        
insertarEtiDocu($row["id"],$fecha,$link);
                    }
                }else{
                    
errorBD($link);
                }
            }else{
                
errorBD($link);
            }
        }else{
            
//existe etiqueta.
            
while ($row mysql_fetch_array($resul)) {
                
insertarEtiDocu($row["id"],$fecha,$link);
            }
        }
    }
}


function 
insertarEtiDocu($idEti,$fecha,$link){
    
$sql "SELECT id FROM tDocumentos WHERE fecha = '".$fecha."'";

    
$resul=mysql_query($sql,$link);
    
$total=mysql_num_rows($resul);

    if(
$total == 1){
        while (
$row mysql_fetch_array($resul)) {
            
$sql "INSERT INTO DocuEti VALUES (".$row["id"].",".$idEti.")";
            if(!
mysql_query($sql,$link)){
                
errorBD($link);
            }
        }
    }else{
        echo 
"error en insertarEtiDocu.";
    }
}

PD: Kev_Joseph eso no falla por dos razones.
- así es una manera de poner una sentencia SQL con variables PHP respetando las comillas que se requiere para la sentencia de la BD.
- Ese no es el fallo, pues aun dandome los problemas que he comentado, insercciones me hacia... pero no todas las que debía hacer...

Etiquetas: sql
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 18:10.