【问题标题】:A non-executing PHP if/else statement, with two choices for input submit button state非执行 PHP if/else 语句,输入提交按钮状态有两种选择
【发布时间】:2015-05-21 06:31:16
【问题描述】:

我能找到的最接近我当前困境的物理描述的是帖子HTML/PHP if-else Statement,其中主要问题相似性在于按钮状态更改。因为我没有在 twitter-bootstrap 中尝试任何东西,所以我的问题与那个参考点不同。我正在处理内容发布和撤回系统的(最初)糟糕的编码问题。

这段代码;

echo '<input type="submit" name="action" value="Edit" />'; 
if ($row['is_published'] || $row['date_published']) {
    if($action == 'Retract') {
        echo '<input type="submit" name="action" value="Retract"/>';
    } else {
            if($action == 'Publish') {
                echo '<input type="submit" name="action" value="Publish"/>';
            }
     }   
 }      

 if($row['access_level'] > 1 || $_SESSION['access_level'] > 1){
     echo '<input type="submit" name="action" value="$action" />';
 }
 echo'<input type="submit" name="action" value="Delete"/>';

将提交输入的结果返回为是;

 _____________ ____________ ____________
|             |            |            |
|    EDIT     |  $ACTION   |   DELETE   |
|_____________|____________|____________|

知道我做错了简单,因为$ACTION 输入的状态应该随着$action 变量是否受到影响而改变通过数据库状态变化(体现为$row['is_published'] || $row['date_published'])。我之前已经声明了$action 变量

$action = '';
    if (isset($_GET['action'])) $action = $_GET['action'];  

我很确定我的解决方案在于,我要么破坏了原始 if 语句中的嵌套 if/else,要么 $action 输入的回显无助于触发(条件)输入状态.我对发布/撤回内容的能力没有任何问题 - 只是让输入反映正确的状态,具体取决于内容是发布(使用“撤回”输入标签值)还是撤回(使用“发布”输入标签价值)。我什至玩弄了使用开关外壳的想法,但这有点像火车残骸 - 但不比我改编的 ORIGINAL VERSION 更重要;

if ($row[‘is_published’]) {
    $buttonType = “Retract”;
} else {
    $buttonType = “Publish”;
}
echo “<input type=’submit’ class=’submit’ “ .
    “name=’action’ value=’Edit’ /> “;
if (($row[‘access_lvl’] > 1) or ($_SESSION[‘access_lvl’] > 1)) {
    echo “<input type=’submit’ class=’submit’ “ .
          “name=’action’ value=’$buttonType’ /> “;
}  

真是一团糟,哈哈!

我很沮丧,反复阅读手动控制结构或咨询原始脚本控制流程都没有解决问题。也可能是我只见树木不见森林。恐怕我只是把自己看傻了......但我很确定这是人为错误,因为我永远无法让 $ACTION 输入状态根据内容状态而改变。

更新
现在,我处于数据库内容状态和输入标签状态一致同步的点(数据库内容处于 PUBLISHED 状态);

echo '<input type="submit" name="action" value="Edit" />'; 
if ($row['is_published'] || $row['date_published']) {

}                       
if($row['access_level'] > 1 || $_SESSION['access_level'] > 1){
if ($action=='Retract') {
      echo '<input type="submit" name="action" value="Publish"/>';
             } else {                
      echo '<input type="submit" name="action" value="Retract"/>';

     }         
    }
  }
echo'<input type="submit" name="action" value="Delete"/>';
  }  

以上代码;

结果返回

 _____________ ____________ ____________
|             |            |            |
|    EDIT     |  RETRACT   |   DELETE   |
|_____________|____________|____________|

正是我想看到的。但是,很不幸的是,即使数据库内容状态确实发生了变化——在这种情况下——允许撤回内容,点击时输入标签状态仍然保持不变。我很接近我可以品尝它。

真正让我大吃一惊的是,我必须手动更改 $action 变量和 echo 语句值以使输入/内容状态正确同步同步 - 这是 if 的重点首先是 /else 语句(哈哈!)

我的意思是,我什至像以前一样对比较运算符进行了一次小喷子 试图在某个地方引发一个无意的错误,这会导致解决方案,但是无论使用 =、== 还是 ===,它似乎都不会影响程序(我认为 = 肯定会动摇一些东西)。我了解else 用于替代编码块如果 如果条件为假。在这一点上尝试放弃“代码连枷”,但似乎需要更多阅读。

