Foros del Web » Programando para Internet » PHP »

Problema al insertar datos a BD

Estas en el tema de Problema al insertar datos a BD en el foro de PHP en Foros del Web. Salu2, creo que ya estoy logrando la forma de pasar unos datos de excel a mysql, pues tengo este script Código PHP: <? $dbh = ...
  #1 (permalink)  
Antiguo 09/09/2005, 23:20
Avatar de el_cesar  
Fecha de Ingreso: mayo-2001
Ubicación: Cali
Mensajes: 2.423
Antigüedad: 22 años, 10 meses
Puntos: 20
Problema al insertar datos a BD

Salu2,


creo que ya estoy logrando la forma de pasar unos datos de excel a mysql, pues tengo este script

Código PHP:
<?
$dbh
=mysql_connect ("localhost""root""") or die ('I cannot connect to the database because: ' mysql_error());
mysql_select_db ("algarta"); 

 
$handle fopen("bd.csv""r");

if (
$handle) { 
 
$array explode("\n"fread($handlefilesize("bd.csv"))); 
}  
$total_array count($array);

$i 0;

while(
$i $total_array) {

$data explode(";"$array[$i]);

/*?>
<table>
<?
            echo '<tr><td><b>'.$data[0].'<b></td>';
            echo '<td><b>'.$data[1].'<b></td>';
            echo '<td><b>'.$data[2].'<b></td>';
            echo '<td><b>'.$data[3].'<b></td>';
            echo '<td><b>'.$data[4].'<b></td>';
            echo '<td><b>'.$data[5].'<b></td>';
            echo '<td><b>'.$data[6].'<b></td>';
            echo '<td><b>'.$data[7].'<b></td>';
            echo '<td><b>'.$data[8].'<b></td>';
//</table>*/
$sql "INSERT into empresas (nombre,apellido1,apellido2,cargo,empresa,direccion,telefono,extension,ciudad) values (".$data[0].",".$data[1].",".$data[2].",".$data[3].",".$data[4].",".$data[5].",".$data[6].",".$data[7].",".$data[8].")";


$i++;

?>
y pues cuando leo el array y lo imprimo sale bien, pero cuando lo corro para insertar los datos a la bd me arroja el siguiente error:

Cita:
Notice: Undefined offset: 1 in c:\archivos de programa\easyphp1-7\www\crmbusiness\local\migrar.php on line 39

Notice: Undefined offset: 2 in c:\archivos de programa\easyphp1-7\www\crmbusiness\local\migrar.php on line 39

Notice: Undefined offset: 3 in c:\archivos de programa\easyphp1-7\www\crmbusiness\local\migrar.php on line 39

Notice: Undefined offset: 4 in c:\archivos de programa\easyphp1-7\www\crmbusiness\local\migrar.php on line 39

Notice: Undefined offset: 5 in c:\archivos de programa\easyphp1-7\www\crmbusiness\local\migrar.php on line 39

Notice: Undefined offset: 6 in c:\archivos de programa\easyphp1-7\www\crmbusiness\local\migrar.php on line 39

Notice: Undefined offset: 7 in c:\archivos de programa\easyphp1-7\www\crmbusiness\local\migrar.php on line 39

Notice: Undefined offset: 8 in c:\archivos de programa\easyphp1-7\www\crmbusiness\local\migrar.php on line 39
donde segun entiendo me dice que esos datos no estan definidos, la linea 39 es el sql que inserta a la bd.


mi pregunta es: si cuando imprimo el array me sale bien, porque cuando los intento insertar a la bd me dice que no existen?

Alguien me puede ayudar a insertar estos datos?


gracias
__________________
Say no more.......
  #2 (permalink)  
Antiguo 10/09/2005, 04:36
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 8 meses
Puntos: 39
Prueba asi:
$sql = "INSERT INTO empresas (cod,nombre,apellido1,apellido2,cargo,empresa,dire ccion,telefono,extension,ciudad)
values (0,$data[0],$data[1],$data[2],$data[3],$data[4],$data[5],$data[6],$data[7],$data[8]);";
No creo que la tabla empresa no tenga una llave primaria, asi que si es de tipo autoincrement, de este modo deberia funcionar.
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #3 (permalink)  
Antiguo 10/09/2005, 10:04
Avatar de el_cesar  
Fecha de Ingreso: mayo-2001
Ubicación: Cali
Mensajes: 2.423
Antigüedad: 22 años, 10 meses
Puntos: 20
Flaviovich, lo probe tal y como me lo sugeriste, pero me arroja

Cita:
Notice: Undefined index: 1 in c:\archivos de programa\easyphp1-8\www\crmbusiness\local\pasar.php on line 29

Notice: Undefined index: 2 in c:\archivos de programa\easyphp1-8\www\crmbusiness\local\pasar.php on line 29

Notice: Undefined index: 3 in c:\archivos de programa\easyphp1-8\www\crmbusiness\local\pasar.php on line 29

Notice: Undefined index: 4 in c:\archivos de programa\easyphp1-8\www\crmbusiness\local\pasar.php on line 29

Notice: Undefined index: 5 in c:\archivos de programa\easyphp1-8\www\crmbusiness\local\pasar.php on line 29

Notice: Undefined index: 6 in c:\archivos de programa\easyphp1-8\www\crmbusiness\local\pasar.php on line 29

Notice: Undefined index: 7 in c:\archivos de programa\easyphp1-8\www\crmbusiness\local\pasar.php on line 29

Notice: Undefined index: 8 in c:\archivos de programa\easyphp1-8\www\crmbusiness\local\pasar.php on line 29
como mas le puedo hacer?
__________________
Say no more.......
  #4 (permalink)  
Antiguo 10/09/2005, 10:56
Avatar de lado2mx
Colaborador
 
Fecha de Ingreso: agosto-2001
Ubicación: Veracruz
Mensajes: 3.720
Antigüedad: 22 años, 8 meses
Puntos: 9
Al parecer solo tienes una advertencia en Notice, que bien puedes corregir con el php.ini que contiene tu php.
Código PHP:
error_reporting=E_ALL & ~E_NOTICE 
Creo que con eso será suficiente
  #5 (permalink)  
Antiguo 10/09/2005, 11:56
Avatar de el_cesar  
Fecha de Ingreso: mayo-2001
Ubicación: Cali
Mensajes: 2.423
Antigüedad: 22 años, 10 meses
Puntos: 20
nada ya le puse eso y sigue igual, reinicie el servidor y nada
__________________
Say no more.......
  #6 (permalink)  
Antiguo 10/09/2005, 12:21
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 8 meses
Puntos: 39
Cita:
Iniciado por el_cesar
como mas le puedo hacer?
Hay que ver que tiene esa sentencia SQL.
Pon esto despues de la asignacion de la sentencia:
print $sql;
Por cierto, no me habia dado cuenta que falta la funcion mysql_query. En tal caso, no entiendo por que te error.
Bueno, prueba lo que imprime la funcion print, en phpMyAdmin, o el que tu uses.
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #7 (permalink)  
Antiguo 10/09/2005, 14:26
Avatar de el_cesar  
Fecha de Ingreso: mayo-2001
Ubicación: Cali
Mensajes: 2.423
Antigüedad: 22 años, 10 meses
Puntos: 20
Bien, cuando le doy print $sql, me arroja todas las secuencias de esta manera:

Cita:
INSERT INTO empresas (cod,nombre,apellido1,apellido2,cargo,empresa,dire ccion,telefono,extension,ciudad) values (0,Maria Del Socorro ,Gamba,,,BARQUILLOS Y OBLEAS GAMBA - GAMBA LOPEZ & CIA. LTDA.,CARRERA 18 15-36,8817904,8857596,Cali )
que en esencia es lo que necesito, no se entonces porque diablos no me inserta los datos en la BD??
__________________
Say no more.......
  #8 (permalink)  
Antiguo 10/09/2005, 15:29
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 8 meses
Puntos: 39
Exclamación

Amigo mio, aqui el problema no tiene nada que ver con PHP. El problema es con SQL.
Tienes que chequear bien:
1.- la estructura de tu tabla empresas.
2.- que los nombres de los campos coincidan.
3.- los tipos de datos de cada campo (si pueden contener nulos, etc.).

Prueba asi:
Código:
$sql = "INSERT INTO empresas (cod,nombre,apellido1,apellido2,cargo,empresa,direccion,telefono,extension,ciudad)
VALUES (0,'$data[0]','$data[1]','$data[2]','$data[3]','$data[4]','$data[5]','$data[6]','$data[7]','$data[8]');";
No me fije bien en los valores que podrian tener tu arreglo $data, por eso aun no estaba bien.
Tienes que poner los apostrofes (comillas simples) a cada valor que sea caracter (por ejemplo, varchar en tu tabla).
Yo creo que con esto, ya deberia funcionar.
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #9 (permalink)  
Antiguo 10/09/2005, 15:47
Avatar de el_cesar  
Fecha de Ingreso: mayo-2001
Ubicación: Cali
Mensajes: 2.423
Antigüedad: 22 años, 10 meses
Puntos: 20
Bueno, lo he revisado y ya me inserta un solo dato, entonces decidi hacer lo siguiente:

Código PHP:
$data explode(";"$array[$i]);

while(
$data 0) {
//$sql = "INSERT into empresas (nombre,apellido1,apellido2,cargo,empresa,direccion,telefono,extension,ciudad) values (".$nombre.",".$apellido1.",".$apellido.",".$cargo.",".$empresa.",".$direccion.",".$direccion.",".$telefono.",".$ciudad.")";
mysql_db_query("algarta","INSERT INTO empresas (cod,nombre,apellido1,apellido2,cargo,empresa,dire ccion,telefono,extension,ciudad) 
values ($data[0],$data[1],$data[2],$data[3],$data[4],$data[5],$data[6],$data[7],$data[8]);"
); 
y pues se queda pegado procesando pero no inserta nada, tambien lo probe haciendo
Código PHP:
while($data 0) { 
y nada, pero creo que ya estoy cerca
__________________
Say no more.......
  #10 (permalink)  
Antiguo 10/09/2005, 18:09
Avatar de lado2mx
Colaborador
 
Fecha de Ingreso: agosto-2001
Ubicación: Veracruz
Mensajes: 3.720
Antigüedad: 22 años, 8 meses
Puntos: 9
haz lo que te dice flaviovich, ya que es la forma correcta de hacerlo, checa muy bien como es, sigue la síntaxis porfa.
  #11 (permalink)  
Antiguo 10/09/2005, 19:06
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 8 meses
Puntos: 39
Espero que esto sea la solucion a tu problema
Código PHP:
<?
    $dbh
=mysql_connect ("localhost""root""") or die ('I cannot connect to the database because: ' mysql_error());
    
mysql_select_db ("algarta");
    
    
$handle fopen ("bd.csv""r");    
    if (
$handle)
    {
        
$row explode("\n"fread($handlefilesize("bd.csv")));
    }
    
    foreach(
$row as $data)
    {    
        
$data explode(";"$array[$i]);
        
        echo 
'<table>\n';
        echo 
'<tr>\n';
        
$sql "INSERT INTO empresas (cod,nombre,apellido1,apellido2,cargo,empresa,direccion,telefono,extension,ciudad)    VALUES (0";
        foreach(
$data as $field)
        {    
            echo 
'<td><b>$field</b></td>';
            
$sql .= ",'$field'";
        }
        
$sql .= ");";
        
mysql_db_query ("algarta"$sql) or die (mysql_error());
        echo 
'</tr>\n';
        echo 
'</table>\n';
    } 
?>
Chequea bien los cambios que hice. Sabes, no creo que tengas un campo llamado cod. Es muy simple, asi que tambien chequea eso!
Algo mas, faltaria verificar que siempre hayan 8 elementos en el arreglo $data, ya que si no es asi, te va a dar error.
Bueno, prueba y nos avisas!
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #12 (permalink)  
Antiguo 10/09/2005, 19:14
Avatar de el_cesar  
Fecha de Ingreso: mayo-2001
Ubicación: Cali
Mensajes: 2.423
Antigüedad: 22 años, 10 meses
Puntos: 20
pues lo probe tal cual y me sale esto
Cita:
Notice: Undefined variable: i in c:\archivos de programa\easyphp1-8\www\crmbusiness\local\pasar.php on line 21

Notice: Undefined variable: array in c:\archivos de programa\easyphp1-8\www\crmbusiness\local\pasar.php on line 21
\n \n $field Algo está equivocado en su sintax cerca 'ccion,telefono,extension,ciudad) VALUES (0,'')' en la linea 1
__________________
Say no more.......
  #13 (permalink)  
Antiguo 10/09/2005, 20:03
Avatar de el_cesar  
Fecha de Ingreso: mayo-2001
Ubicación: Cali
Mensajes: 2.423
Antigüedad: 22 años, 10 meses
Puntos: 20
Bueno, ya arregle lo de $i y $array que no las reconocia pero ahora me sale
Cita:
El número de columnas no corresponde al número en la línea 1
y revise mi bd y tengo 9 columnas, que corresponden al numero de columnas que genera el $sql
__________________
Say no more.......
  #14 (permalink)  
Antiguo 11/09/2005, 03:40
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 8 meses
Puntos: 39
Despues de:
$data = explode(";", $array[$i]);
pon esto:
print_r($data);

Seguro que te mostrara 9 elementos o mas ($data[0],...,$data[8]). Si es asi, entonces hay que aumentar un tercer parametro a la funcion explode
$data = explode(";", $array[$i], 8);

Tu necesias 8 elementos en $data, mas 1 (tu campo cod, que hasta ahora no mencionas nada: como se llama, de que tipo es, etc.) en $sql, tendrias 9, que es la cantidad de columnas que tienes en tu tabla empresas.

Te recomiendo, en estos casos, poner siempre un print antes de cada sentencia SQL. Asi podras ver la sentencia completa, que valores tiene, etc.
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #15 (permalink)  
Antiguo 11/09/2005, 11:13
Avatar de el_cesar  
Fecha de Ingreso: mayo-2001
Ubicación: Cali
Mensajes: 2.423
Antigüedad: 22 años, 10 meses
Puntos: 20
perfecto, ahora si me inserta, pero solo me inserta la primera linea voy a probar si poniendole un while al insert me inserta los demas
__________________
Say no more.......
  #16 (permalink)  
Antiguo 11/09/2005, 22:50
Avatar de el_cesar  
Fecha de Ingreso: mayo-2001
Ubicación: Cali
Mensajes: 2.423
Antigüedad: 22 años, 10 meses
Puntos: 20
bueno mi codigo ya esta listo

Código PHP:
<? 
    $dbh
=mysql_connect ("localhost""root""") or die ('I cannot connect to the database because: ' mysql_error()); 
    
mysql_select_db ("algarta"); 
     
    
$handle fopen ("bd.csv""r");     
    if (
$handle
    { 
        
$row explode("\n"fread($handlefilesize("bd.csv"))); 
    } 
     
$i 0;
     while (
$i $row){
    foreach(
$row as $data
    {     
        
$data explode(";"$row[$i], 8); 

        echo 
'<table border="1">'
        echo 
'<tr>'
        
$sql "INSERT INTO empresas (nombre,apellido1,apellido2,cargo,empresa,direccion,telefono,extension,ciudad)    VALUES (0"
        foreach(
$data as $field
        {     
            echo 
"<td><b>".$field."</b></td>"
            
$sql .= ",'$field'"
        } 
        
$sql .= ");"
        
mysql_db_query ("algarta"$sql) or die (mysql_error()); 
        echo 
'</tr>'
        echo 
'</table>'
    
$i++;
    } 
    }
?>
funciona a la perfeccion

pero ahora necesito hacer una consulta que me permita verificar si los datos que voy a insertar ya estan en la BD
__________________
Say no more.......
  #17 (permalink)  
Antiguo 12/09/2005, 10:42
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 8 meses
Puntos: 39
HOLA!
Me alegro que funcione, aunque no parece que muy bien.. pero tu sabes mejor que nadie, que es lo que necesitas.
Sabes, me he dado cuenta que habia un pequeño error:
esta linea echo '<table border="1">';, no puede estar dentro del ciclo. Ponla antes de tu while. Lo mismo con echo '</table>';, hay que ponerla despues del ciclo while (}).

Cita:
Iniciado por el_cesar
funciona a la perfeccion
Si en realidad te funciona, entonces no hagas lo cambios que te digo.
Cita:
Iniciado por el_cesar
pero ahora necesito hacer una consulta que me permita verificar si los datos que voy a insertar ya estan en la BD
Pues eso ya no es este foro, sino en Base de Datos .
Solo te doy una idea: para verificar si los datos que vas a insertar ya estan en la BD, necesitas buscar la clave primaria. Si no existe, insertas.
Suerte, amigo!
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #18 (permalink)  
Antiguo 12/09/2005, 11:20
Avatar de el_cesar  
Fecha de Ingreso: mayo-2001
Ubicación: Cali
Mensajes: 2.423
Antigüedad: 22 años, 10 meses
Puntos: 20
estoy deacuerdo, pero como son tantos datos (promedio 300 por vez) habria que hacerlo con un array o estoy equivocado??
__________________
Say no more.......
  #19 (permalink)  
Antiguo 12/09/2005, 13:59
Avatar de el_cesar  
Fecha de Ingreso: mayo-2001
Ubicación: Cali
Mensajes: 2.423
Antigüedad: 22 años, 10 meses
Puntos: 20
Bueno, intentando hacer la consulta, solo cambie el sql que me insertaba para ver si me resultaba, y bien, lo corri y me salio este mensaje

Cita:

Algo está equivocado en su sintax cerca ''Hugo ','Martínez','Escobedo','Gerente','ALIMENTOS RALFA BIOENER' en la linea 1
Por que solo cambie el sql??? pues resulta que segun pienso, la operacion es la misma, es decir el script debe abrir el archivo .csv dividirlo y a partir de alli hacer la consulta a la BD para verificar si el dato es existente.

quien me puede decir si estoy herrado???

gracias...
__________________
Say no more.......
  #20 (permalink)  
Antiguo 12/09/2005, 16:28
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 8 meses
Puntos: 39
Exclamación

A ver, agrega esta funcion:
Código PHP:
function existeDato ($dbName$dato)
{
    
$sql "SELECT * FROM empresas WHERE cod = $dato;"
    
return mysql_db_query ($dbName$sql) or die (mysql_error());    

y la llamas asi:
Código PHP:
if (!existeDato ("algarta"$idEmp))

    
mysql_db_query ("algarta"$sql) or die (mysql_error());

donde $idEmp, es el codigo de la empresa que quieres insertar.
Ya que hasta ahora no has mencionado nada sobre la estructura de tu tabla, sera dificil ayudarte.
Bueno, espero que entiendas lo que hace esta funcion.
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
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 10:06.