按钮删除SQL表中的所有用户

时间:2017-12-01 09:07:33

标签: php mysql button foreach

我有一个网站,我从一个程序中提取所有当前活跃用户,在管理面板中,我需要一个'kill switch'。

它将用户从SQL表中“联机”,并使php成为一个数组。

<?php
    $stack = array();
    for($id = 1; $id <= 20; $id++)
    {
        $db = Database::getInstance();

        $stmt = $db->prepare('SELECT * FROM online WHERE id = :id LIMIT 1');
        $stmt->execute([':id' => $id]);
        $user = $stmt->fetchObject('User');
        array_push($stack, $user);
    }
?>

这会通过表循环并使所有在线用户的ID为[1; 20]。 然后它将$ user堆叠在数组$ stack中。

<table>
    <thead><tr><th colspan="4"><span>Online right now</span></th></tr><tr><th colspan="4"> </th></tr><tr><th><span>E-Mail</span></th><th><span>Telefone</span></th><th><span>Unit ID</span></th></tr></thead>
    <tbody>
        <?php foreach ($stack as $num) : ?>
            <?php if($num != null) : ?>
                <tr>
                    <th><?=htmlspecialchars($num->email) ?></th>
                    <th><?=htmlspecialchars($num->telefone) ?></th>
                    <th><?=htmlspecialchars($num->unitid) ?></th>
                    <th><form action="thisPage.php" method="post"><input type="submit" name="killClick" value="Kill"/></form></th>
                </tr>
            <?php endif ?>
        <?php endforeach ?>
    </tbody>
</table>

这只是通过$ stack将每个$ user或$ num分配给表中的一行,该行包含用户电子邮件,telefone号,unitID和a按钮。

<?php
    if($_SERVER['REQUEST_METHOD'] == "POST" and isset($_POST['killClick']))
    {
        $passedId = $num->id;

        try
        {
            $db = Database::getInstance();

            $stmt = $db->prepare('DELETE FROM online WHERE id = :id LIMIT 1');
            $stmt->execute([':id' => $passedId]);
        }
        catch (PDOException $exception)
        {
            error_log($exception->getMessage());
            return false;
        }
    }
?>

上面的PHP位于同一页面上,位于foreach循环之外。

所以目前当我按下按钮时,它会删除表中“在线”的所有用户...为什么?我如何才能删除我点击的用户?

2 个答案:

答案 0 :(得分:0)

要发送每个特定记录的ID,请在循环中生成的表单中包含隐藏字段,然后使用$_POST['id']作为脚本删除部分中的$passedID值。

<?php
    if( $_SERVER['REQUEST_METHOD']=="POST" and isset( $_POST['killClick'],$_POST['id'] ) ) {

        $passedId = $_POST['id'];

        try {
            $db = Database::getInstance();

            $stmt = $db->prepare('DELETE FROM online WHERE id = :id LIMIT 1');
            $stmt->execute( [ ':id' => $passedId ] );
        } catch( PDOException $exception ) {
            error_log( $exception->getMessage() );
            return false;
        }
    }
?>




<table>
    <thead>
        <tr>
            <th colspan='4'><span>Online right now</span></th>
        </tr>
        <tr>
            <th colspan='4'></th>
        </tr>
        <tr>
            <th><span>E-Mail</span></th>
            <th><span>Telefone</span></th>
            <th><span>Unit ID</span></th>
        </tr>
    </thead>
    <tbody>
        <?php foreach ($stack as $num) : ?>
            <?php if($num != null) : ?>
                <tr>
                    <th><?=htmlspecialchars($num->email) ?></th>
                    <th><?=htmlspecialchars($num->telefone) ?></th>
                    <th><?=htmlspecialchars($num->unitid) ?></th>
                    <th>
                        <form action='thisPage.php' method='post'>
                            <input type='hidden' name='id' value='<?=$num->id;?>' />
                            <input type='submit' name='killClick' value='Kill'/>
                        </form>
                    </th>
                </tr>
            <?php endif ?>
        <?php endforeach ?>
    </tbody>
</table>

您可以使用between运算符而不是使用循环来简化第一个SQL查询。

即:

$num=array();
$db = Database::getInstance();

$sql='select * from `online` where `id` between :id_low and :id_high;';
$stmt=$db->prepare( $sql );

if( $stmt ){
    $stmt->execute( array( ':id_low'=>1, ':id_high'=>20 ) );
    $num=$stmt->fetchAll( PDO::FETCH_OBJ );
}

答案 1 :(得分:0)

提交表单时忘记了$ _POST [&#39; num&#39;]。

顺便说一下,你可以在这种情况下使用GET id吗?&gt;&#34;&gt; killClick