如何在事务后更新数据库?

时间:2016-05-06 00:12:02

标签: drupal-7 ubercart

我有一个安装了自定义主题的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;
}
?>

1 个答案:

答案 0 :(得分:0)

您可以在购买后使用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