2017-12-01 22 views
0

プログラムから現在アクティブなユーザーをすべて引き出すWebサイトがあります。管理パネルでは、「キルスイッチ」が必要です。
ボタンSQLテーブル内のすべてのユーザーを削除するボタン

これは、ユーザーをSQLテーブル 'online'から引き出し、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> 

これは単にテーブルの行に各$ユーザーまたは$ num個を割り当てる$スタックものの行く、行は、ユーザーの電子メール、telefone番号、UNITIDとボタンが含まれています。

<?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

使用することができところで

フォームが投稿されたときに渡されるようにその特定のエントリのID – RamRaider

+0

ああええ、それを考えなかった!それを試みる! – TheGejr

答えて

0

特定のレコードごとにIDを送信するには、ループ内で生成されたフォームに隠しフィールドを入れてから、スクリプトの削除部分に$passedIDの値として$_POST['id']を使用します。

<?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); 
} 
0

フォームを送信するときには、$ _POST [ 'numは']忘れてしまいました。あなたは、ループ内のフォームは〜、おそらくあなたはそこで隠しフィールドを持つべき削除機能に任意のID値を渡していない。この場合IDのGET?> "> killClick

関連する問題