PHP - Obtener registro específico de tabla SQL

 
Vista:
Imágen de perfil de Álvaro
Val: 65
Ha disminuido su posición en 4 puestos en PHP (en relación al último mes)
Gráfica de PHP

Obtener registro específico de tabla SQL

Publicado por Álvaro (22 intervenciones) el 10/12/2019 21:10:41
Buenos días / tardes / noches. Sigo realizando el proyecto de la tienda de libros online, y de momento marcha sin ninguna complicación muy grande. Hace un ratillo conseguí mostrar los usuarios registrados para que el administrador pudiera cambiarle los permisos (hacer a los usuarios administradores) o eliminar dichos usuarios. Aquí está la tabla con los datos:


Anotacion-2019-12-10-200328

Como se ve en la imagen, al lado de cada usuario hay dos botones, uno para realizar un update modificando el tipo de usuario y otro para eliminarlo. En caso del primero hago lo siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
include_once "../../model/Conexion.php";
 
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    if (isset($_POST["userEmail"])) {
        modificarPermisos($_POST["userEmail"]);
        header("Location: " . $_SERVER["HTTP_REFERER"]);
    }
}
 
function modificarPermisos($email)
{
    $conexion = new Conexion();
    $connection = $conexion->abrirConexion();
 
    if (isset($connection)) {
        $sql = "UPDATE UsuariosRegistrados SET esAdministrador = 1 WHERE email LIKE '" . $email . "'";
 
        $connection->prepare($sql)->execute();
 
    } else {
        die("Error en la conexión");
    }
 
}

En teoría no pasaría nada, salvo por el simple hecho de que el email que modifica siempre será el último registro de la tabla. La obtención de dicho email lo tengo de la siguiente manera:

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?php
 
$conexion = new Conexion();
$connection = $conexion->abrirConexion();
 
if (isset($connection)) {
    $sql = "SELECT nombre, email, fechaNacimiento, esAdministrador FROM UsuariosRegistrados";
    $query = $connection->query($sql)->fetchAll() or die("Consulta fallida");
 
 
    echo "<form action='../controller/Admin/ModificacionUsuarios.php' method='post'>";
    echo "<table class='table'>" . "<thead class='thead-dark'>" . "<tr>" . "<th scope='col'>Nombre</th>" . "<th scope='col'>Email</th>" . "<th scope='col'>Fecha de nacimiento</th>" . "<th scope='col'>Tipo de usuario</th>" . "<th scope='col'>Modificación</th>" . "</tr>" . "</thead>";
    echo "<tbody>";
 
 
    foreach ($query as $users) {
 
        echo "<tr>";
        echo "<td>" . $users["nombre"] . "</td>";
        echo "<td>" . $users["email"] . "</td>";
        echo "<td>" . $users["fechaNacimiento"] . "</td>";
        echo "<td>" . $users["esAdministrador"] . "</td>";
        echo "<td><button type='submit' class='btn btn-outline-elegant' style='margin-right: 5px'>Cambiar permiso</button> <button type='button' class='btn btn-outline-elegant'>Eliminar</button></td>";
        echo "<td><input type='hidden' name='userEmail' value='" . $users["email"] . "'></td>";
        echo "</tr>";
 
    }
 
    echo "</tbody>";
    echo "</table>";
    echo "</form>";
 
} else {
    die("Error de conexión");
}
 
$conexion->cerrarConexion();
 
 
?>

Utilizo un hidden con la intención de pasarle al método modificarPermisos un email específico, pero no me funciona. Agradecería cualquier ayuda / consejo.

Un saludo, y muchas gracias
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
sin imagen de perfil

Obtener registro específico de tabla SQL

Publicado por anonymous (53 intervenciones) el 11/12/2019 02:39:10
Yo no te recomendaría que realices un Update con un like para indicarle el campo a actualizar, y menos que el campo clave sea un email.

Primero porque el like es un operador muy peligroso y dependiendo de si le ubican comodines a izquierda o derecha, busca cualquier cosa parecida al criterio y te podría actualizar n registros al tiempo; y segundo tu tabla debería tener un id como Primary Key y debería ser ese el criterio en el where para garantizar que solo actualice un solo registro (Al que le pertenece ese Id), donde ya no utilizarías el like sino =

