TransWikia.com

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

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?

One Answer

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

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP