2012-04-30 15 views
0

私は同様のトピックで作られた他の投稿のいくつかを見ましたが、私は彼らが指示していることに従うことができません。PHPは関数呼び出しの中でリダイレクトします

私の問題は基本的に、パスワードリセットが成功した後、私のウェブサイトのメインのログインページにリダイレクトしたいのです。ここで

は、私がこれまで持っているものである:私は私のWebページにリダイレクトしたい場所

if (isset($_POST['Resetpw'])) { 
    if ($query == $_GET['token'] & $_POST['password'] == $_POST['confirmed_password']) { 
     $passwordTest = $_POST['password']; 

     $result = mysql_query("SELECT `tempTicket` FROM users WHERE `username` = '" . $_POST['username'] . "'limit 1;"); 
     $query = mysql_fetch_array($result); 
     mysql_query("UPDATE users SET `tempPass` = '$passwordTest' WHERE `username` = '" . $_POST['username'] . "' "); 
     echo '<div class="success">Password successfully changed!</div> '; 
     //header("Location: www.google.com"); 
     //exit; 

これは、すべての関数内で、コメントアウト部分があります。

したがって、関数を終了すると、関数が終了した後に関数を強制的に開始ページにリダイレクトできます。私はKISSMVCフレームワークを使用しています。

+4

古き良きmysql_ *関数を使って新しいコードを書くのを止めてください。彼らはもはや維持されておらず、コミュニティは[非推奨プロセス](http://news.php.net/php.internals/53799)を始めました。代わりに、準備されたステートメントについて学び、[PDO](http://php.net/pdo)または[MySQLi](http://php.net/mysqli)を使用する必要があります。あなたが学びたい人は[ここではPDO関連の非常に良いチュートリアルです](http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers)。 –

+1

関数が呼び出される前に出力がない限り、必要な処理(エコーの除去)に問題はありません。あなたは[SQLインジェクション](http://stackoverflow.com/questions/60174/best-way-to-stop-sql-injection-in-php)を読むべきです。 – cmbuckley

+1

ああ、SQLインジェクション!少なくとも、mysql_real_escape_string()を使用するか、または他の方法が示唆しているようにPDOに切り替えてください。あなたのコードは現在安全ではなく脆弱です。 – kapa

答えて

2

最初に、私はあなたの入力を消毒してデータベースにアクセスする前に入力する必要がないことを願っています。

私はKISSMVCを認識していません。しかし、私はPHPとブラウザーとサーバーとのやりとりがどのように起こるかを認識しています。だから私はその形式からあなたの質問に近づくでしょう。

ここでは2つのことが分かります。 1つは、トランザクションが正常に実行されたときにユーザーにアラートを与えたいということです。これはリダイレクトで動的に行うことができますが、送信先によって異なります。ユーザーがコントロールできない場所(ユーザーの例でgoogle.comを引用した場所)にユーザーを送信する場合は、javascriptとajaxでアラート(および入力内容)を配信する必要があります。これは、ユーザーのブラウザに出力を既に送信している場合、ヘッダーのリダイレクトが機能しなくなるためです。だから、.jsをコードに実装して、コードを実行して成功/失敗フラグを返すスクリプトへのAJAX呼び出しを行い、成功/失敗のメッセージをトリガする必要があります。

リダイレクト先のコンテンツを制御していて、.jsに触れたくない場合は、成功/失敗のメッセージを保持するために作成した変数を使用する中間ページにリダイレクトできます。出力それをブラウザに送り、そのボタンをクリックすると、クエリ文字列にデータが追加されます。これらはすべてPHP/MySQLで行うことができます。ここでは他の

+0

洞察に感謝します。これはPHPでの私の最初の経験なので、あらゆる知識が役に立ちます。 –

+0

* thumbsup!* Upvotesは感謝の気持ちを示す良い方法です! – Malovich

0

はい、その前にecho文を削除してください。 headerコールの前に画面に何もエコーすることはできません。

エラー処理を追加して、正常に実行されたことを確認し、SQLインジェクションを避けるためにプリペアドステートメントに切り替えることもできます。

3

echo before the redirectを削除してください。

完全パスを使用する場合は、コメントアウトした内容が有効です(例:http://google.com)。

もう一つ:あなたは本当にmysql_*関数の使用(それはthe futureに廃止される予定)をドロップしmysqli_*またはPDOのいずれかを使用する必要があります。

さらにもう1つ:アプリケーションはSQL injectionに脆弱です。

+0

はい私は、SQLインジェクションを扱うためにPHPを学ぶ段階には入っていません。この基本的な機能を停止した後、これらの問題に取り組んでいきます。速やかなご返信ありがとうございます。近いうちに私はこのPDOを検討する予定です。 –

+0

さらに別のこと:KISSMVCはビューを使用するので、あなたの関数で 'echo'を使うべきではありません。 – hakre

+0

そのエコーは、ビュー内に確認メッセージを表示できるバーを一番上に表示します。ビュー内に確認呼び出しを保存して、それをコントローラで使用する場所があればいいですか? –

0

出力バッファリング

誰もがあなたが(空白を含む)ヘッダー呼び出しの前に何かをエコーすることができないと述べています。しかしそれは間違っている事実です。たとえば、php.iniファイルで出力バッファリングを使用してページ全体をバッファリングする場合は、スクリプト内でheader()を自由に使用できます(コードが手動でフラッシュしない限り)。 http://php.net/manual/en/outcontrol.configuration.php

あなたはこのphp.iniの

にoutput_buffering =オンを設定したいです。

そして、コードのどこにでもheader()を使用できます。リダイレクト後、PHPページがリダイレクト後に実行を続けるのを防ぐために、die()またはexit()を使用することを覚えておいてください。

出力バッファリングずに空白を含むブラウザには何も印刷されない必要がありそうヘッダがすでに送信されていないと、もはやPHPによって変更することができます。出力バッファリングは、生成されたページ全体がスクリプトの最後に一度に送信されるので、これを停止します。つまり、ヘッダーはスクリプト内の任意の場所で自由に変更できます。

P.S.

他の人が述べたように、あなたのSQLはSQL injectionに対して脆弱ではありません、あなたは、もはやmysql_を使用する必要があります*代わりに* depretiatedされているため、mysql_に* PDOまたはmysqli_に切り替えます。

関連する問題