我有一个网站,我从一个程序中提取所有当前活跃用户,在管理面板中,我需要一个'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循环之外。
所以目前当我按下按钮时,它会删除表中“在线”的所有用户...为什么?我如何才能删除我点击的用户?
答案 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