PHP中针对POST值的isset表达式简写

13

我正在创建一个表单,想要寻找更加高效的操作方式。目前我的代码如下:

<p><input type="text" name="transmission" value="" /></p>
<p><input type="text" name="model" value="<?=$model;?>" /></p>

有些表单元素已经有了值,而有些则为空。我想做的是检查表单是否已设置,如果是,则使用 $_POST['name'] 作为值;如果不是,则使用空白或之前的变量。

<p><input type="text" name="name" value="<?php if isset($_POST['submit'])) { echo $_POST['name']; } else { echo ""; } ?>" /></p>

但是一定有更简单的方法来做到这一点。

如果有人能指引我,我将不胜感激。

谢谢!


没有比 empty($_POST['foo']) ? '' : $_POST['foo'] 更好的了 - 但是你可以将其放入一个函数中以方便使用(包括指定除 '' 之外的默认值和其他任何你需要的功能)。 - Jon
8个回答

18

你可以在脚本开始之前定义变量,然后再输出HTML,例如:

$name = isset($_POST['submit']) ? $_POST['name'] : null;

在您的HTML部分中,您可以打印$ name而不必担心它未定义

<p><input type="text" name="name" value="<?php echo $name ?>" /></p>

如果$_POST['submit']没有任何值,您更有可能收到FALSE声明。为避免此类问题,请使用array_key_exists


我同意你的观点,建立自己的表单生成器是每个开发者都应该经历的过程。对于那些不想重复造轮子的人,我建议使用Zend Framework库中的一些工具。 - Nazariy
1
但是那个短的开放标签弃用的废话。 - Your Common Sense

4

像Nazariy所说的那样,您应尽可能避免在模板中使用PHP。
事实上,您应该已经准备好了一些变量用于模板。

因此,在您的代码中应该有类似以下的内容:

$FORM = array();
$form_fields = array('name','sex');
foreach($form_fields as $fname) {
  if (isset($_POST[$fname])) {
    $FORM[$fname] = htmlspecialchars($_POST[$fname]);
  } else {
    $FORM[$fname] ='';
  }
}

接下来,您将拥有流畅、整洁的模板:
<p><input type="text" name="name" value="<?=$FORM['name']?>" /></p>

1
+1 用于一般答案和使用 htmlspecialchars() - Decent Dabbler
这有什么意义呢?对我来说似乎更长了。你甚至没有指定字符集,所以防止 XSS 攻击也不可能是原因。 - lsl

2

不需要深入讨论为什么不应该使用<p>来构建表单,除了移除else之外,没有太多可以做的了。

<p><input type="text" name="name" value="<?php if isset($_POST['name'])) echo $_POST['name']; ?>" /></p>

1
使用 php错误控制 运算符:@。
<?php

   $posted_text = @$_POST['posted_text'];
   echo $posted_text

?>  

如果POST变量已设置,它将被回显。如果没有设置,则不会显示任何内容。


1
速记 <?=$_POST['name'] ?: ''?>


这里仍会抛出一个警告,因为它与 isset 不同。它检查 $_POST['name'] 是否为空,但如果键不存在,它将抛出一个警告。 - Eduard Luca
如果你设置了 error_reporting(E_ALL & ~E_NOTICE),就不会出现 [8] Undefined variable: name 这样的错误。但是我总是报告所有的错误并相应地处理它们 :) - Christian
1
error_reporting 设置为隐藏通知永远不是解决方案。就像一句话说的那样:“编写代码时要像编写者是一个连环杀手,他知道你住在哪里。”也就是说,不要隐藏错误,而是预防它们。 - Eduard Luca
如果您不想看到通知,可以通过以下方式安全地忽略它:$id = @$_POST['id'] ?: ''; - frumbert

0
你可以尝试这个...
$_POST['submit'] ? echo $_POST['name'] : echo '';

我正在使用布尔比较而不是isset函数(请参见表格链接)

http://www.php.net/manual/en/types.comparisons.php

或者另一个选项是...

echo ($_POST['submit'] ? $_POST['name'] : '');

如果表单尚未提交,那么会抛出一个提示。 - animuson

0
<?= isset($_POST['submit'])? $_POST['name'] : ""; ?>

除非使用 <?= $_POST['name']; ?>(如果 submit 未设置,名称应为空),否则这是最短的方式 - 你可能需要关闭警告。

尽管如此,这是非常非常糟糕的做法,会导致跨站脚本攻击 (XSS)。您不应该这样做。即使在公司内部网络上,如果攻击者拥有可以访问它的计算机,他们也可以使用 XSS 执行用户可以执行的任何操作。

从您的问题和您对此类屏幕输出的厌恶程度来看,我建议您使用某种模板库,例如Smarty。这将允许您的 HTML 代码如下所示:

<p><input type="text" name="name" value="{name}" /></p>

我查阅了HTML Purifier,但它还不支持HTML 5的doctype :( - Drew
我会暂时采用白名单的方法。如果你正在输入一个名称,它应该只包含少数字符,其他任何字符都应完全丢弃。在99.99%的情况下,名称只需要a-z、A-Z、-和'这些字符即可。 - lsl

0

我刚刚从WordPress编码标准中看到了这个。虽然他们不鼓励可读性..

isset( $var ) || $var = some_function();

请参考此处


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接