在更新后直接检索记录时,PHP页面不显示来自MySQL的更新数据

时间:2010-12-05 21:09:28

标签: php mysql

我在PHP / MySQL Web应用程序中有一个简单页面,允许管理员用户编辑HTML模板电子邮件(存储在数据库中)。基本上,要编辑模板,用户键入文本区域并提交一个回发到同一页面的表单。

提交表单时,会调用一个PHP函数,通过对MySQL存储函数的参数化查询来更新数据库中的记录。

最后,从数据库中检索记录,并在页面上显示信息 - 第一次显示页面时也会发生此步骤。

我遇到的问题是,虽然在检索显示之前数据库中的记录正在更新,但页面仍然会在更新之前显示旧数据。页面上的其他内容,例如标题更新成功 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()

将记录作为对象返回

请帮忙。

2 个答案:

答案 0 :(得分:0)

希望您将使用engine = innodb,以便您可以使用交易:

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();
}

答案 1 :(得分:0)

我最终设法解决了这个问题,虽然不是我想要的方式。在我尝试升级MySQL和PHP之后,由于各种依赖性问题,我设法破坏了服务器上的Linux安装。我最终不得不从头开始重建服务器。

我原始问题中的代码现在按预期工作。我怀疑问题可能是InnoDB设置行在原始MySQL安装的my.cnf文件中被注释掉了。