问题描述
我对我的问题进行了很多搜索,但我终于问你了..所以感谢你阅读:)!
这是我的代码:
<?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!”和两个 var_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 form 或 conjunctive normal form,您可以使用 De Morgan's laws 来规范化您的标准。