Stack Overflow en español Asked by Ramiro Bustos on January 8, 2021
Hola estoy intentando actualizar con PHP ‘valores’ en una tabla de una base de datos en MySQL con ‘valores’ de otra tabla en otra base de datos Mysql.
Con este codigo obtengo de MySQL los datos y guardarlos en arrays $arraySalarioNuevo y $arraySalarioNuevo hasta ahi he logrado hacer y haciendo un var_dump() me muestra que son arrays, igual con is_array() ambos me muestran que tengo los array guardados en esas variable.
<?php //conexion
$dbViejo = mysqli_connect("localhost", "root", "", "cursoempresa");
// consulta
$sql = "SELECT `IdEmpleado`,`Salario` FROM `empleado`";
$consulta = mysqli_query($dbViejo, $sql);
$fila = mysqli_fetch_array($consulta);$arraySalarioViejo = array();
while ($fila = mysqli_fetch_array($consulta)) {
foreach ($consulta as $fila => $value) {
$arraySalarioViejo[] = $value;
}
}//conexion a la otra base de datos
$dbNuevo = mysqli_connect("localhost", "root", "", "empresacurso");
// consulta
$sql = "SELECT `IdEmpleado`,`Salario` FROM `empleado`";
$consulta = mysqli_query($dbNuevo, $sql);
$fila = mysqli_fetch_array($consulta);$arraySalarioNuevo = array();
while ($fila = mysqli_fetch_array($consulta)) {
foreach ($consulta as $fila => $value) {
$arraySalarioNuevo[] = $value;
}
}
//
var_dump($arraySalarioViejo);
Arroja de resultado
array(5) { [0]=> array(2) { ["IdEmpleado"]=> string(1) "1" ["Salario"]=> string(4) "2000" } [1]=> array(2) { ["IdEmpleado"]=> string(1) "2" ["Salario"]=> string(4) "2000" } [2]=> array(2) { ["IdEmpleado"]=> string(1) "3" ["Salario"]=> string(4) "2000" } [3]=> array(2) { ["IdEmpleado"]=> string(1) "4" ["Salario"]=> string(4) "2000" } [4]=> array(2) { ["IdEmpleado"]=> string(1) "5" ["Salario"]=> string(4) "2000" } }
var_dump($arraySalarioNuevo);
Arroja de resultado
array(5) { [0]=> array(2) { ["IdEmpleado"]=> string(1) "1" ["Salario"]=> string(3) "999" } [1]=> array(2) { ["IdEmpleado"]=> string(1) "2" ["Salario"]=> string(3) "999" } [2]=> array(2) { ["IdEmpleado"]=> string(1) "3" ["Salario"]=> string(3) "999" } [3]=> array(2) { ["IdEmpleado"]=> string(1) "4" ["Salario"]=> string(3) "999" } [4]=> array(2) { ["IdEmpleado"]=> string(1) "5" ["Salario"]=> string(3) "999" } }
¿Como hago para actualizar los valores de ‘Salario’ en el array $arraySalarioViejo con los valores de ‘Salario’ del array $arraySalarioNuevo y subirlos nuevamnte a la base de datos que corresponde?
Primero, estás haciendo el trabajo dos veces:
$fila = mysqli_fetch_array($consulta); // obtienes la fila 1 como array numérico
// $fila es ["1", "2000"]
$arraySalarioViejo = array();
while ($fila = mysqli_fetch_array($consulta)) { // obtienes la fila 2
// $fila es ["2", "2000"]
foreach ($consulta as $value) { // extraes las 5 filas como array asociativo
// $values es, por ejemplo ['idEmpleado'=>1, 'Salario'=>2000]
$arraySalarioViejo[] = $value;
}
}
Estás extrayendo una fila que no va a ninguna parte, una segunda fila en el bucle while
, luego 5 filas en el foreach
y el while
sólo itera una vez, porque después del foreach
vaciaste el stack.
Bastaría con:
$consulta = mysqli_query($dbViejo, $sql);
$arraySalarioViejo=[];
foreach ($consulta as $value) { // extraes las 5 filas como array asociativo
$arraySalarioViejo[] = $value;
}
(esto en php 5.4+, antes el mysql_result no era iterable)
Para trasvasijar los datos, lo más sano es crear un statement asociado a la conexión vieja, y ejecutarlo en cada fila del array nuevo.
Usando tu código enfocado a procedimientos:
$update_sentence="UPDATE empleado set Salario=? where idEmpleado=?";
if ($stmt = mysqli_prepare($dbViejo, $update_sentence)) {
foreach($arraySalarioNuevo as $nuevaData) {
/* asociar parámetros de la fila */
mysqli_stmt_bind_param(
$stmt, "ss",
$nuevaData['Salario'] ,
$nuevaData['idEmpleado']
);
/* ejecutar el statement en cada iteración */
if(!$update_result = mysqli_stmt_execute($stmt)) {
// Si hubo errores, mostrarlos
printf("Error: %s.n", mysqli_stmt_error($sentencia));
}
}
/* cerrar el statement () */
mysqli_stmt_close($stmt);
}
Esto podrías hacerlo incluso sin un array de paso y sin correr un select en la BBDD vieja, quedando:
<?php
$dbViejo = mysqli_connect("localhost", "root", "", "cursoempresa");
/* verificar la conexión */
if (mysqli_connect_errno()) {
printf("Falló la conexión dbViejo: %sn", mysqli_connect_error());
exit();
}
$dbNuevo = mysqli_connect("localhost", "root", "", "empresacurso");
if (mysqli_connect_errno()) {
printf("Falló la conexión dbNuevo: %sn", mysqli_connect_error());
exit();
}
$select_sentence = "SELECT `IdEmpleado`,`Salario` FROM `empleado`";
$result = mysqli_query($dbNuevo, $select_sentence);
if (!$result) {
printf("Error: %s.n", mysqli_error($dbNuevo));
exit();
}
$update_sentence = "UPDATE empleado set Salario=? where idEmpleado=?";
if ($stmt = mysqli_prepare($dbViejo, $update_sentence)) {
foreach ($result as $nuevaData) {
var_dump($nuevaData);
// asociar parámetros de la fila
mysqli_stmt_bind_param(
$stmt, "sd",
$nuevaData['Salario'] ,
$nuevaData['idEmpleado']
);
// ejecutar el statement en cada iteración
if (!$update_result = mysqli_stmt_execute($stmt)) {
printf("Error: %s.n", mysqli_stmt_error($sentencia));
exit();
}
}
// cerrar el statement ()
mysqli_stmt_close($stmt);
}
mysqli_free_result($result);
mysqli_close($dbNuevo);
mysqli_close($dbViejo);
Edit agregué manejo de errores para ayudarte a debuggear.
Edit 2 corregí el último ejemplo. Tenía campos con otros nombres :(
Correct answer by ffflabs on January 8, 2021
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP