'Isset' 应该避免代码的执行

问题描述

我对我的问题进行了很多搜索,但我终于问你了..所以感谢你阅读:)!

这是我的代码

<?PHP

if(isset($_POST['clearbutton'])){
  $myfile = fopen('letxt.txt','w') or die('Unable to open file!');
  ftruncate($myfile,0);
  fclose($myfile);
  echo "c'est trunqué!"; // TEST
  var_dump(isset($_POST['okbutton']));
  var_dump(isset($_POST['clearbutton']));
}

if(empty($_POST['pseudo']) || empty($_POST['msg']) && isset($_POST['okbutton'])){

  echo "Tu n'as pas rempli le pseudo ou le msg !";
  var_dump(isset($_POST['okbutton'])); // TEST
  var_dump(isset($_POST['clearbutton'])); // TEST

}
elseif(!empty($_POST['pseudo']) && !empty($_POST['msg'])){
  $myfile = fopen('letxt.txt','a+') or die ("Unable to open file!");
  $pseudo = $_POST['pseudo'];
  $msg = $_POST['msg'];
  fwrite($myfile,$pseudo);
  fwrite($myfile,' : ');
  fwrite($myfile,$msg);
  fwrite($myfile,' <br>');
  fclose($myfile);
}

$myfile = fopen('letxt.txt','r') or die("Unable to open file!");
if(filesize('letxt.txt') > 0){
echo fread($myfile,filesize('letxt.txt'));
fclose($myfile);
}
else
  echo "..";

?><!doctype html>
<html lang="fr">
<head>
  <Meta charset="utf-8">
  <title>Titre de la page</title>
</head>
<body>

    <form name="form1" method="POST" action="#">
    <input type="text" name="pseudo" placeholder="Entrez votre pseudo..">
    <input type="text" name="msg" placeholder="Entrez votre message..">
    <button type="submit" name="okbutton">Envoyer</button>
    </form>

    <form name="form2" method="POST" action="#">
    <button type="submit" name="clearbutton">Clear Chat</button>
    </form>

</body>
</html>

所以一切正常(如果你有想法让这段代码更好或更容易,我会接受!我是一名学生。)除了如果我使用 clearbutton,它也会输入第二个条件,所以告诉我“tun'as pas rempli le pseudo ou le msg!”和两个 v​​ar_dumps。

我怎样才能避免它?如果我按 clearbutton,只有第一个 if 应该被执行对吗?因为当我按下 var_dump

时,okbutton 告诉我 clearbutton 是假的

感谢您的回答! :D

解决方法

不是真的。

isset 检查具有给定数组键的变量是否存在。如果是,它将进入 if。但是代码会继续执行。

您的下一个 if 检查 2 个 or 条件。 empty($_POST['pseudo'])empty($_POST['msg']) && isset($_POST['okbutton']。 如果其中任何一个是 true,它也会进入这个 if

如果您想单独执行这些 if,它应该如下所示:

if (isset($_POST['clearbutton'])) { // first check,if false go futher,if true execute only this one
  $myfile = fopen('letxt.txt','w') or die('Unable to open file!');
  ftruncate($myfile,0);
  fclose($myfile);
  echo "c'est trunqué!"; // TEST
  var_dump(isset($_POST['okbutton']));
  var_dump(isset($_POST['clearbutton']));
} elseif (empty($_POST['pseudo']) || empty($_POST['msg']) && isset($_POST['okbutton'])) { // second check if first is false
  echo "Tu n'as pas rempli le pseudo ou le msg !";
  var_dump(isset($_POST['okbutton'])); // TEST
  var_dump(isset($_POST['clearbutton'])); // TEST
} elseif (!empty($_POST['pseudo']) && !empty($_POST['msg'])) { // third check if first and second are false
  $myfile = fopen('letxt.txt','a+') or die ("Unable to open file!");
  $pseudo = $_POST['pseudo'];
  $msg = $_POST['msg'];
  fwrite($myfile,$pseudo);
  fwrite($myfile,' : ');
  fwrite($myfile,$msg);
  fwrite($myfile,' <br>');
  fclose($myfile);
}

// code below will be executed anyway,it doesn't matter what happens above (except die)

$myfile = fopen('letxt.txt','r') or die("Unable to open file!"); 

if (filesize('letxt.txt') > 0) {
  echo fread($myfile,filesize('letxt.txt'));
  fclose($myfile);
} else {
  echo "..";
}

// (...)
,

让我们看看这一行:

if(empty($_POST['pseudo']) || empty($_POST['msg']) && isset($_POST['okbutton'])){

观察:

  • 即使第一个 if 为真,这也可能会被评估;如果您想避免在第一个 if 为真时甚至考虑这一点,请使用 elseif
  • PHP 在此处从左到右计算您的逻辑运算符,因此上面的条件等效于 (empty($_POST['pseudo']) || empty($_POST['msg'])) && isset($_POST['okbutton'])

一般来说,在同一级别的标准中改变分离式和连接式表达式是一个坏主意。最好将其转换为 disjunctive normal formconjunctive normal form,您可以使用 De Morgan's laws 来规范化您的标准。