2011-09-19 108 views
12

我正在创建一个表单,我只是在寻找更有效的方法来完成任务。我到目前为止是:PHP isset形式的简写POST值

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

但是必须有一个更短的方法来做到这一点。

如果有人能指出我的方向,我真的很感激它。

谢谢!

+3

短!=更好 – 2011-09-19 22:20:52

+0

没有什么比'空好($ _ POST [ '富'])? '':$ _POST ['foo']' - 但您可以将它放入函数中以方便使用(包括指定除'''之外的默认值以及任何其他可能需要的细节)。 – Jon

回答

17

您可以HTML输出之前定义脚本开头的变量,例如:

$name = isset($_POST['submit']) ? $_POST['name'] : null; 
在HTML代码段

您可以打印$名称,而不用担心它没有定义

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

此外,如果$ _POST ['submit']不包含任何值,您更可能收到FALSE语句。为了避免这些问题,使用array_key_exists

+0

很好的答案,但缺乏一些标准和自动化。 –

+0

我同意你的观点,构建自己的表单生成器是每个开发人员都应该经历的路径,对于那些不想发明自己的轮子的人来说,我会推荐使用来自Zend Framework库的东西。 – Nazariy

+1

但这个短打开标签弃用废话。 –

0

你可以试试这个...

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

我使用的布尔比较,而不是isset功能(参见链接表)

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

或其他选项...

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

如果表格尚未提交,则会发出通知。 – animuson

1

没有进入不使用的原因<p>来组织你的表格,除了删除else之外,没有什么可以完成的。

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

就像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()'。 –

+0

这是什么意思?似乎对我来说更长。你甚至没有指定字符集,所以防止XSS不能成为原因。 – Louis

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

是你得到它最短的,除了例如<?= $_POST['name']; ?>(如果未设置提交,则名称应该为空) - 您可能需要关闭警告。

所有这一切,这是非常非常差的做法并打开你到cross site scripting (XSS)。你应该不是正在这样做。即使在Intranet上,如果攻击者拥有可以访问的计算机,他们也可以使用XSS执行用户可以执行的任何操作。

从你的问题,有多少厌恶你有这种类型的呼应在屏幕上的我建议你使用某种形式的模板化图书馆等Smarty的。这可以让你的html代码看起来像这样:

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

我检查了HTML净化器,但它不支持HTML 5的doctype但:( – Drew

+0

我将采取的时间白名单的做法是,如果你正在服用的名称,它应该只有几个字符,现在什么都应该完全抛弃AZ,AZ, - ,和'应该是唯一的东西的名称的病例中99.99%的需要 – Louis

0

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

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

参考here

1

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

+0

这仍然会抛出一个通知,因为它是不一样'isset'它检查是否'$。 _POST [“名”]'为空或不是,但如果该键不存在,它会抛出一个通知。 –

+0

如果你不设置'使用error_reporting(E_ALL&〜E_NOTICE)'否则,像你说的,你会得到像'[8]未定义变量:name'但我始终报告所有的错误和处理它们相应:) – Christian

+1

设置'error_reporting'隐藏在地毯下,您的通知是*永不*解决方案。就像有句话说的那样:“总是编码,就好像在你之后编码的人是一个知道你住在哪里的连环杀手一样”。 IE浏览器。不要隐藏错误,只是阻止它们。 –

0

使用php error control操作:@。

<?php 

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

?> 

如果设置了POST变量,它将被回显出来。如果没有,则不会显示出来。