[PHP y MySQL] Problema con código

Iniciado por electrodev, 15 Agosto 2014, 17:38 PM

0 Miembros y 1 Visitante están viendo este tema.

electrodev

Buenos días, os escribo por que no dejo de tirarme de los pelos con este problema, supongo que será algún fallo tonto o simplemente que no lo hago de forma correcta.

Código (php) [Seleccionar]

echo "Copiando...";

$gid = '10';

$sql = 'SELECT * FROM my_table_1 WHERE id = "'.$gid.'"';

$db = mysql_pconnect('mi_ip','mi_user','mi_pass');
mysql_select_db('mi_DB');
$data = mysql_query($sql);

$res = mysql_fetch_array($data);

$sql = 'INSERT INTO my_table_2 (id,data1,data2) VALUES ("'.$res['id'].'","'.$res['data1'].'","'.$res['data2'].'")';

mysql_query($sql);


La estructura de las dos tablas son totalmente iguales y como verán lo único que hace es copiar la fila que retorna la 1º consulta SQL en la 2º Tabla. La primera linea donde esta el echo funciona y php no me tira ningún error, pero al explorar con phpmyadmin la 2º tabla no se introducen los datos.

Desconozco totalmente que esta mal o que estoy haciendo mal, ¿Alguien sabe a que se debe?, ¿Alguna otra manera de hacerlo?  :huh:

Un Saludo y Gracias de antemano


::: Devil :::

NI TU NI NADIEN PORDRAN CONMIGO SOY MAS FUERTE QUE LA ENVIDIA.

ESTO ESTA DEDICADO A LOS QUE ME JODEN LA VIDA

electrodev


MinusFour

¿Como es tu tabla de SQL?

Código (sql) [Seleccionar]

DESCRIBE my_table_1;


El comando lo corres desde tu base de datos en el phpmyadmin en la pestaña SQL o desde una conexion SQL habiendo selecionado la base de datos.

También puedes debuggear SQL con mysql_error().

Ej.

Código (php) [Seleccionar]

mysql_query("SELECT * FROM tabla") or die(mysql_error());

electrodev

Gracias MinusFour, en cuanto tenga un momento lo pruebo a ver si saco mas datos de que falla.

Un Saludo y Gracias

spysecurityca

Mi viejo es como dijeron arriba, intenta con un update, ya que son iguales le pasas el elemento en común a la otra tabla para que te haga un cambio.

Haces que el update sql se hasta efectivo al encontrar el elemento el común con la otra tabla por medio de un if.

No te hago el código porque estoy desde el móvil y es un poco fastidioso.

electrodev

Ok muchiiiisimas gracias a todos, ya lo arregle.  ;-)

Si quereis ya podeis cerrar el hilo.

dRak0

echo "Copiando...";

Cuando no vayas a mostrar una variable usa comillas simples ''. Si usas comillas dobles PHP tambien analiza si existe una variable, afectando al rendimiento.

electrodev

»®et2lib©«  Gracias por ese apunte, me lo guardo.
Muchas Gracias  ;D

WHK

#9
Prueba con:

Código (php) [Seleccionar]
<?php
...
mysqli_query('
INSERT INTO tabla1
SELECT 
NULL, -- Los ids no deberian compartirse a menos que sea muy necesario
campo1,
campo2
FROM tabla1
'
);


Desde la misma query puedes insertar haciendo un select por debajo, esto vuelca directamente los datos de una tabla a otra seleccinando los campos que necesitas, de hecho desde el select puedes hacer un order by o un limit como gustes o joins, generalmente lo uso cuando debo llenar tablas para los cache. Si haces esto desde php no sabrás si tienes 1 dato o un millón y pasar un millón de registros a la memoria vía php podría ser fatal, en ves de eso deja que mysql se encargue de traspasar fila por fila sin dejar sin aliento a tu servidor.

Si quieres pasar un solo dato puedes usar un where y si quieres unir datos relacionados puedes usar group_concat:

Código (php) [Seleccionar]
mysqli_query('
INSERT IGNORE INTO usuarios_b
SELECT
id,
nombre,
correo,
GROUP_CONCAT(telefonos SEPARATOR ", ") as telefonos
LEFT JOIN telefonos ON (telefonos.usuario_id = usuarios_a.id)
FROM usuarios_a
WHERE usuarios_a.id = 157894
GROUP BY usuarios_a.id
');


Digamos que usuarios_a tiene una tabla relacional con todos los telefonos del usuario, en la tabla usuarios_b tendrá los telefonos separados por coma en un solo campo desnormalizado vs usuarios_a que si estaba normalizado. El ignore es para que no arroje error si ya existía, si se quiere renovar se puede unir con un drop o un update en ves de insert. Puse left join en ves de inner join porque talves el usuario no tiene telefonos, en ese caso el campo queda nulo y la tabla usuarios_b debería tener el campo telefonos nullable y usuarios_b denbería llevar un foregin key relaiconado con el id de la tabla de usuarios_a con un on-update y on-delete en cascade para hacer joins mas rápidos con innodb.

Por favor intenten dejar de usar mysql_ y usen mysqli_ o el objeto mismo de mysqli ya que mysql_ se declaró obsoleto en las nuevas verisones de php5.