PHP дает пустую страницу, без ошибок - PullRequest
6 голосов
/ 28 января 2009

У меня есть следующая часть приложения AJAX, которая не выдает ошибок, но также ничего не отображается на экране, поэтому я не уверен, в чем проблема. Вызов этой страницы напрямую из браузера с? Cmd & id = 1 должен вернуться, или даже вызов без нее? Cmd должен вернуть сообщение об ошибке cmd.

edit: добавлены тестовые случаи: я получаю сообщение об ошибке cmd, но когда я передаю & id = 1 (1 является действительным идентификатором), html не возвращается вообще, источник представления полностью пуст. Я неправильно использовал эхо или что-то подобное?

edit2: добавлено эхо в качестве первой строки: первое эхо не видно вообще

edit3: После возврата к старой версии и повторного внесения всех изменений я теперь получаю тестовый набор символов при вызове с допустимыми параметрами cmd и id. Код, который я использую, идентичен приведенному ниже.

код:

<?php
echo "hello world";    
error_reporting(E_ALL);

if (isset($_GET["cmd"]))
  $cmd = $_GET["cmd"];
else
  die("You should have a 'cmd' parameter in your URL");

$id = $_GET["id"];

$con = mysqli_connect("localhost", "user", "password", "db");
echo "test con";

if(!$con)
{
  die('Connection failed because of' .mysqli_connect_error());
  echo "test error";
}

//$con->query("SET NAMES 'utf8'"); 
$con->set_charset("utf8"));
echo "test charset";

if($cmd=="GetSALEData")
{
  echo "test cmdifloop";

  if ($getRecords = $con->prepare("SELECT * FROM SALES WHERE PRODUCT_NO = ?"))
  {
    echo "test recordifloop";

    $getHtml = $con->prepare("SELECT PRODUCT_DESC FROM SALES WHERE PRODUCT_NO = ?");
    $getHtml->bind_param("s", $id);
    $getHtml->execute();
    $getHtml->bind_result($PRODUCT_DESC);

    $getRecords->bind_param("s", $id);
    $getRecords->execute(); 
    $getRecords->bind_result($PRODUCT_NO, $PRODUCT_NAME, $SUBTITLE, $CURRENT_PRICE, $START_PRICE,
                             $PRICE_COUNT, $QUANT_TOTAL, $QUANT_SOLD, $ACCESSSTARTS, $ACCESSENDS,
                             $ACCESSORIGIN_END, $USERNAME, $BEST_PRICEDER_ID, $FINISHED, $WATCH,
                             $BUYITNOW_PRICE, $PIC_URL, $PRIVATE_SALE, $SALE_TYPE, $ACCESSINSERT_DATE,
                             $ACCESSUPDATE_DATE, $CAT_DESC, $CAT_PATH, $COUNTRYCODE, $LOCATION,
                             $CONDITIONS, $REVISED, $PAYPAL_ACCEPT, $PRE_TERMINATED, $SHIPPING_TO,
                             $FEE_INSERTION, $FEE_FINAL, $FEE_LISTING, $PIC_XXL, $PIC_DIASHOW,
                             $PIC_COUNT, $ITEM_SITE_ID
                            ); 
    while ($getRecords->fetch()) 
    {
      $ccodes = array(  "1" => "USA",
                       "77" => "Germany",
                       "16" => "Austria",
                      "122" => "Luxemburg",
                      "193" => "Switzerland",
                     );

      $conditions = array( "0" => "USA",
                          "77" => "Germany",
                          "16" => "Austria",
                         );

      $country = $ccodes[$COUNTRYCODE];
      if ( $country == "" ) $country = "Not applicable";

      $columns = array('FINISHED', 'WATCH', 'PRIVATE_SALE', 'REVISED', 'PAYPAL_ACCEPT', 'PRE_TERMINATED', 'PIC_XXL', 'PIC_DIASHOW');

      foreach($columns as $column) {
        $$column = $row[$column] ? 'YES' : 'NO';
      }

      imageResize($PIC_URL, 250, 300);
      file_put_contents($id, file_get_contents($PIC_URL));

      $html = htmlentities(json_encode($PRODUCT_DESC));
      $shortDate = strftime("%d %m %Y", strtotime($ACCESSSTARTS));

      echo "<h1>".$PRODUCT_NAME."</h1>
<div id='leftlayer' class='leftlayer'>
<p><strong>Username: </strong>".$USERNAME."
<p><strong>PRODUCT Number: </strong>".$PRODUCT_NO."
<p><strong>Subtitle: </strong>".$SUBTITLE."
<p><strong>SALE Start: </strong>".$ACCESSSTARTS." 
<p><strong>SALE End: </strong>".$ACCESSENDS."
<p><strong>SALE Type: </strong>".$SALE_TYPE."
<p><strong>Category: </strong>".$CAT_DESC."
</div>
<div class='leftlayer2'>
  <p><strong>Condition: </strong> ".$CURRENT_PRICE."
  <p><strong>Total Items: </strong> ".$QUANT_TOTAL."
  <p><strong>Total Sales: </strong> ".$QUANT_SOLD."
  <p><strong>Start Price: &#8364</strong> ".$START_PRICE."
  <p><strong>Buyitnow Price: &#8364</strong> ".$BUYITNOW_PRICE."
  <p><strong>PRICEs: </strong> ".$PRICE_COUNT." 
  <p><strong>Revised: </strong> ".$REVISED."
</div>
<div class='leftlayer2'>
  <p><strong>Private: </strong> ".$PRIVATE_SALE."
  <p><strong>Finished: </strong> ".$FINISHED."
  <p><strong>Cancelled: </strong> ".$PRE_TERMINATED."
  <p><strong>Paypal: </strong> ".$PAYPAL_ACCEPT."
  <p><strong>Country: </strong> ". $country ."
  <p><strong>Location: </strong> ".$LOCATION."
  <p><strong>Shipping to: </strong> ". $country ."
</div>
<div id='rightlayer'>
 <img src='".$PIC_URL."' width='".$imageSize["width"]."' height='".$imageSize["height"]."'>
 <p><a href='#' onclick=\"makewindows(" . $html . "); return false;\">Click for full description </a></p>
</div>
</div>
</div>";

    } 
  }

  function imageResize($imageURL, $maxWidth, $maxHeight)
  {
    $imageSize["width"] = 0;
    $imageSize["height"] = 0;

    $size = getimagesize($imageURL);
    if ($size) {
      $imageWidth  = $size[0];

      $imageHeight = $size[1];
      $wRatio = $imageWidth / $maxWidth;
      $hRatio = $imageHeight / $maxHeight;
      $maxRatio = max($wRatio, $hRatio);

      if ($maxRatio > 1) {
        $imageSize["width"] = $imageWidth / $maxRatio;
        $imageSize["height"] = $imageHeight / $maxRatio;
        return $imageSize;
      } else {
        $imageSize["width"] = $imageWidth;
        $imageSize["height"] = $imageHeight;
        return $imageSize;
      }
    } else {
      die(print_r(error_get_last()));
    }
  }

}

