En lugar de colocar algunos datos en un name
atributo, haga el name
atribuye algo que sabes y usa el value
atribuye los datos desconocidos, el nombre en este caso.
Entonces
<input type='hidden' name='" . $tab[$x][1] . "' />
se convierte
<input type='hidden' name="thename" value='" . $tab[$x][1] . "' />
Ahora en el PHP ya sabes qué buscar. Así que todo lo que tenemos que arreglar ahora es el ataque de inyección SQL problemas, lo hacemos preparando la consulta con un parámetro y luego vinculando un valor al parámetro como este
<?php
session_start();
if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST["delete-submit"]))
{
require "dbh.ext.php";
// add a parameter to the query and not a concatenated value
$sql = "DELETE FROM `persons` WHERE `name` = ?";
$stmt = $conn->prepare($sql);
// bind the value to the parameter
$stmt->bind_param('s', $_POST['thename']);
$res = $stmt->execute();
if (!$res) {
header("Location: ../persons/persons.php?error=sqlerror");
exit;
} else {
header("Location: ../persons/persons.php");
exit();
}
}