感谢所有人的目光/观点以及 @Darren@take 的精彩见解。我还是要砸烂这间公寓……

第二次更新

有一个“哎呀”的时刻;

echo '<input type="submit" name="action" value="Edit" />';  
if (empty($action) == 'Retract') {
      echo '<input type="submit" name="action" value="Publish"/>';
             } else { 
        if ($row['is_published'] || $row['date_published']) {
        if(empty($action) == 'Retract') {   
      echo '<input type="submit" name="action" value="Publish"/>';
    }
   }                
 }
 echo'<input type="submit" name="action" value="Delete"/>';  
}}}  

就因为我很忙,不需要马虎(代码重构获得完全相同的结果)。

第三次更新

echo '
<br>
<div class="searh_form">
<form method="POST" action="transact_blog.php">
<div>
 <input type="submit" name="action" value="Edit"/>
 <input type="submit" name="action" value="Delete"/>';

if($row['access_level'] > 1 || $_SESSION['access_level'] > 1){
if(!empty($row['date_published']) and !empty($row['is_published'])){
echo '<input type="submit" name="action" value="Publish"/>';
} else {
echo '<input type="submit" name="action" value="Retract"/>';
          }
       }
   }
}  

在中风的笑声和 Derp 级别的代码狂暴之间,我正处于精神/身体疲惫的地步。感谢@Sharky 和@Darren 对form 提交的建议,$action 变量被赋予了$_POST 初始化。可悲的是,我发现一个潜在的关键可能是我必须允许所有输入存在,然后执行某种is_array 爆炸来创建严格执行的条件功能。

对我来说,问题在于如何翻转输入 标签 状态以匹配数据库内容是否已发布或未发布。真的不能那么难。我几乎到了我正在考虑一些可以包装的 JS 或 jQuery 的地步,但我只是不想走那条路,除非绝对必要(我 确实 有“实用程序行“我在 PHP 中使用的回显 - 主要用于重复性任务,但我不愿意在 JS 上利用大型用户功能)。手动更改此部分;

if(!empty($row['date_published']) and !empty($row['is_published'])){
echo '<input type="submit" name="action" value="Publish"/>';
} else {
echo '<input type="submit" name="action" value="Retract"/>';
}  

通过剥离!empty() 并交换$action 变量值,我实现了使输入标签和数据库内容发布状态运行(所需)代码执行的能力。这方面是什么让我笑而不是哭(哈哈!)...更多阅读...

重要编辑

我决定删除该行

echo '<input type="submit" name="action" value="'.$_POST['action'].'" />';  

因为该流程仍按设计和实施方式执行,因此对于发布/撤消的功能并不重要。对我来说,分裂是(仍然是)我无法弄清楚如何使$action 变量抓住'Retract' / 'Publish' 值。 ...更多阅读。

上次更新

快要失去它了……自从我完全停止了自己的轨道以来已经有 11 天了。我一直读到我昏倒了,代码被反复敲打,有一些我认为我已经确定的功能再次成为问题(再次被钉平),并且在迅速成为我个人的第九圈中一圈又一圈编码地狱;

if($row['access_level'] > 1 || $_SESSION['access_level'] > 1){ 
  if(empty($row['is_published']) || $action != 'Retract'){
            echo '<input type="submit" name="action" value="Publish"/>';
  }
  elseif($row['is_published'] || $action != 'Publish'){
        echo '<input type="submit" name="action" value="Retract"/>';
  } 
}   

$action 变量(我根据@Darren 和@Sharky 的建议POSTed)在代码前面是isset

$action = false;
if(isset($_POST['action'])){
   $action = $_POST['action'];
} 
echo $action;  

在这一点上,我处于隐居的高级状态,并且正在快速接近精神失修。在这整个肮脏的混乱中,唯一的积极因素是,我发现自己从 MANUALLY 交换前代码块中两个回声的位置这一严峻事实中挖掘出幽默感是更改输入标签状态以响应数据库内容状态(已发布或已收回)而不是 if...else if 语句的原因。我简直不敢相信在我最近翻倒的任何岩石下连一根指针都没有。只是一大堆糟糕的建议和过时的解决方案(甚至都行不通,哈哈!)。如果我能找到一种方法来迫使回声交换位置,我会很高兴。 :longsigh: 现在,无论如何都是必要的......

最后一道防线(必要的/请求的慈悲杀死)

