7

再開:

PHP はサーバー側の言語であるため、どのブラウザーを使用しても問題ないと思っていましたが、どうやらそうではないようです。Google Chrome しか使っていませんでした。

ローカル マシンに WAMP をインストールしたので、ローカルでテストして、共有ホスティング アカウントと同じように動作するかどうかを確認できます。両方のコードは、本来あるべき方法で機能しました (Chrome で気をつけてください)。次に、共有ホスティングでまったく同じコードを調べました.1つは機能し、もう1つは機能しませんでした.

共有ホスティング サポートに電話したところ、問題を再現しようとしたところ、見つからないと言われました。それで、私はFirefoxとIEで試してみました.WAMPと同じように、両方で完全に機能しました。

これはまだ私にはあまり意味がありません。よく知られているホスティング会社との共有ホスティング アカウントで PHP 5.3 を使用していますが、コードを実際にトラブルシューティングできないため、どこにも行きません。彼らは問題を再現できますが、その理由については答えられません。今後数週間のうちに詳細を調べて、最新情報を投稿するつもりです。

私がやろうとしていることはこれです:

  • 数値の範囲を生成する
  • それらをランダムな順序にシャッフルします
  • ランダムに並べられた数字の配列をセッション配列にコピーします
  • 配列の最初の値を取得し、その値を削除して、すべての値を 1 つ下にシフトします

これが私の問題です:

使用array_shift();してみましたが、最初の実行では問題なく動作しましたが、コードを実行するたびに最初の 2 つの要素が削除されました。

何が起こっているのかをテストするために、最初に配列を印刷してarray_shift();から、配列を再度印刷して何が起こったのかを確認しました。

予想された結果:

実行 #1:

[0]=>5 [1]=>2 [2]=>1 [3]=>4 [4]=>3  //print_r($array);
                                    //execute array_shift($array);
[0]=>2 [1]=>1 [2]=>4 [3]=>3         //print_r($array);

実行 #2:

[0]=>2 [1]=>1 [2]=>4 [3]=>3         //print_r($array);
                                    //execute array_shift($array);
[0]=>1 [1]=>4 [2]=>3                //print_r($array);

実績:

実行 #1:

[0]=>5 [1]=>2 [2]=>1 [3]=>4 [4]=>3  //print_r($array);
                                    //execute array_shift($array);
[0]=>2 [1]=>1 [2]=>4 [3]=>3         //print_r($array);

実行 #2:

[0]=>1 [1]=>4 [2]=>3                //print_r($array);
                                    //execute array_shift($array);
[0]=>4 [1]=>3                       //print_r($array);

私の問題 (続き)

そこで、array_shift($array); の代わりにreset($array);, unset($array[0]);, andを使用してみました。array_splice($array,1,0);そしてそれはうまくいきました!次に、それらを並べて比較してコードをクリーンアップしようとしましたが、今では互いに反対のことをしています。場合によっては、リセット、設定解除、および array_shift; 一度呼び出されると、配列内の最大 7 つのセルをジャンプすることさえできます。array_shift();今は思い通りに機能していますが、その理由を知りたいです。それは私を夢中にさせています!誰かが私を助けてくれたら、とても感謝しています。

コード ダンプ:

アンセット、リセット、スプライス

<?php
session_start();
$min = A; 
$max = S;

if((!isset($_SESSION['image'])) || ($_SESSION['image'] == null))
{
$numbers = range($min, $max);  //set a range for all images 
shuffle($numbers); //shuffle the order for randomness

$_SESSION['image'] = $numbers;

echo "<br />Current value: " . $_SESSION['image'][0] . "<br />";
print_r($_SESSION['image']);

reset($_SESSION['image']);
unset($_SESSION['image'][0]);
array_splice($_SESSION['image'],1,0);
echo "<br />New value: " . $_SESSION['image'][0] . "<br />";
echo "<br />1st exec<br />";

}
else
{
echo "<br />Current value: " . $_SESSION['image'][0] . "<br />";
print_r($_SESSION['image']);



reset($_SESSION['image']);
unset($_SESSION['image'][0]);
array_splice($_SESSION['image'],1,0);
echo "<br />New value: " . $_SESSION['image'][0] . "<br />";
echo "<br />2nd exec<br />";

}
?>

シフト

<?php
session_start();
$min = A; 
$max = S;

if((!isset($_SESSION['id2'])) || ($_SESSION['id2'] == null))
{
$numbers = range($min, $max);  //set a range for all images 
shuffle($numbers); //shuffle the order for randomness

$_SESSION['id2'] = $numbers;

echo "<br />Current value: " . $_SESSION['id2'][0] . "<br />";
print_r($_SESSION['id2']);

array_shift($_SESSION['id2']);
echo "<br />New value: " . $_SESSION['id2'][0] . "<br />";
echo "<br />1st execution<br />";

}
else
{
echo "<br />Current value: " . $_SESSION['id2'][0] . "<br />";

print_r($_SESSION['id2']);

array_shift($_SESSION['id2']);
echo "<br />New value: " . $_SESSION['id2'][0] . "<br />";
echo "<br />2nd execution<br />";

}
?>
4

2 に答える 2

1

実際のコードを貼り付けたとすると、これが発生する唯一の方法は、意図しない中間リクエストを行った場合です。しかし、与えられた情報だけでは、これがどのように、またはなぜそうなるのかを判断することは不可能です。

私の提案は、選択したブラウザ開発ツール(Firebugなど)を使用し、ネットワークタブを監視して、スクリプトに送信されているリクエストが1つだけであることを確認することです。これで問題が解決しない場合は、次のような簡単なデバッグログを追加します。

$log = date('Y-m-d H:i:s')
     . ' :: Request received from '
     . $_SERVER['REMOTE_ADDR']
     . "\n";
file_put_contents('/path/to/your/log/file', $log, FILE_APPEND);

次に、テスト後にログをチェックして、エントリが1つだけ追加されていることを確認します。

于 2012-09-20T04:23:29.703 に答える
1

最終的に何が起こっているのかを知るために、 tick-function を登録することを提案します。tick 関数は、PHP ステートメントの実行ごとに実行できます。

これは、各ステートメントの行/ファイルをトレースする簡単なものです(さらに詳細を追加してください)。

// Execute at each single statement
declare(ticks=1);

// Function to get called at each executing statement    
function logEachStatement() {

  $traceInfo = debug_backtrace();
  $lastActivation = $traceInfo[ count( $traceInfo ) - 1 ];

  $info = "\n" 
        . $lastActivation[ 'line' ]  . '@' . $lastActivation[ 'file' ] 
        ;

  $targetFile = dirname( __FILE__ ) . '/stmnt.log' );

  file_put_contents( $targetFile, $info, FILE_APPEND );

}

// using a function as the callback
register_tick_function( 'logEachStatement', true );

問題を追跡する方法は他にもありますが、これは外部インフラストラクチャを必要としません

于 2012-09-20T00:52:05.663 に答える