Es decir yo te recomiendo que a tu tabla le crees un PK numérico y así tu update te queda más seguro, porque estás modificando es permisos sobre el sistema, y se debe ser muy estricto con ello, algo así:

1
2
Update UsuariosRegistrados SET esAdministrador = 1
WHERE Usuario_id = '" . $Usuario_id  . "'";

Y tu código como está actualmente es susceptible de que te inyecten SQL maligno, pilas con eso.
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
Imágen de perfil de Álvaro
Val: 65
Ha disminuido su posición en 4 puestos en PHP (en relación al último mes)
Gráfica de PHP

Obtener registro específico de tabla SQL

Publicado por Álvaro (22 intervenciones) el 11/12/2019 02:50:50
Muchas gracias, lo tendré en cuenta, pero aún haciendo dicha modificación en el update me sigue actualizando el último registro de la tabla
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

Obtener registro específico de tabla SQL

Publicado por anonymous (53 intervenciones) el 11/12/2019 03:11:52
Te estás pasando siempre el último email, fijate bien que pases lo que tienes en el hidden (el email asociado a cada registro), porque tú no le estás pasando el email, ciertamente lo almacenas en un hidden pero luego no lo pasas

yo normalmente lo hago así

1
<a href="../Vistas/'.$Pagina.'?id='.base64_encode($vector_resultado[$i][0]).'" title="Editar datos" hidden="true"></a>

En mi caso $vector_resultado[$i][0] es el id del registro implicado (Sería tu email)

Fijate en esto: .$Pagina.'?id='.base64_encode($vector_resultado[$i][0]).

a $pagina que es el form que actualiza le llevo el ?id

Hazlo así, adapta este código al tuyo, estaré conectado
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

Obtener registro específico de tabla SQL

Publicado por anonymous (53 intervenciones) el 11/12/2019 03:32:24
Tu codigo al final debe quedarte más o menos así:

1
2
3
4
echo
'<td>
      <a href="../../model/Conexion.php '?userEmail=' . $users["email"] . '" title="Editar" ></a>
</td>';

Modifica y te puedes guiar con códigos mios en: https://github.com/jcorreal
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
Imágen de perfil de Álvaro
Val: 65
Ha disminuido su posición en 4 puestos en PHP (en relación al último mes)
Gráfica de PHP

Obtener registro específico de tabla SQL

Publicado por Álvaro (22 intervenciones) el 11/12/2019 03:38:47
Disculpa pero no termino de entender tu método ¿Te refieres a que lo ponga de la siguiente manera?

1
2
3
4
5
6
7
8
9
10
11
12
foreach ($query as $users) {
 
    echo "<tr>";
    echo "<td>" . $users["nombre"] . "</td>";
    echo "<td>" . $users["email"] . "</td>";
    echo "<td>" . $users["fechaNacimiento"] . "</td>";
    echo "<td>" . $users["esAdministrador"] . "</td>";
    echo "<td><button type='submit' class='btn btn-outline-elegant' style='margin-right: 5px'>Cambiar permiso</button> <button type='button' class='btn btn-outline-elegant'>Eliminar</button></td>";
    echo "<a href='../controller/Admin/ModificacionUsuarios.php' id='" . $users["email"] .  "' hidden='true'></a>";
    //echo "<input type='hidden' name='userEmail' value='" . $users["email"] . "'></td>";
    echo "</tr>";
}
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

Obtener registro específico de tabla SQL

Publicado por anonymous (53 intervenciones) el 11/12/2019 03:42:52
SI te debería funcionar, pero debes pasarle una incognita para que lo entienda como un parámetro así:

echo "<a href='../controller/Admin/ModificacionUsuarios.php'?id='" . $users["email"] . "' hidden='true'></a>";

Pero asi queda visible el prámetro en la url y queda susceptible de le apliquen sql injection, pruebalo asi, y luego te indico como lo proteges con base64_encode

Mira mi código:
1
2
3
4
echo
          '<td>
                   <a href="../Vistas/' . $Pagina . '?id=' . base64_encode($vector_resultado[$i][0]) . '" title="Editar datos"</a>
           </td>';

