查询多次给出相同的结果

时间:2020-10-24 20:42:24

标签: php mysql sql-update

我正在执行CRUD,正在执行编辑部分,我有多个通过外键相互关联的表,例如表'empleados'的外键'rela_usuarios'属于usuarios表,我不知道如何关联它们,因此我将usuarios的查询保存在一个变量中,并将其放在empleados上作为外键。问题是另一回事吗?

$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);

此外,当我执行此操作时,所有其他记录都被删除,并由上次更新替换

这是表格的来源

$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`  ";

1 个答案:

答案 0 :(得分:1)

当SELECT正确时,可以执行以下代码,它使用mysqli准备的带有参数的Statments,这可以防止sql注入。

就像所有代码一样,必须首先使用测试数据进行测试,以验证所有代码均按预期工作。

韦斯利·史密斯(Wesley Smith)在评论中还解释说,您不应该不保存密码作为纯文本

所以请阅读https://www.php.net/manual/en/faq.passwords.phphttps://dev.to/anastasionico/good-practices-php-security-how-to-manage-password-18bm

我已经在下面的代码中使用了密码哈希,请参阅本文,了解如何在自己的代码中进行验证

$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);
}