我只是不知道还能做什么......似乎我已经用尽了所有可能让输入标签状态从“撤回”“发布”“翻转”。在这一点上,我怀疑这可能是一个纯 PHP 解决方案。实际上与这个(可怕的)代码概念起源的出版商取得了联系,并且被“我们会将此信息提供给响应方(大声笑!)”。在这一点上,我只是乞求任何关于如何去做这件事的线索。

我已将其隔离为(我在想的是)if/elseELSE 部分是罪魁祸首,但我不知道如何像我成功地那样去强制影响它在if 部分;

CODE:
-----
echo '<br><div class="searh_form"><form method="post" action="transact_article.php"><div>';

echo '<p><br>';
echo '<input type="submit" name="action" value="Edit"/>';
foreach ($_POST as $key => $value) {
$submitted_array = array_keys($_POST, [0], $action);
echo ($_POST['action'][$submitted_array[0]] . " " . $submitted_array[0]);
}
if (empty($row['is_published']) || !$row['is_published'] && empty($row['date_published']) || !$row['date_published'] && $action != $_POST['action']  || $action != '') {
$action = "Publish";
}else{
if (!empty($row['is_published']) || $row['is_published'] && $row['date_published'] || $row['date_published'] && $action == $_POST['action']  || $action != $_GET['action']) {
$action = "Retract";
}}
if (($row['access_level'] > 1) || ($_SESSION['access_level'] > 1)) {
echo '<input type="submit" name="action" value="'.$action.'" />';
}

echo '<input type="submit" name="action" value="Delete" />';
}}
?>
<input type="hidden" name="article_id" value="<?php echo $_GET['id']; ?>"/>
</p>
</form>

  RESULT:  
  -------
   _____________ ____________ ____________
  |             |            |            |
  |    EDIT     |  PUBLISH   |   DELETE   |
  |_____________|____________|____________|  

再就业行
echo '&lt;input type="submit" name="action" value="$action" /&gt;';
允许我实现上述结果 - 这正是我需要在编辑/发布之前显示所有待处理内容的方式。拜托,当数据库内容状态的更新获得批准时,我可以做些什么来让我的标签翻转到“撤回”,我很谦虚地询问。感谢您提供 ANY 额外的指示。我在这方面的绳索尽头......

以理智的名义需要什么?!?!?
二元数组的声明:

$buttonType = array('Publish', 'Retract');

当我了解到if/else 指的是一个数组结构——print_r()

Array ( [0] =&gt; Publish [1] =&gt; Retract )

太棒了!但是,不幸的是,我无法点击 if/else 中的数字索引来强制 $buttonType 变量显示 Retract 值,因为我遇到了一个致命错误,因为 [] 不是允许在 PHP 中读取

$buttonType = array('Publish', 'Retract');
if (isset($_POST['buttonType']) && $buttonType == $_POST['buttonType']) {
foreach ($_POST as $key => $value) {
return $value;    
}
}
if ($row['is_published'] && $row['date_published'] && $buttonType != 'Publish') {
$buttonType = "Retract";
} else {
if (empty($row['is_published']) && empty($row['date_published']) && $buttonType != 'Retract') {
$buttonType = "Publish";
}
}
if (($row['access_level'] > 1) || ($_SESSION['access_level'] > 1)) {
echo '<input type="submit" name="action" value="'.$buttonType.'" />';
}   

当前的重写为“未发布”产生了所需的结果;

 _____________ ____________ ____________
|             |            |            |
|    EDIT     |  PUBLISH   |   DELETE   |
|_____________|____________|____________|

但是,提交表单后,即使我将内容变为“已发布”,输入值仍然保持不变。必须有一种更简单的方法来翻转输入值状态。我仍然陷入困境,试图了解如何访问数字索引。

【问题讨论】:

  • 这是迄今为止我在 stackoverflow 中看到的最好的英语用法。非常好的先生!
  • 谢谢,@Sharky,我正在努力在提供相关、准确信息的前提下进行操作,以表明我已经做了一些工作来尝试解决我自己的编码问题。再次感谢您。
  • 我有点盲目,但我会试一试:1) 确保$action 的值在您的代码中具有标准。我看到第一个字母是大写的,记住“Retract”与“retract”不同。通过您的代码确保 $_GET 值符合您的大小写。 2) 你确定action 变量总是来自$_GET 吗?因为我看到你在inputs 中使用它,我假设它们在form 中,我相信$_POST 这些值。这意味着在状态的第二次“切换”中,$action 将位于 $_POST['action'] 而不是 $_GET['action']
  • 所以你的初始化会失败。在这种情况下,您应该检查if (isset($_GET['action'])) {$action = $_GET['action'];} elseif (isset($_POST['action'])) {$action = $_POST['action'];} 之类的内容,让我知道我的猜测是否正确! :D
  • 感谢您的提示,@Sharky - 实际上我已经分别尝试过两种方式(连续),但我不知道你可以像那样躲避和掩护(哈哈!),这是一个不错的小提示,我正在收藏以备将来使用。不幸的是,我仍然在攻城掠地。我正在检查您关于第二次切换状态的建议。这将是一个漫长的夜晚......