Y luego en el form que recibe esto creo una variable y recupero el valor así:
1
$id = base64_decode(filter_input(INPUT_GET, 'id'), FILTER_SANITIZE_NUMBER_INT);
Como tu leestas pasando un string cambia por FILTER_SANITIZE_NUMBER_INT FILTER_SANITIZE_STRING
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
Imágen de perfil de Álvaro
Val: 65
Ha disminuido su posición en 4 puestos en PHP (en relación al último mes)
Gráfica de PHP

Obtener registro específico de tabla SQL

Publicado por Álvaro (22 intervenciones) el 11/12/2019 03:47:29
Pues temo decir que no me funciona Quizá el fallo lo tenga en el código donde "proceso" dichos datos. Lo tengo de la siguiente manera:

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
26
27
28
<?php
include_once "../../model/Conexion.php";
 
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    if (isset($_POST["userEmail"])) {
        modificarPermisos($_POST["userEmail"]);
        echo "Email de usuario -> " . $_POST["userEmail"];
        header("Location: " . $_SERVER["HTTP_REFERER"]);
    } else {
        echo "No ha ocurrido nada";
    }
}
 
function modificarPermisos($email)
{
    $conexion = new Conexion();
    $connection = $conexion->abrirConexion();
 
    if (isset($connection)) {
        $sql = "UPDATE UsuariosRegistrados SET esAdministrador = 1 WHERE email LIKE '" . $email . "'";
 
        $connection->prepare($sql)->execute();
 
    } else {
        die("Error en la conexión");
    }
 
}

El código que acabo de adjuntar es el del fichero ModificacionUsuarios.php, justo el que se menciona en el action del form y el en href del enlace:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
echo "<form action='../controller/Admin/ModificacionUsuarios.php' method='post'>";
echo "<table class='table table-fixed table-bordered table-hover'>" . "<thead class='thead-dark'>" . "<tr>" . "<th scope='col'>Nombre</th>" . "<th scope='col'>Email</th>" . "<th scope='col'>Fecha de nacimiento</th>" . "<th scope='col'>Tipo de usuario</th>" . "<th scope='col'>Modificación</th>" . "</tr>" . "</thead>";
echo "<tbody>";
 
foreach ($query as $users) {
 
    echo "<tr>";
    echo "<td>" . $users["nombre"] . "</td>";
    echo "<td>" . $users["email"] . "</td>";
    echo "<td>" . $users["fechaNacimiento"] . "</td>";
    echo "<td>" . $users["esAdministrador"] . "</td>";
    echo "<td><button type='submit' class='btn btn-outline-elegant' style='margin-right: 5px'>Cambiar permiso</button> <button type='button' class='btn btn-outline-elegant'>Eliminar</button></td>";
    echo "<a href='../controller/Admin/ModificacionUsuarios.php' id='" . $users["email"] .  "' hidden='true'></a>";
    //echo "<input type='hidden' name='userEmail' value='" . $users["email"] . "'></td>";
    echo "</tr>";
}
 
echo "</tbody>";
echo "</table>";
 
echo "</form>";
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

Obtener registro específico de tabla SQL

Publicado por anonymous (53 intervenciones) el 11/12/2019 04:07:09
Ponlo así:

1
echo "<a href='../controller/Admin/ModificacionUsuarios.php'?id='" . $users["email"] .  '" title="Cambiar Permiso" ></a>;

Y luego en el action del form capturas el valor así:

1
$id = base64_decode(filter_input(INPUT_GET, 'id'), FILTER_SANITIZE_STRING);

Si no logras que te funcione tendras que instalarte algun programa para hacerte remoto (Team Viewer) y mirar porque no funciona
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
Imágen de perfil de Álvaro
Val: 65
Ha disminuido su posición en 4 puestos en PHP (en relación al último mes)
Gráfica de PHP

Obtener registro específico de tabla SQL

