Question

J'ai la partie suivante d'une application AJAX, qui ne donne aucune erreur, mais rien ne s'affiche à l'écran. Je ne suis donc pas sûr de la source du problème. L'appel de cette page directement à partir d'un navigateur avec? Cmd & Amp; id = 1 devrait être renvoyé, ou même l'appeler sans? Cmd devrait renvoyer le message d'erreur cmd.

modifier: cas de test ajoutés: le message d'erreur cmd s'affiche, mais lorsque je réussis & amp; id = 1 (1 est un identifiant valide), aucun code HTML n'est renvoyé, la source d'affichage est complètement vide. Ai-je utilisé l'écho de manière incorrecte ou quelque chose de similaire?

edit2: ajout de l'écho en première ligne: le premier écho n'est pas visible

edit3: Après être revenu à une version plus ancienne et avoir refait toutes les modifications, je reçois maintenant une sortie de jeu de caractères de test lors de l'appel avec des paramètres valides de cmd et id. Le code que j'utilise est identique à celui collé ci-dessous.

le code:

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

}

Je m'excuse pour l'espacement, mais cela se produit automatiquement lorsque j'appuie sur le bouton de code.

Était-ce utile?

La solution

Vous avez une parenthèse supplémentaire à la ligne 22

Ceci

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

Doit être ce

$con->set_charset("utf8");

Deux conseils de débogage pour l’avenir. Pour le premier, vous aurez besoin d'un accès shell à votre hôte Web, ou vous devrez installer PHP localement sur votre ordinateur de développement. Si vous utilisez Unix, vous l’avez peut-être déjà. Ouvrez un terminal et tapez

php -v

Si vous en avez un, vous pouvez vérifier la syntaxe d'un fichier PHP en effectuant

//on *nix
php yourfile.php

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

Ceci évitera les erreurs de syntaxe brutes. De plus, google / recherchez sur ce site & "; Installez le tutoriel php localement &"; ou quelque chose de similaire pour apprendre à obtenir une copie complète d'un serveur Web, d'une base de données mysql et de php s'exécutant sur votre propre ordinateur.

La deuxième suggestion, qui sera plus facile si vous installez une copie locale, consiste à consulter vos journaux d’erreurs. Même si PHP n’affiche pas de message d’erreur, les erreurs seront quand même enregistrées dans un fichier. Dans votre cas, vous auriez vu quelque chose comme ceci dans le fichier journal

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

Autres conseils

Cela vous aidera à voir vos erreurs:

ini_set('display_errors', '1');

Vous avez une parenthèse de fermeture supplémentaire ici:

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

Avez-vous essayé un test de base consistant à placer une instruction print ou echo immédiatement en haut du script pour tester la sortie?

<?php

  print "Test";

?>

Je vous suggère également d'utiliser une or die($msg) capture après votre tentative de connexion.

Ce serait bien pour votre cas. Juste comme point de départ. Je le fais de temps en temps, au besoin. Plutôt que de supposer que le problème est un problème extrêmement complexe, il s'avère souvent une condition inattendue dans les variables de requête, accéder à une page incorrecte, accéder à une page correcte au mauvais moment, etc.

Peut aider:

  1. Surveillez le journal du serveur Web (comme tail -f /var/log/apache2/error.log)

  2. Utilisez Firebug et voyez dans la console la réponse AJAX provenant de votre script. L'erreur peut y apparaître

Si aucun écho de débogage n'est atteint, le point d'échec semble se situer autour de la connexion à la base de données, à moins que quelque chose ne me manque.

Vérifiez les détails de la connexion et vérifiez que l'extension mysqli est activée.

J'ai rencontré un problème similaire où j'obtiendrais inexplicablement une page vierge, généralement dans IE6 mais parfois dans d'autres navigateurs. Il s’est avéré qu’il s’agissait d’un problème d’encodage des caractères. Je produisais des caractères étranges, et les navigateurs devinaient en quoi le codage était basé sur le contenu. Je l'ai corrigé en définissant explicitement cet en-tête:

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

Je ne sais pas si cela causerait l'erreur, mais cela ne devrait-il pas être le cas pour que getRecords bind_param ait & "i &"; comme premier paramètre?

  

Appel de cette page directement depuis un   le navigateur avec ?cmd&id=1 devrait renvoyer

Qu'entendez-vous par " return " ;? D'après ce que je peux voir de votre code, vous avez besoin de ?cmd= GetSALEData . Sinon, une page vierge sera renvoyée, car tout est placé à l'intérieur de l'instruction if($cmd=="GetSALEData").

Correction : vous devriez voir " test contest charset " si cmd votre chaîne de requête est définie sur autre chose que " GetSALEData " ;. (Ces deux tests ont été ajoutés au code plus tard.)

Il y a plusieurs bonnes suggestions ici pour essayer. Celui que je n'ai pas encore vu consiste à vérifier que la mémoire allouée à PHP est suffisante. Les personnes suivantes sont drupal.org et ont une bonne analyse du moyens d'augmenter l'allocation de mémoire de PHP .

Mettez des parenthèses autour de votre if-else    déclarations. J'ai le sentiment de la personne qui    modifié votre code peut avoir " corrigé " une    problème potentiel là-bas.

Cela s’explique par le fait que la configuration de votre serveur est configurée pour ne pas afficher les erreurs. Votre script s’appuie donc sur l’exécution de cette error_reporting(E_ALL); - tout devrait bien fonctionner tant que la fonction error_reporting() est exécutée. Cependant, en cas d'erreur d'analyse, error_reporting(E_ALL) ne sera pas exécuté et vous ne verrez aucune erreur car les paramètres de rapport d'erreur php.ini ne sont jamais écrasés.

La seule solution pour vous est de définir error_reporting dans des endroits plus élevés tels que htaccess ou php.ini. Mais maintenant au moins vous savez qu'une page blanche = une erreur d'analyse!

Si vous êtes certain de ne pas avoir d'erreur et que vous continuez à avoir une page blanche, je vous suggère d'installer php-process.

yum -y install php-process

Dans d'autres cas, vous obtenez une telle erreur si vous n'avez pas installé pear.

yum -y install php-pear php-pear-DB ou simplement pour installer la base de données pear install DB

J'espère que cela aidera quelqu'un avec le problème de la page vierge.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top