PHP - Update PHP

 
Vista:
sin imagen de perfil
Val: 18
Ha aumentado su posición en 6 puestos en PHP (en relación al último mes)
Gráfica de PHP

Update PHP

Publicado por Víctor (6 intervenciones) el 16/09/2020 14:22:40
Buenas, y gracias por estos foros y está web, como podréis ver en mi siguiente comentario, ando algo pez en estas cosas, pero le pongo ganas :)

Estoy haciendo un script php para que me actualice stocks de prestashop, en donde quiero subir un CSV, los carga en una tabla stock y acto seguido ha de realizar algunos updates.

El código que inyecta en stock las referencias y cantidades es el siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
	require 'connect.php';
 
	if(ISSET($_POST['save'])){
		if($_FILES['file']['name']){
			$filename = explode(".", $_FILES['file']['name']);
			if($filename[1] == 'csv'){
				$handler = fopen($_FILES['file']['tmp_name'], "r");
				while($data = fgetcsv($handler)){
					$conn->query("INSERT INTO `stock` (referencia, cantidad) VALUES('$data[0]', '$data[1]')");
				}
 
				fclose($handler);
			}
		}
 
		header('location:index.php');
 
	}
?>

Aquí me surge el primer problema, de unos 20.000 registros, solo me carga unos 4.200 y da como OK la subida y me muestra esos 4200. ¿Como puedo hacer para que cargue todos?

Por otro lado, quiero que antes de cargarlos haga un truncate de la tabla y después, ejecute estas operaciones que hago mediante PHPMyAdmin y no se como añadirlas al script.

Antes de cargar los datos del CSV quiero que haga esto...

1
query("TRUNCATE `stock`");

Después de cargarlos, que haga lo siguiente...

1
2
3
UPDATE  `bdd`.`ps_product_attribute`,`bdd`.`stock` SET  `quantity`= `cantidad` WHERE  `ps_product_attribute`.`reference` = `stock`.`referencia`
 
UPDATE  `bdd`.`ps_stock_available`,`bdd`.`ps_product_attribute`  SET  `ps_stock_available`.`quantity` = `ps_product_attribute`.`quantity` WHERE  `ps_stock_available`.`id_product_attribute` = `ps_product_attribute`.`id_product_attribute`

¿Alguna sugerencia de como hacerlo?

Gracias a todos.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Yoel
Val: 617
Bronce
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Update PHP

Publicado por Yoel (198 intervenciones) el 17/09/2020 05:26:32
Hola victor, el problema que se está presentando a la hora de subir tu fichero, te recomiendo que lo verifiques linea a línea para ver por que se te está deteniendo. Una causa puede ser que estes usando un servidor compartido y el proceso de ejecución sea muy largo y se te detenga el ciclo que estas haciendo por lo que te recomiendo que subas ficheros más pequeños en cuanto al número de registro. Con respecto a los códigos que quieres incluir para que se ejecuten en un momento determinado, te dejo el ejemplo.

Gracias

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
	require 'connect.php';
 
	if(ISSET($_POST['save'])){
		if($_FILES['file']['name']){
			$filename = explode(".", $_FILES['file']['name']);
			if($filename[1] == 'csv'){
                        //Borramos todo el contenido de la tabla antes que comience a insertar los nuevos datos
                         $conn->query("TRUNCATE `stock`");
				$handler = fopen($_FILES['file']['tmp_name'], "r");
				while($data = fgetcsv($handler)){
					$conn->query("INSERT INTO `stock` (referencia, cantidad) VALUES('$data[0]', '$data[1]')");
				}
 
				fclose($handler);
                          //Proceso de actualización después de subir el contenido a la tabla stock
                          $conn->query("UPDATE  `bdd`.`ps_product_attribute`,`bdd`.`stock` SET  `quantity`= `cantidad` WHERE  `ps_product_attribute`.`reference` = `stock`.`referencia`");
                               $conn->query("UPDATE  `bdd`.`ps_stock_available`,`bdd`.`ps_product_attribute`  SET  `ps_stock_available`.`quantity` = `ps_product_attribute`.`quantity` WHERE  `ps_stock_available`.`id_product_attribute` = `ps_product_attribute`.`id_product_attribute`");
			}
		}
 
		header('location:index.php');
 
	}
?>
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
sin imagen de perfil
Val: 121
Ha disminuido 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

Update PHP

Publicado por Juan Luis ESP (35 intervenciones) el 18/09/2020 08:44:17
Buenas, Victor

lo primero que debes hacer cuando algo no funciona bien, es habilitar el mostrado de errores de PHP. Ya que eso te va a indicar el motivo por el que se detuvo el script.

Pon al principio de tu fichero estas sentencias:

1
2
3
4
5
6
7
8
<?php
/* Modo debug */
error_reporting(E_ALL);
ini_set('display_errors','On');
 
// Aquí seguiría tu código
// ....
// ....

Cuando lo ejecutes ya te dará alguna indicación del error y la línea donde se produjo.

Aparte de lo anterior, es posible que la ejecución del script tardase más de la cuenta y salta un timeout. Para evitarlo, añade antes de tu código, la siguiente sentencia:

1
set_time_limit(0);

Un buen truco (si no es problemas de timeout) sería el ver la última línea que se introdujo en la tabla de stock y localizar la siguiente línea de esa en el CSV, para descartar que tuviera caracteres raros esa línea que sería lo que provocara la mala ejecución de la query.

