Как обновить базу после транзакции?
У меня есть сайт Drupal 7, на котором установлена настроенная тема, и мы также добавили несколько новых таблиц и расширили некоторые другие. Прямо сейчас я настроил Ubercart для продажи наших продуктов на основе таксономии. Когда покупка завершена, мне нужно обновить пользовательскую таблицу в MySQL, поэтому я сделал процедуру для этого.
В MySQL создан процесс, который будет обновлять нужные мне таблицы, все, что мне нужно передать в процесс, - это uid (такой же, как в таблице пользователей) и идентификатор таксономии, выбранной во время покупки.
Я создал следующий код для выполнения вызова, но я не уверен, что лучший способ передать 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 ответ
Вы можете запустить свой код после покупки с помощью Ubercart's 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