好的,代码很长很无聊,但我不知所措。
基本上我有一个表单,表单被放入一个对象数组中。对象名称是Person()。
但是,如果他们没有正确填写表单,则会显示错误,例如“电子邮件不能留空”。
问题在于,如果表单中存在错误,页面会在非常特定的位置死掉。
此时,对象看起来像这样:
Array
(
[0] => Person Object
(
[firstname:Person:private] => Richard
[lastname:Person:private] => Gert
[gender:Person:private] =>
[age:Person:private] =>
[add1:Person:private] =>
[add2:Person:private] =>
[add3:Person:private] =>
[add4:Person:private] =>
[postcode:Person:private] =>
[country:Person:private] =>
[phone:Person:private] => 3299394
[email:Person:private] => right@left.com
[price:Person:private] => 67.5
[additional:Person:private] =>
[active:Person:private] => 1
[ref:Person:private] => c75af
[ticketref:Person:private] => 0acbc
[org:Person:private] => RA
[type:Person:private] => wc
)
)
那没关系。尽管如此,该页面正在消亡:
<tr><td class="top left" width="200px">First Name</td>
<td class="top right">
<input type="text" class="txt" name="firstname" value="<?=$people[0]->firstname();?>">
</td></tr>
名字的功能是:
function firstname() {if($this->firstname) return($this->firstname);}
与人类中的其他所有功能相同。
但是为什么即使有输出的名字,它也会在这里失败?它没有错误,事实上HTML在这一点上看起来像这样:
<tr><td class="top left" width="200px">First Name</td><td class="top right">
页面甚至在写入单词<input...
之前就会停止或死亡。
我无法弄清楚原因。
* 错误报告绝对是开启的。 此外 - 如果表格填写正确(电子邮件,电话号码等),代码运行绝对正常。对象已填充,用户将移至第2阶段。 *
答案 0 :(得分:2)
短标签?
使用短标签通常不是一个好主意(它们是从php 5.3自动关闭的,你必须在php.ini中启用它们:你确定短标签已启用吗?,另见此链接:PHP echo vs PHP short tags
否则以普遍接受的php 5.3+方式重写可能不是一个坏主意:
<?php echo $people[0]->firstname(); ?>
报告错误
如果这不能给出满意的答案,请尝试在php中启用错误报告:
动态(脚本开头的某个地方)
<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);
?>
php.ini 中的(可能与php和cli不同)
error_reporting = E_ALL
display_errors = 1
有关详细信息,请参阅:
Apache日志
如果所有其他方法都失败了,请尝试使用apache日志(错误日志),未记录到浏览器的错误可能仍会在您的apache(或lighttp / nginx / iss)错误日志中结束。
答案 1 :(得分:-2)
混合代码和布局(google for MVC)通常不是一个好习惯。
我的建议:
使用常规HTML页面生成表单,如下所示:
<span class="error">{error}</span>
<table>
<tr><td class="top left" width="200px">First Name</td>
<td class="top right">
<input type="text" class="txt" name="firstname" value="{firstname}">
</td></tr>
</table>
大括号中的变量是占位符,您将在下一步中替换它们。 当用户提交表单并检测到错误时,{error}将保留您的错误消息。
在您的PHP脚本中加载HTML,例如:
$template = file_get_contents('template.html');
在第一次调用表单时,用循环中的空值替换花括号中的变量:
foreach($this->person as $key=>$value){
$template = str_replace('{'.$key.'}', '', $template);
}
// Replace the error-placeholder with an empty value
$template = str_replace('{error}', '', $template);
输出表格:
echo $template;
现在,当用户提交表单时,检查postvars是否有错误,如果发生错误,请使用postvars替换表单中的值,而不是空值,最后用错误消息替换error-placeholder:
foreach($this->person as $key=>$value){
$template = str_replace('{'.$key.'}', $_POST[$key], $template);
}
// Replace the error-placeholder with an empty value
$template = str_replace('{error}', $myErrorMessage, $template);
这将保留表单中用户的条目。
希望你明白这个概念。通过使用这种方法,可以更容易地在代码中发现错误,并且您不必担心打开短标记以及混合HTML / PHP时出现的其他问题。