Я прошу прощения за интервал, но это происходит автоматически, когда я нажимаю кнопку кода.

Ответы [ 13 ]

14 голосов
/ 28 января 2009

Это поможет вам увидеть ваши ошибки:

ini_set('display_errors', '1');
10 голосов
/ 28 января 2009

У вас есть лишние скобки в строке 22 * ​​1001 *

Это

$con->set_charset("utf8"));

Это должно быть

$con->set_charset("utf8");

Два совета по отладке на будущее. Во-первых, вам понадобится доступ к оболочке к вашему веб-хосту, или вам нужно будет установить PHP локально на вашем компьютере разработчика. Если вы работаете с Unix, возможно, у вас уже есть. Откройте терминал и введите

php -v

Если он у вас есть, вы можете проверить синтаксис файла PHP, выполнив

//on *nix
php yourfile.php

//or on windows
c:\path\to\php.exe yourfile.php

Это приведет к грубым синтаксическим ошибкам. Кроме того, поищите на этом сайте в Google «поисковое руководство по настройке php» или что-то похожее, чтобы узнать, как получить полную копию веб-сервера, базы данных mysql и php на вашем компьютере.

Второе предложение, которое будет проще, если вы установите локальную копию, - это проверить журналы ошибок. Даже если PHP не отображает сообщения об ошибках, ошибки все равно будут записываться в файл. В вашем случае вы видели что-то подобное в лог-файле

PHP Parse error:  syntax error, unexpected ')' in foo.php on line 22
4 голосов
/ 28 января 2009

У вас есть дополнительные закрывающие скобки здесь:

$con->set_charset("utf8"));
3 голосов
/ 28 января 2009

Вы пробовали выполнить базовый тест для размещения оператора print или echo сразу в верхней части скрипта, чтобы проверить вывод?

<?php

  print "Test";

?>

Я бы также предложил использовать or die($msg) catch после вашей попытки подключения.

Было бы хорошо для вашего случая. Просто в качестве отправной точки. Я делаю это время от времени, когда это необходимо. Вместо того, чтобы предполагать, что проблема является какой-то чрезвычайно сложной проблемой, она часто оказывается непредвиденным состоянием в переменных запроса, обращении к неправильной странице, обращению к нужной странице в неправильное время и т. Д.

2 голосов
/ 28 января 2009

Может помочь:

  1. Контроль журнала веб-сервера (например, tail -f /var/log/apache2/error.log)

  2. Используйте Firebug и посмотрите в консоли ответ AJAX, исходящий из вашего скрипта. Там может появиться ошибка

1 голос
/ 28 января 2009

Если ни один из отладочных эхо-сигналов не достигнут, то, похоже, точка сбоя находится вокруг соединения с базой данных, если я что-то не пропустил.

Проверьте детали подключения и убедитесь, что у вас включено расширение mysqli.

0 голосов
/ 21 мая 2014

Если вы уверены, что у вас нет ошибок и вы продолжаете получать пустую страницу, я бы предложил вам установить php-процесс.

yum -y install php-process

В других случаях вы получаете такую ​​ошибку, если у вас не установлена ​​груша.

yum -y install php-pear php-pear-DB или просто установить db pear install DB

Надеюсь, это поможет кому-то с проблемой пустой страницы.

0 голосов
/ 22 июня 2011

Причина, по которой это происходит, в том, что ваша конфигурация сервера настроена так, чтобы не отображать ошибки, поэтому ваш скрипт полагается на выполнение error_reporting(E_ALL); - это должно работать нормально, пока выполняется функция error_reporting(). Тем не менее, в случае ошибки синтаксического анализа, error_reporting(E_ALL) не будет выполнено , и там вы не увидите ошибки, так как настройки отчетов об ошибках php.ini никогда не перезаписываются.

Единственное решение для вас - установить error_reporting в более высокие места, такие как htaccess или php.ini. Но теперь, по крайней мере, вы знаете, что пустая страница = ошибка разбора!

0 голосов
/ 28 января 2009

Здесь есть несколько хороших предложений для попытки. Единственное, чего я еще не видел, это убедиться, что для PHP выделено достаточно памяти. Люди drupal.org хорошо разбираются в способах увеличения выделения памяти PHP .

0 голосов
/ 28 января 2009

Положите скобки вокруг вашего if-else заявления. У меня есть чувство человека, который отредактировал ваш код, возможно, "исправил" потенциальная проблема там.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...