2013-07-05 4 views
1

Хорошо, код длинный и скучный, но я в недоумении.Ошибка PHP-класса без ошибок

В принципе у меня есть форма, и форма попадает в массив объектов. Имя объекта - 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] => [email protected] 
      [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> 

И функция для FirstName является:

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

Что происходит, когда вы 'var_dump ($ people [0] -> firstname())'? Что вы получаете? –

+0

Я знаю в вопросе, что вы вставили заполненный массив, но можете ли вы проверить, что '$ people' не пуст? –

+0

@ AndréDion $ people - это выход вверх с var_dump ($ people). – Chud37

ответ

2

Короткие метки?

Как правило, не рекомендуется использовать короткие теги (они автоматически отключены из php 5.3, вы должны включить их в php.ini: уверены ли вы, что короткие теги включены ?, см. Также эта ссылка: PHP echo vs PHP short tags

в противном случае она не может быть плохой идеей переписать в общепринятом PHP 5.3+ образом:

<?php echo $people[0]->firstname(); ?> 

Ошибка отчетности

Если это не дает statisfactory ответ, попробуйте включить отчеты об ошибках в PHP:

на лету (где-то в начале вашего скрипта)

<?php 
ini_set('display_errors', 1); 
error_reporting(E_ALL); 
?> 

в PHP.ини (вероятно, отличается для PHP и кли)

error_reporting = E_ALL 
display_errors = 1 

Для получения дополнительной информации см:

Apache журналы

Если все остальное не удается, попробуйте использовать журналы apache (журналы ошибок), ошибки, которые не регистрируются в браузере, все равно могут оказаться в вашем журнале ошибок apache (или lighttp/nginx/iss).

+0

Эти строки отчетности об ошибках уже существуют. Короткий тег определенно работает и на этом сервере. – Chud37

+0

Как насчет веб-сервера? Что-нибудь? Что говорит журнал? 200 запрос? Ошибка 500? – Arend

-2

Как правило, не рекомендуется смешивать код и макет (google для 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.

+0

Это хорошо, и я понимаю о MVC, но он не решает эту проблему. Он просто перезаписывает весь сайт. – Chud37

+0

Но это поможет вам выяснить, где происходит ваша ошибка ... Проблема, с которой вы столкнулись, скорее всего, не возникнет, когда вы последуете этому шаблону. – Swissdude

+0

Да, и мне нравится шаблон, но решение проблемы не может быть просто «начать снова по-другому». – Chud37

Смежные вопросы