2010-12-05 22 views
0

adminユーザーがHTMLテンプレートの電子メール(データベースに保存されている)を編集できるPHP/MySQL Webアプリケーションに単純なページがあります。基本的に、ユーザーがテキストエリアに入力したテンプレートを編集し、同じページにポストバックするフォームを送信します。更新された直後にレコードが取得されたときに、PHPのページにMySQLの更新データが表示されない

フォームが送信されると、PHPストアドファンクションへのパラメータ化されたクエリを使用してデータベースのレコードを更新するPHP関数が呼び出されます。

最後に、レコードがデータベースから取得され、情報がページに表示されます。この手順は、ページが最初に表示されているときにも発生します。

私が抱えている問題は、レコードがデータベースで更新されて表示される前に、ページがレンダリング時に更新前の古いデータを表示しているということです。更新が成功したことを示すバナーメッセージなどのページ上のその他のものDOが更新されるため、ブラウザのキャッシュ問題ではないと思います。行を追加する:sleep(1);レコードの更新が問題を解決したので、ページに更新されたレコードが表示されますが、パフォーマンス上の理由からこれは理想的ではありません。なぜこの問題が最初に起きているのか理解できません。ここで

は、ページの最上部からPHPコードです:

require_once('includes/global.php'); 
require_once('includes/emailtemplateutils.php'); 

$strMsg = ''; 

$lngEmailTemplatePK = ConvertToString($_GET['key'], 0); 

if (ConvertToString($_POST['hdnSave']) == '1') 
{ 

    $strFromAddress = ConvertToString($_POST['txtFromAddress']); 
    $strSubjectLine = ConvertToString($_POST['txtSubjectLine']); 
    $strBodyHTML = ConvertToString($_POST['txtBodyHTML']); 

    if (EmailTemplate_Update($lngEmailTemplatePK, $strFromAddress, $strSubjectLine, $strBodyHTML)) 
    { 

     $strMsg = FormatMsg('E-mail template updated.'); 

    } 
    else 
    { 

     $strMsg = FormatErrorMsg('Could not save e-mail template!'); 

    } 

} 

$objEmailTemplate = EmailTemplate_Display($lngEmailTemplatePK); 

これは、実際に更新しEmailTemplate_Update()関数のコードです:取得するための

function EmailTemplate_Update($lngEmailTemplatePK, $strFromAddress, $strSubjectLine, $strBodyHTML) 
{ 

    $objConn = new mysqli(cstrGlobal_DbServer, cstrGlobal_DbUsername, cstrGlobal_DbPassword, cstrGlobal_DbCatalog); 

    if (mysqli_connect_errno()) 
    { 
     printf("Connect failed: %s\n", mysqli_connect_error()); 
     exit(); 
    } 

    $strQuery = "SELECT srf_EmailTemplate_Update(?, ?, ?, ?)"; 

    $objStmt = $objConn->prepare($strQuery); 

    $objStmt->bind_param('isss', $lngEmailTemplatePK, EmptyToNull($strFromAddress), EmptyToNull($strSubjectLine), EmptyToNull($strBodyHTML)); 

    $objStmt->execute(); 

    $objStmt->bind_result($lngRetVal); 

    $objStmt->fetch(); 

    $objStmt->close(); 

    $objConn->close(); 

    return $lngRetVal == 1; 

} 

機能を表示用のレコードは少し畳み込まれていますが、基本的にはmysqli fetch_object()を使用してオブジェクトとしてレコードを戻します。

助けてください。私は最終的にこの問題を解決するために管理

try 
{ 
    $conn = new mysqli("localhost", "foo_dbo", "pass", "foo_db", 3306); 

    $conn->autocommit(FALSE); // start transaction 

    do CRUD work... 

    $conn->commit(); 
} 
catch(exception $ex) 
{ 
    $conn->rollback(); 
} 
+0

それはMySQLのキャッシュ問題かもしれない...また、あなたは直接mysqlを解釈するクエリを入力しようとすることができます – Ency

答えて

0

方法で、私が計画しているだろうしていないが、:あなたはトランザクションを使用できるように

0

うまくいけば、あなたはエンジン= InnoDBテーブルを使用することがあります。私は、MySQLとPHPをアップグレードしようとした後、さまざまな依存関係の問題のために、Linux上のLinuxインストールを中断しました。私は最初からサーバーを再構築する必要がありました。

私の元の質問のコードは、期待通りに機能するようになりました。私は、InnoDBの設定行がオリジナルのMySQLインストールのmy.cnfファイルでコメントアウトされている可能性があると考えています。

関連する問題