标签: php if-statement


【解决方案1】:

如果您已将可能的操作范围缩小到这 2 个,您可以简单地运行 switch/case

switch($action) {
    case "Retract":
    echo '<input type="submit" name="action" value="Retract"/>';
    break;
    case "Publish":
    echo '<input type="submit" name="action" value="Publish"/>';
    break;

}

您的问题: 是您传递的是字符串,而不是连接变量。您想要做的是像这样回显您的输入:

echo '<input type="submit" name="action" value="' . $action . '" />';

打印输入的更有效方法是:

echo "<input type='submit' name='action' value='{$action}' />";

您的问题是因为您将 $action 作为字符串传递,而不是对其进行评估。如果你想在这样的字符串中评估它,你需要使用" 而不是'

【讨论】:

  • 第二次我在核面手掌上,因为我不敢相信我没有连接 $action 变量而错过了这样一个基本的东西。您的切换比我之前尝试的更成功,但是由于数据库内容的状态更改,我仍然遇到输入无法自动获取任一选择的问题。 @Darren,谢谢你的那个问题。现在回到手动着陆。 我错过了一些完全简单的东西......再次感谢。
  • @HomeOffice 你能显示你的表单 HTML 吗?是method="get" 还是method="post"
  • 它是POST 方法——而且,有点奇怪,因为form 包含$action 变量的if/else 输入选项,编辑输入和删除输入不是标准@987654333 @ - 只是想弄清楚为什么 $action 变量对状态变化是顽固的。
  • @HomeOffice 那是因为您尝试将$action 设置为$_GET['action'] 而不是$_POST['action']。将其更改为:f (isset($_POST['action'])) $action = $_POST['action'];
  • 听从了您的建议并进行了更改 - 从 PUBLISH RETRACT 翻转的按钮中仍然没有得到我需要的东西。感谢您提供的所有帮助和建议,但由于我最后一个没睡(哈哈!)。
【解决方案2】:

有时很难克服糟糕的代码。我的错误是最初尝试遵循毫无意义的逻辑。有一次,我想到了将阵列业务作为我之前渴望的输入状态翻转的关键;

echo '<br><div class="searh_form"><form method="post" action="transact_article.php"><div><p><br>';
echo '<input type="submit" name="action" value="Edit" />';
foreach ($buttonType as $key=>$value){
  if ($row['is_published'] && array_key_exists([0], $buttonType, TRUE)) {
  if (($row['access_level'] > 1) or ($_SESSION['access_level'] > 1)) {
 $buttonType[] = '<input type="submit" name="action" value="Retract"/>';
   } else {
 $buttonType[] = '<input type="submit" name="action" value="Publish"/>';
 }}
 echo "<input type='submit' name='action' value=\"$buttonType[$key]\" />";
 }
 echo '<input type="submit" name="action" value="Delete" />';
 }}
?>  
<input type="hidden" name="article_id" value="<?php echo $_GET['id']; ?>"/>
</p>
</div>
</form>
<br>

我不得不对一些代码进行一些物理重新定位——在foreach 语句中移动if/else,调整$buttonType 变量与目标输入的连接(进一步声明了$buttonType 数组在页面上),同时仍然没有改变预期输入如何发挥作用以实现发布/撤回的功能。

完全按要求工作...又一次完美的胜利...

【讨论】:

    【解决方案3】:

    由于' 符号,您的$action 未被识别为变量。

    echo '<input type="submit" name="action" value="' . $action . '" />';
    

    【讨论】:

    • 感谢您的快速回复@take - 但我仍然没有得到想要的结果。我很欣赏指向我在回声中犯的单引号错误的指针。绝对是我的人为错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-28
    • 1970-01-01
    • 2018-07-24
    相关资源
    最近更新 更多