En el siguiente formulario, estoy creando un bucle, pero necesito un nombre (s) de entrada único. El nombre "API_KEY" y nombre "Delete_Button" debe ser algo así como "api_key_0" "api_key_1", etc. y eliminar_button_1, eliminar_button_2, etc. ¿Cómo obtengo nombres únicos en el bucle? Segunda parte: ¿Cómo obtengo variables dentro de los $ _post que son los nombres de entrada correctos creados en el bucle? Necesito pasar los nombres de las variables correctas a los $ _post para cada botón de eliminación y la tecla API.

<?php // Delete API code. 
        if(isset($_POST['delete_button'])) {
            $delete_api_key = $_POST['api_key'];
            if ($mysqli->query("DELETE FROM api_keys WHERE api_key = '$delete_api_key'")) {
             echo "API Key Successfully Deleted.";      
            }
             else {
                echo "Error:" . $mysqli->error;
                    }
            }
    ?>

Formar parte:

<?php
if ($api_cnt >= 1) {

    $list_api_keys = $mysqli->query("SELECT api_key, user FROM api_keys WHERE user = 'testuser'");
?>


<form method= "post" action ="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
<table>
<tr>
<th>API Keys</th>
</tr>
<?php
    while($row = mysqli_fetch_row($list_api_keys)) {

?>
<tr>
<td><input name = "api_key" type = "hidden" value="<?php echo $row[0]; ?>"><?php echo $row[0]; ?></td> 
<td><input type = "submit" name = "delete_button"  value = "Delete"></td>
</tr>
<?php
    }
?>
</form>
</table>
<?php
$mysqli->close();
}
?>
0
nwood21 29 may. 2021 a las 22:25

3 respuestas

La mejor respuesta

Para hacerlo así, realmente necesita múltiples formas cada una con sus propios datos y presentar el botón. Solo se puede enviar uno. Salí de un html para mantenerlo corto:

<?php while($row = mysqli_fetch_row($list_api_keys)) { ?>
<form method= "post" action ="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
<table>
<tr>
<td><input name = "api_key" type = "hidden" value="<?php echo $row[0]; ?>"></td> 
<td><input type = "submit" name = "delete_button"  value = "Delete"></td>
</tr>
</table>
</form>
<?php } ?>

Luego, simplemente consíguelo como solo se envió uno:

if(isset($_POST['delete_button'])) {
    $delete_api_key = $_POST['api_key'];
}

O podría hacer una forma y asignar el botón Enviar como una matriz con la identificación como la clave:

<form method= "post" action ="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
<table>
<?php while($row = mysqli_fetch_row($list_api_keys)) { ?>
<tr>
<td><input type = "submit" name = "delete_button[<?php echo $row[0]; ?>]"  value = "Delete"></td>
</tr>
<?php } ?>
</table>
</form>

Luego solo obtén la llave:

if(isset($_POST['delete_button'])) {
    $delete_api_key = key($_POST['delete_button']);
}
1
AbraCadaver 29 may. 2021 a las 22:36

Si solo va a enviar un par en ese momento, una solución más fácil sería crear diferentes formas (una por fila de tabla). Entonces solo se enviarán las entradas relevantes y siempre tendrán los mismos nombres.

<?php while($row = mysqli_fetch_row($list_api_keys)): ?>
    <tr>
    <td>
        <form method="post" action="">
            <input name="api_key" type="hidden" value="<?= $row[0]; ?>" /><?php echo $row[0]; ?>
    </td>
    <td>
            <input type="submit" name="delete_button" value="Delete" />
        </form>
    </td>
    </tr>
<?php endwhile ?>

Nota lateral: Dejar el action en el formulario vacío hará que el formulario se envíe a la página actual, por lo que es lo mismo que agregar htmlspecialchars($_SERVER["PHP_SELF"]). También agregar la etiqueta de formulario entre <table> y <tr> genere HTML no válido (lo mismo para agregarlo entre <tr> y <td>), por lo que lo he agregado dentro de la <td> 's.

Puede leer más sobre eso en "Contenido permitido" para Tabla y para tr

1
Magnus Eriksson 29 may. 2021 a las 19:53

Hay maneras más elegantes que esto, por ejemplo, proporcione puntos de verificación para cada uno y tenga un solo botón de eliminación, o use AJAX, pero con el enfoque que comenzó, recomendaría las etiquetas de formulario individuales para cada iteración.

<?php
  while($row = mysqli_fetch_row($list_api_keys)) {
?>
<tr>
<form method='post' action='deleteme.php'>
<td><input name="api_key" type="hidden" value="<?php echo $row[0]; ?>"><?php echo $row[0]; ?></td> 
<td><input type="submit" value="Delete"></td>
</tr>
</form>
<?php
    }
?>

Aquí está un enfoque AJAX primero, asegúrese de que la etiqueta del formulario circundante evite los enviados:

<form onsubmit='return false'>

Entonces

<?php
  while($row = mysqli_fetch_row($list_api_keys)) {
?>
<tr data-key="<?php echo $row[0]; ?>">
<td><?php echo $row[0]; ?></td> 
<td><button onclick='del(this);' > Delete</button></td>
</tr>
<?php
    }
?>

Con el script para facilitar la eliminación de la fila AJAX y posterior:

function del(el) {
let key = $(el).closest('tr').attr('data-key');
$.ajax({
  url: "delete.php",
  method: 'post',
  data: { api_key: key}
}).done(function(response) {
  if (response.indexOf('Error:') === -1)  $(el).closest('tr').remove();
  else alert("There was an error - " + response);
});
}

En su PHP, use declaraciones preparadas para protegerse y sus datos

$stmt = $mysqli->prepare("DELETE FROM api_keys WHERE api_key = ? LIMIT 1");
$stmt->bind_param("s", $_POST['api_key']);
$deleted = $stmt->execute();

if ($deleted) {
  echo "API Key Successfully Deleted.";      
}
0
Kinglish 29 may. 2021 a las 19:55