En todo caso, aunque es un poco más avanzado, siempre puedes utilizar los try catch para capturar los errores y que no te detengan la ejecución del script. Sería algo como esto:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
try {
    $conn->query("INSERT INTO `stock` (referencia, cantidad) VALUES('$data[0]', '$data[1]')");
}
catch (MySQLDuplicateKeyException $e) {
    // duplicate entry exception
    echo "Error de duplicidad: " . $e->getMessage();
    print_r($data);
}
catch (MySQLException $e) {
    // other mysql exception (not duplicate key entry)
    echo "Error no determinado al ejecutar la SQL: " . $e->getMessage();
    print_r($data);
}
catch (Exception $e) {
    // not a MySQL exception
    echo "Error desconocido: " . $e->getMessage();
}


El truncate lo puedes hacer de igual manera a la que haces los inserts:

1
$conn->query("TRUNCATE `stock`");


Lo que no tengo ya tan claro son los dos últimos UPDATES que quieres hacer. Si las tablas de stock y ps_product_attribute están en la misma base de datos, no hay necesidad de añadir el prefijo `bdd`. Si están en bases de datos diferentes, asegúrate de que la conexión usada "ve" ambas bd/tablas, es decir, que el usuario tiene permisos sobre ambas.

Por lo demás, puedes ejecutarlas de la misma forma que usas con los inserts.


Un saludo!
Juan Luis
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
3
Comentar
sin imagen de perfil
Val: 18
Ha aumentado su posición en 6 puestos en PHP (en relación al último mes)
Gráfica de PHP

Update PHP

Publicado por Víctor (6 intervenciones) el 18/09/2020 13:46:09
Gracias a los dos, voy a probar, el servidor es dedicado, haré lo que me mencionáis de los errores y añadiré el comando set_time_limit(0); para que no provoque un timeout, ahora lo que hacía era mirar porque línea se había quedado y subir a partir de la siguiente, así que problema de caracteres no creo que fuera, sino, no la subiría bien después.

Voy a ello, gracias :)

Una última consulta, si tengo en una tabla dos varios campos A, B, C, D, E, F y quiero que en F me sume el resultado de B y D y muestre la suma en F, como lo añadiría al php que venimos hablando desde el principio?

Gracias de nuevo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 121
Ha disminuido 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

Update PHP

Publicado por Juan Luis ESP (35 intervenciones) el 18/09/2020 13:58:44
Buenas,

sobre lo que preguntas de:

1
Una última consulta, si tengo en una tabla dos varios campos A, B, C, D, E, F y quiero que en F me sume el resultado de B y D y muestre la suma en F, como lo añadiría al php que venimos hablando desde el principio?

Decirte que la query sería algo así:

1
UPDATE tabla SET campoF = campoB + campoD;

Esto actuaría sobre toda la tabla. Si quieres que sea sólo sobre ciertos registros habrá que añadirle un WHERE...

También comentarte que, si los campos B y D pueden ser nulos, qué debería sumar?

Yo lo que hago, en esos casos es setearlo a cero.

1
UPDATE tabla SET campoF = IFNULL(campoB, 0) + IFNULL(campoD, 0);


Un saludo!
Juan Luis
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 18
Ha aumentado su posición en 6 puestos en PHP (en relación al último mes)
Gráfica de PHP

Update PHP

Publicado por Víctor (6 intervenciones) el 18/09/2020 16:28:51
Si el campo es nulo, exacto, tomarlo como un 0 y sumar el otro valor + 0.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 18
Ha aumentado su posición en 6 puestos en PHP (en relación al último mes)
Gráfica de PHP

Update PHP

Publicado por Víctor (6 intervenciones) el 18/09/2020 18:23:07
Y finiquitado, todo perfecto, muchas gracias a todos :)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 18
Ha aumentado su posición en 6 puestos en PHP (en relación al último mes)
Gráfica de PHP

Update PHP

Publicado por Víctor (6 intervenciones) el 18/09/2020 20:51:01
Siento abusar, ahora me surge una duda, como cambiaría ese código, para que en vez de tener que subir el fichero, lo cogiera del propio servidor.

La idea, es que en vez de tener que subir el fichero cada X tiempo, tengo un script en python que me genera los ficheros, la idea es tener un php que se ejecute por cronjobs cada X horas y que la tarea se haga automáticamente sin necesidad de tener que ir subiendo el fichero.

Lo que no se, es como cambiar todo para que lo coja desde el propio servidor en vez del sistema que tengo ahora de subirlo manualmente.

Gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 121
Ha disminuido 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

Update PHP

Publicado por Juan Luis ESP (35 intervenciones) el 19/09/2020 09:51:52
Buenas de nuevo,
pues para adaptarlo a lo que quieres apenas tienes que cambiar nada.

Quita todo lo relativo a _FILES, pues ya no te va a hacer falta.
Comprueba que el fichero exista con file_exists(ruta) y, en tal caso, lo abres con fopen(ruta, modo).

La ruta, si el fichero está en el mismo directorio que el script, no hace falta que pongas nada del path, sino directamente el nombre del fichero.
Si está en otro directorio, tienes que indicárselo, tal como:

fopen("/var/www/files/mi_fichero.csv", "r");

El fichero y directorio deben tener permisos suficientes para acceder y ser leídos.

Creo que nada más, ya nos cuentas.

Un saludo,
Juan Luis
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 18
Ha aumentado su posición en 6 puestos en PHP (en relación al último mes)
Gráfica de PHP

Update PHP

Publicado por Víctor (6 intervenciones) el 19/09/2020 12:21:31
Perfecto todo, gracias, he tenido que añadir algunas cosas, puesto que lo estaba ejecutando desde otro servidor y me daba un error de conexión, pero vamos, dar acceso a la ip del otro servidor y un par de modificaciones en el php y todo listo.

Ahora a pelear con el crontab para que lo ejecute cada X horas.

Gracias a todos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar