phpで空白のページが表示されますが、エラーはありません
質問
AJAX アプリケーションの次の部分がありますが、エラーは発生しませんが、画面に何も表示されないため、問題がどこにあるのかわかりません。?cmd&id=1 を使用してブラウザからこのページを直接呼び出すと、戻ります。また、?cmd を使用せずにこのページを呼び出した場合でも、cmd エラー メッセージが返されます。
編集:追加されたテストケース:cmd エラー メッセージが表示されますが、&id=1 (1 は有効な ID) を渡すと、HTML はまったく返されず、ソースの表示は完全に空白になります。echo などを間違って使用していませんか?
編集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: €</strong> ".$START_PRICE."
<p><strong>Buyitnow Price: €</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");
今後のデバッグに関する 2 つのヒント。まず、Web ホストへのシェル アクセスが必要になるか、開発マシンに PHP をローカルにインストールする必要があります。Unix を実行している場合は、すでにインストールされている可能性があります。ターミナルを開いて入力します
php -v
持っている場合は、次のようにして PHP ファイルの構文をチェックできます。
//on *nix
php yourfile.php
//or on windows
c:\path\to\php.exe yourfile.php
これにより、重大な構文エラーが回避されます。また、このサイトで「php をローカルにセットアップするチュートリアル」などで Google または検索して、自分のマシンで実行される Web サーバー、mysql データベース、および php の完全なコピーを入手する方法を学習してください。
2 番目の提案は、エラー ログを確認することです。ローカル コピーをインストールすると簡単になります。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)
接続試行後にキャッチします。
あなたの場合はそれでいいでしょう。あくまでも出発点として。必要に応じて時々これを行います。問題が非常に複雑な問題であると想定するのではなく、リクエスト変数の予期せぬ状態、間違ったページへのアクセス、間違ったタイミングでの正しいページへのアクセスなどが判明することがよくあります。
役立つかもしれない:
Web サーバーのログを監視します (例:
tail -f /var/log/apache2/error.log
)Firebug を使用して、スクリプトからの AJAX 応答をコンソールで確認します。そこでエラーが表示される場合があります
デバッグ エコーに到達しない場合は、何かを見落としていない限り、障害点はデータベース接続付近にあると思われます。
接続の詳細を確認し、mysqli 拡張機能が有効になっていることを確認してください。
私も、通常は IE6 ですが、場合によっては他のブラウザーでも、原因不明の空白のページが表示されるという同様の問題に遭遇しました。文字エンコードの問題であることが判明しました。奇妙な文字が出力され、ブラウザはその内容に基づいてエンコードが何であるかを推測していました。このヘッダーを明示的に設定することで修正しました。
header('Content-type: text/html; charset=utf-8');
$getHtml->bind_param("s", $id);
これがエラーの原因となるかどうかはわかりませんが、それと getRecords の binding_param の最初のパラメータに「i」を含めるべきではないでしょうか?
このページをブラウザから直接呼び出します
?cmd&id=1
返すべきです
「戻る」とはどういう意味ですか?あなたのコードを見る限り、必要なのは ?cmd=
GetSALEData
そうしないと、すべてが内側にラップされるため、空白のページが返されます。 if($cmd=="GetSALEData")
声明。
修正:君は見るべきだ "test contest charset
" クエリ文字列が cmd
「GetSALEData」以外に設定してください。(これら 2 つのテストは後でコードに追加されました。)
ここには試してみるための良い提案がいくつかあります。私がまだ見ていないのは、PHP に十分なメモリが割り当てられていることを確認することです。向こうにいる人たちは、 drupal.org をうまく分解する PHP のメモリ割り当てを増やす方法.
if-elseステートメントの周りに括弧を付けます。私はあなたのコードを編集した人がそこに潜在的な問題を「修正」したかもしれないと感じています。
この問題が発生する理由は、サーバー設定がエラーを表示しないように設定されているため、スクリプトがその実行に依存しているためです。 error_reporting(E_ALL);
- これは、 error_reporting()
関数が実行されます。しかし、 解析エラーがある場合、 error_reporting(E_ALL)
処刑されないだろう, php.ini のエラー報告設定は決して上書きされないため、エラーは表示されません。
唯一の解決策は、htaccess や php.ini などの上位に error_reporting を設定することです。しかし、少なくとも空白ページ = 解析エラーであることがわかりました。
エラーがないことを確認していても、空白のページが表示され続ける場合は、php-process をインストールすることをお勧めします。
yum -y install php-process
また、pear がインストールされていないとこのようなエラーが発生する場合もあります。
yum -y install php-pear php-pear-DB
またはデータベースをインストールするだけ pear install DB
これが空白ページの問題に悩む誰かの役に立てば幸いです。