PHP类失败,没有错误

时间:2013-07-05 11:54:14

标签: php class oop object

好的,代码很长很无聊,但我不知所措。

基本上我有一个表单,表单被放入一个对象数组中。对象名称是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阶段。 *

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时出现的其他问题。