Вопрос

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

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

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

редактировать3:Вернувшись к более старой версии и снова внеся все изменения, я теперь получаю тестовую кодировку при вызове с действительными параметрами 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()));
    }
  }

}

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

Это было полезно?

Решение

У вас есть лишняя скобка в строке 22.

Этот

$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

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

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

PHP Parse error:  syntax error, unexpected ')' in foo.php on line 22

Другие советы

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

ini_set('display_errors', '1');

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

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

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

<?php

  print "Test";

?>

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

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

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

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

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

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

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

Я столкнулся с аналогичной проблемой, когда по необъяснимым причинам получал пустую страницу, обычно в IE6, но иногда и в других браузерах.Оказалось, проблема с кодировкой символов.Я выводил какие-то странные символы, и браузеры догадывались, какая кодировка основана на содержимом.Я исправил это, явно установив этот заголовок:

header('Content-type: text/html; charset=utf-8');
$getHtml->bind_param("s", $id);

Я не знаю, приведет ли это к ошибке, но разве это и getRecordsbind_param не должны иметь «i» в качестве первого параметра?

Вызовет эту страницу непосредственно из браузера с ?cmd&id=1 должен вернуться

Что вы подразумеваете под «возвратом»?Из того, что я вижу в вашем коде, вам нужно ?cmd=GetSALEData иначе будет возвращена пустая страница, потому что все завернуто внутрь if($cmd=="GetSALEData") заявление.

Коррекция:Тебе следует увидеть "test contest charset" если ваша строка запроса имеет cmd установите значение, отличное от «GetSALEData».(Эти два теста были добавлены в код позже.)

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

Поместите скобки вокруг ваших операторов IF-ELSE.У меня есть чувство, что человек, который отредактировал ваш код, может «исправить» потенциальную проблему.

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

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

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

yum -y install php-process

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

yum -y install php-pear php-pear-DB или просто установить базу данных pear install DB

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top