1

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

基本上我有一个表格,表格被放入一个对象数组中。对象名称是 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);}

与 person 类中的所有其他功能相同。

但是,为什么即使有要输出的名字,它也会在这里失败?它没有给出任何错误,实际上此时的 HTML 如下所示:

<tr><td class="top left" width="200px">First Name</td><td class="top right">

页面甚至在写字之前就停止或停止<input...

我不知道为什么。

*错误报告绝对是开启的。另外 - 如果表格填写正确(电子邮件、电话号码等),代码运行得非常好。对象被填充,用户进入第 2 阶段。 *

4

2 回答 2

2

短标签?

使用短标签通常不是一个好主意(它们从 php 5.3 自动关闭,您必须在 php.ini 中启用它们:您确定启用了短标签吗?,另请参阅此链接:PHP echo vs PHP 短标签

否则,以普遍接受的 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(或 lighttp/nginx/iss)错误日志中。

于 2013-07-05T12:05:47.363 回答
-2

混合代码和布局通常不是一个好习惯(谷歌对于 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,而不是空值,最后将错误占位符替换为您的错误消息:

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

于 2013-07-05T12:40:03.903 回答