Publicado por Álvaro (22 intervenciones) el 11/12/2019 04:16:07
Supongo que te refieres a esto..

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
26
27
if (isset($connection)) {
    $sql = "SELECT nombre, email, fechaNacimiento, esAdministrador FROM UsuariosRegistrados";
    $query = $connection->query($sql)->fetchAll() or die("Consulta fallida");
    $id = base64_decode($tabla= filter_input(INPUT_GET, 'id'), FILTER_SANITIZE_STRING);
 
 
    echo "<form action='$id' method='post'>";
    echo "<table class='table table-fixed table-bordered table-hover'>" . "<thead class='thead-dark'>" . "<tr>" . "<th scope='col'>Nombre</th>" . "<th scope='col'>Email</th>" . "<th scope='col'>Fecha de nacimiento</th>" . "<th scope='col'>Tipo de usuario</th>" . "<th scope='col'>Modificación</th>" . "</tr>" . "</thead>";
    echo "<tbody>";
 
    foreach ($query as $users) {
 
        echo "<tr>";
        echo "<td>" . $users["nombre"] . "</td>";
        echo "<td>" . $users["email"] . "</td>";
        echo "<td>" . $users["fechaNacimiento"] . "</td>";
        echo "<td>" . $users["esAdministrador"] . "</td>";
        echo "<td><button type='submit' class='btn btn-outline-elegant' style='margin-right: 5px'>Cambiar permiso</button> <button type='button' class='btn btn-outline-elegant'>Eliminar</button></td>";
        echo "<a href='../controller/Admin/ModificacionUsuarios.php?id=" . $users["email"] ."' hidden='true'></a>";
        //echo "<input type='hidden' name='userEmail' value='" . $users["email"] . "'></td>";
        echo "</tr>";
    }
 
    echo "</tbody>";
    echo "</table>";
 
    echo "</form>";

Es que sigo sin comprender que es lo que hace
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
Imágen de perfil de Álvaro
Val: 65
Ha disminuido su posición en 4 puestos en PHP (en relación al último mes)
Gráfica de PHP

Obtener registro específico de tabla SQL

Publicado por Álvaro (22 intervenciones) el 11/12/2019 04:23:02
No quisiera causar más molestias de lo que ya hago. ¿Lo ha hecho de alguna otra manera? Para saber si hay más opciones
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

Obtener registro específico de tabla SQL

Publicado por anonymous (53 intervenciones) el 11/12/2019 04:49:49
Instala Team Viewer y lo solucionamos

Intenta crear solo un haref sin pasarle nada
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
Imágen de perfil de Álvaro
Val: 65
Ha disminuido su posición en 4 puestos en PHP (en relación al último mes)
Gráfica de PHP

Obtener registro específico de tabla SQL

Publicado por Álvaro (22 intervenciones) el 11/12/2019 04:07:05
Lamento ser tan 'negado' para entender tu código.. Pero es que no lo entiendo Tengo el código como creo que me has dicho que es, quizá me haya equivocado en algo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
echo "<form action='../controller/Admin/ModificacionUsuarios.php' method='post'>";
echo "<table class='table table-fixed table-bordered table-hover'>" . "<thead class='thead-dark'>" . "<tr>" . "<th scope='col'>Nombre</th>" . "<th scope='col'>Email</th>" . "<th scope='col'>Fecha de nacimiento</th>" . "<th scope='col'>Tipo de usuario</th>" . "<th scope='col'>Modificación</th>" . "</tr>" . "</thead>";
echo "<tbody>";
 
foreach ($query as $users) {
 
    echo "<tr>";
    echo "<td>" . $users["nombre"] . "</td>";
    echo "<td>" . $users["email"] . "</td>";
    echo "<td>" . $users["fechaNacimiento"] . "</td>";
    echo "<td>" . $users["esAdministrador"] . "</td>";
    echo "<td><button type='submit' class='btn btn-outline-elegant' style='margin-right: 5px'>Cambiar permiso</button> <button type='button' class='btn btn-outline-elegant'>Eliminar</button></td>";
    echo "<a href='../controller/Admin/ModificacionUsuarios.php?userEmail=" . $users["email"] ."' hidden='true'></a>";
    //echo "<input type='hidden' name='userEmail' value='" . $users["email"] . "'></td>";
    echo "</tr>";
}
 
echo "</tbody>";
echo "</table>";
 
echo "</form>";

Pero nada de nada, no me funciona
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