Skip to content
Advertisement

query gives the same result multiple times

I am doing a CRUD and I’m doing the edit part, I have multiple tables that are related to each other by foreign key, like for example the table ’empleados’ has the foreign key ‘rela_usuarios’ which belongs to the usuarios table and I don’t know how to relate them, so I save the query of usuarios inside a variable and put it on empleados as foreign key. Is that the problem is it another thing?

$ididEm= $_POST['idEm'];
$idPer=$_POST['idPer'];
$apellido= $_POST['apellido'];
$nombre= $_POST['nombre'];
$usuario= $_POST['usuario'];
$contraseña= $_POST['contraseña'];
$tipoCon= $_POST['tipoCon'];
$valCon= $_POST['valCon'];
$id_perfil=2;
$id_per_estado=1;


$sql="UPDATE personas " 
 ." SET nombre='$nombre', apellido='$apellido'"
 ." WHERE id_persona=".$idPer;
mysqli_query($conexion, $sql);

$sql="UPDATE tipocontacto"
." SET tipo_decontacto=$tipoCon";
mysqli_query($conexion, $sql);

$sql="UPDATE persona_contacto "
."SET rela_persona=$idPer,id_tipocontacto=$tipoCon, valor='$valCon' ";
mysqli_query($conexion, $sql);

$sql="UPDATE usuarios "
."SET username='$usuario', password='$contraseña', id_perfil=$id_perfil, id_persona=$idPer ";
$rela_usuario=mysqli_query($conexion, $sql);


$sql="UPDATE empleados "
."SET rela_persona=$idPer, id_per_estado=$id_per_estado, rela_usuario=$rela_usuario "
." WHERE id_empleado=".$idEm;

mysqli_query($conexion, $sql);

Also when I executed this all the other record got removed and got replaced by the last update

this is where the tables come from

$sql = "SELECT empleados.`id_empleado`, personas.`id_persona`,apellido, nombre, tipocontacto. id_tipocontacto,`tipo_decontacto`, persona_contacto.`valor`,
usuarios.`id_usuario`,`username`,`password`, perfiles.id AS 'id_perfil', descripcion  
FROM empleados "
."INNER JOIN personas ON empleados.rela_persona=personas.`id_persona` "
."INNER JOIN persona_contacto ON personas.`id_persona`=persona_contacto.`rela_persona` "
."INNER JOIN tipocontacto ON persona_contacto.`id_tipocontacto`=tipocontacto.`id_tipocontacto` "
."INNER JOIN usuarios ON empleados.`rela_usuario`=usuarios.`id_usuario` "
."INNER JOIN perfiles ON usuarios.`id_perfil`=perfiles.`id`  ";

Advertisement

Answer

When your SELECT is correct, you can do following code, it uses mysqli prepared Statments with parameters, this prevents sql injection.

Like all code this must be tested first with test data to verify that all works as intended.

Wesley Smith also explained in the comment that you should not save passwords as plain text

so please read https://www.php.net/manual/en/faq.passwords.php and https://dev.to/anastasionico/good-practices-php-security-how-to-manage-password-18bm

I used the password hashing already in the code below, see the article how you can verify it in your own code

$ididEm= $_POST['idEm'];
$idPer=$_POST['idPer'];
$apellido= $_POST['apellido'];
$nombre= $_POST['nombre'];
$usuario= $_POST['usuario'];
$contraseña= =password_hash($_POST['contraseña'], PASSWORD_DEFAULT);
$tipoCon= $_POST['tipoCon'];
$valCon= $_POST['valCon'];
$id_perfil=2;
$id_per_estado=1;
$query = "UPDATE empleados 
INNER JOIN personas ON empleados.rela_persona=personas.`id_persona` 
INNER JOIN persona_contacto ON personas.`id_persona`=persona_contacto.`rela_persona` 
INNER JOIN tipocontacto ON persona_contacto.`id_tipocontacto`=tipocontacto.`id_tipocontacto` 
INNER JOIN usuarios ON empleados.`rela_usuario`=usuarios.`id_usuario`
INNER JOIN perfiles ON usuarios.`id_perfil`=perfiles.`id`
SET personas.nombre=?,personas.apellido=?
,tipocontacto.tipo_decontacto=?
,persona_contacto.rela_persona=?,persona_contacto.id_tipocontacto=?, persona_contacto.valor=? 
,usuarios.username=?, usuarios.password=?, usuarios.id_perfil=?, usuariosid_persona=? 
,empleados.rela_persona=?, empleados.id_per_estado=?, empleados.rela_usuario=?
WHERE id_empleado=?;"

if ($stmt = mysqli_prepare($conexion, $query)) {
    mysqli_stmt_bind_param($stmt, "ssiiisssiiiiii",$nombre,$apellido,$tipoCon,$idPer,$tipoCon,$valCon,$usuario,$contraseña,$id_perfil,$idPer,$idPer,
    $id_per_estado,$rela_usuario,$idEm);

    /* Anweisung ausführen */
    mysqli_stmt_execute($stmt);
}
User contributions licensed under: CC BY-SA
3 People found this is helpful
Advertisement