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();
}
それはMySQLのキャッシュ問題かもしれない...また、あなたは直接mysqlを解釈するクエリを入力しようとすることができます – Ency