【问题标题】:How to update the database after transaction?事务后如何更新数据库?
【发布时间】:2016-08-31 22:17:37
【问题描述】:

我有一个安装了自定义主题的 Drupal 7 站点,我们还添加了一些新表格并扩展了其他一些表格。 现在我已经建立了 Ubercart 来根据分类销售我们的产品。购买完成后,我需要更新 MySQL 中的自定义表,因此我创建了一个 proc 来执行此操作。

在 MySQL 中,创建了一个 proc 来更新我需要的表,我需要传递给 proc 的只是 uid(与 users 表相同)和在期间选择的分类的 id购买。

我创建了以下代码来进行调用,但我不确定将 uid 和 tid 传递给 proc 的最佳方法是什么?我应该在 Drupal 中使用规则吗?

<?php
$mysqli = new mysqli("mysite.com", "user", "password", "db1");
if ($mysqli->connect_errno) {
    echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}

if (!$mysqli->query("CALL UpdateUserDestList(uID, tID")) {
    echo "CALL failed: (" . $mysqli->errno . ") " . $mysqli->error;
}
?>

【问题讨论】:

    标签: drupal-7 ubercart


    【解决方案1】:

    您可以在购买后使用 Ubercart 的 hook_uc_checkout_complete() 触发您的代码。您将希望在自定义模块中定义它,而不是从主题中定义,因为这是业务逻辑而不是显示信息。在挂钩中,您将可以访问订单和下订单的用户帐户。

    真正使用 Drupal 或任何其他框架时,您应该尽可能利用内置工具,以从它们提供的结构中受益。

    // Get the Drupal database connection and change the statement class to PDOStatement.
    // Save the current class for cleanup later.
    $conn = Database::getConnection();
    $saved_class = $conn->getAttribute(PDO::ATTR_STATEMENT_CLASS);
    $conn->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('PDOStatement'));
    
    // Prepare the statement and bind params
    $statement = $conn->prepare("Call GetNodeList(?,?)");
    
    $op_status = $statement->bindParam(1, $node_type, PDO::PARAM_STR | PDO::PARAM_INPUT_OUTPUT, 25);
    $op_status = $statement->bindParam(2, $publish_state, PDO::PARAM_INT | PDO::PARAM_INPUT_OUTPUT);
    
    // Execute the statement and reset the connection's statement class to the original.
    $exec_result = $statement->execute();
    $conn->setAttribute(PDO::ATTR_STATEMENT_CLASS, $saved_class);
    
    // Get your data
    while ($row = $statement->fetchColumn(0)) {
      // ...
    }
    

    代码取自:https://drupal.stackexchange.com/questions/32708/how-to-execute-stored-procedures-in-drupal,而后者又引用了:http://public-action.org/content/stored-procedures-and-drupal-7

    【讨论】:

    • 我在这个钩子中进行测试,我认为它实际上并没有被调用,尽管文档说它确实被调用了。即使我把错误的代码放在那里并完成结帐过程,我也不会收到任何错误
    • 一些值得尝试的事情:1) 加载模块页面以确保drupal 已经注意到新的钩子。 2)仔细检查钩子名称的拼写应该是:[module_name]_uc_checkout_complete()。
    猜你喜欢
    • 1970-01-01
    • 2016-07-18
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 2011-03-05
    • 2015-01-18
    • 2020-11-17
    • 1970-01-01
    相关资源
    最近更新 更多