Domanda

Ho la seguente parte di un'applicazione AJAX, che non dà errori, ma anche nulla viene visualizzato sullo schermo, quindi non sono sicuro di dove si trovi il problema. Chiamare questa pagina direttamente da un browser con? Cmd & Amp; id = 1 dovrebbe tornare, o anche chiamarla senza? Cmd dovrebbe restituire il messaggio di errore cmd.

modifica: aggiunti casi di test: ricevo il messaggio di errore cmd, ma quando passo & amp; id = 1 (1 è un ID valido), nessun html viene restituito, la sorgente della visualizzazione è completamente vuota. Ho usato l'eco in modo errato o qualcosa di simile?

edit2: aggiunta dell'eco come prima riga: la prima eco non viene vista in alcun modo

edit3: Dopo essere tornato a una versione precedente e aver apportato di nuovo tutte le modifiche, ora ricevo l'output del set di caratteri di prova quando chiamo con parametri cmd e id validi. Il codice che sto usando è identico a quello che viene incollato di seguito.

il codice:

<?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()));
    }
  }

}

Mi scuso per la spaziatura, ma succede automaticamente quando premo il pulsante del codice.

È stato utile?

Soluzione

Hai una parentesi extra sulla riga 22

Questo

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

Deve essere questo

$con->set_charset("utf8");

Due suggerimenti per il debug per il futuro. Per prima cosa, avrai bisogno dell'accesso shell al tuo host web o dovrai installare PHP localmente sul tuo computer di sviluppo. Se usi Unix, potresti già averlo. Apri un terminale e digita

php -v

Se ce l'hai, puoi controllare la sintassi di un file PHP facendo

//on *nix
php yourfile.php

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

Ciò salverà su errori di sintassi grossolani. Inoltre, google / cerca & Quot; setup php localmente tutorial & Quot; o qualcosa di simile per imparare come ottenere una copia completa di un server Web, database mysql e php in esecuzione sul proprio computer.

Il secondo suggerimento, che sarà più semplice se si installa una copia locale, è controllare i log degli errori. Anche quando PHP non visualizza messaggi di errore, gli errori verranno comunque registrati in un file da qualche parte. Nel tuo caso, avresti visto qualcosa di simile nel file di registro

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

Altri suggerimenti

Questo ti aiuterà a vedere i tuoi errori:

ini_set('display_errors', '1');

Hai una parentesi di chiusura extra qui:

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

Hai provato un test di base per posizionare immediatamente un'istruzione print o echo nella parte superiore dello script per testare l'output?

<?php

  print "Test";

?>

Suggerirei anche di utilizzare un or die($msg) catch dopo il tuo tentativo di connessione.

Andrebbe bene per il tuo caso. Proprio come punto di partenza. Lo faccio di volta in volta quando necessario. Anziché supporre che il problema sia un problema estremamente complesso, spesso si rivela una condizione imprevista nelle variabili di richiesta, accesso alla pagina sbagliata, accesso alla pagina giusta al momento sbagliato, ecc.

Può aiutare:

  1. Monitora il registro del server Web (come tail -f /var/log/apache2/error.log)

  2. Usa Firebug e vedi nella Console la risposta AJAX proveniente dal tuo script. L'errore potrebbe apparire lì

Se non viene raggiunto nessuno degli echi di debug, il punto di errore sembrerebbe essere attorno alla connessione al database, a meno che non mi manchi qualcosa.

Controlla i dettagli della connessione e verifica che l'estensione mysqli sia abilitata.

Ho riscontrato un problema simile in cui avrei inspiegabilmente ottenuto una pagina vuota, di solito in IE6 ma a volte in altri browser. Si è rivelato essere un problema di codifica dei caratteri. Stavo producendo alcuni strani personaggi e i browser indovinavano la codifica in base al contenuto. L'ho risolto impostando esplicitamente questa intestazione:

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

Non so se questo causerebbe l'errore, ma non dovrebbe essere così e il bind_param getRecords dovrebbe avere " i " come primo parametro?

  

Chiamare questa pagina direttamente da a   il browser con ?cmd&id=1 dovrebbe tornare

Cosa intendi con " return " ;? Da quello che posso vedere del tuo codice, hai bisogno di ?cmd=GetSALEData altrimenti verrà restituita una pagina vuota, perché tutto è racchiuso nell'istruzione if($cmd=="GetSALEData").

Correzione : dovresti vedere " test contest charset " se la stringa di query ha cmd impostato su qualcosa di diverso da " GetSALEData " ;. (Quei due test sono stati aggiunti al codice in seguito.)

Ci sono molti buoni suggerimenti qui da provare. Quello che non ho ancora visto è assicurarsi che ci sia abbastanza memoria allocata a PHP. Le persone qui sopra sono drupal.org hanno una buona suddivisione del modi per aumentare l'allocazione di memoria di PHP .

Metti le parentesi attorno al tuo if-else    dichiarazioni. Ho la sensazione di chi    modificato il codice potrebbe avere " fisso " un    potenziale problema lì.

Il motivo per cui ciò sta accadendo è perché la configurazione del tuo server è impostata in modo da non visualizzare errori, quindi lo script si basa sull'esecuzione di tale error_reporting(E_ALL);; ciò dovrebbe funzionare correttamente finché la funzione error_reporting() viene eseguita. Tuttavia, se si verifica un errore di analisi, il error_reporting(E_ALL) non verrà eseguito e lì non vedrai alcun errore poiché le impostazioni di segnalazione errori php.ini non vengono mai sovrascritte.

L'unica soluzione per te è di impostare error_reporting in luoghi più alti come htaccess o php.ini. Ma ora almeno sai che una pagina vuota = un errore di analisi!

Se sei sicuro di non avere errori e continui a ottenere una pagina vuota, ti suggerirei di installare php-process.

yum -y install php-process

In altri casi, si ottiene un errore del genere se non è installato Pear.

yum -y install php-pear php-pear-DB o semplicemente per installare il db pear install DB

Spero che questo aiuti qualcuno con il problema della pagina vuota.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top