我做了一个函数来记录我的数据库中的一些信息,所发布的表单的一些元素由选择列表提供(多选)。
所以我有一个数组存储在我的数据库中。
我必须使用事务才能确保一切正常,但这是我第一次使用事务,而且我不知道如何继续循环。
以下是我的功能:
function recordSports() {
if (isset($_POST['edit_sport'])) {
//echappement des variables
$liste_sport = mysql_real_escape_string($_POST['liste_sport']);
$id_user = $_SESSION['login'];
//démarrage des transactions
mysql_query("START TRANSACTION");
//requettage
$query1 = "DELETE FROM `fit__sport_practice`
WHERE
`sport_practice__id_user` = {$id_user}
";
mysql_query($query1);
foreach ($liste_sport as $sport) {
$query = "INSERT INTO `fit__sport_practice`
SET
`sport_practice__id_user` = {$id_user},
`sport_practice__id_sport` = {$sport},
";
mysql_query($query);
}
if ($query1) {
mysql_query("COMMIT");
$retour['message'] = $_SESSION['maj_sport_ok'];
$retour['error'] = 0;
} else {
//sinon on renvoit une erreur
mysql_query("ROLLBACK");
$retour['message'] = $_SESSION['maj_sport_error'];
$retour['error'] = 1;
}
} else {
$retour['message'] = null;
$retour['error'] = null;
}
return $retour;
}
答案 0 :(得分:1)
首先,你不应该使用mysql_ *函数,在这里阅读更多:Why shouldn't I use mysql_* functions in PHP?。据我所知,他们不支持交易,因此我认为您必须切换到PDO或mysqli。
很高兴知道MySQL中的标准数据库存储引擎(如果这就是你正在使用的)MyISAM也不支持事务。我使用InnoDB作为存储引擎和PDO。
注意:如果你有一个包含大量行和/或很多约束的大表,那么与MyISAM相比,InnoDB的性能会有所提高。
交易的基本流程如下(至少使用PDO):
希望这可以帮助您开始交易!
对不起,忘了回答你的实际问题......
foreach循环。您希望回滚检查在循环内部,因此它可以验证每个查询并在需要时回滚。在上面的代码中有类似的东西:
foreach ($liste_sport as $sport) {
$query = "INSERT INTO `fit__sport_practice`
SET
`sport_practice__id_user` = {$id_user},
`sport_practice__id_sport` = {$sport},
";
if(!mysql_query($query)) {
//sinon on renvoit une erreur
mysql_query("ROLLBACK");
$retour['message'] = $_SESSION['maj_sport_error'];
$retour['error'] = 1;
break;
}
}
if (!isset($retour['error'])) {
mysql_query("COMMIT");
$retour['message'] = $_SESSION['maj_sport_ok'];
$retour['error'] = 0;
}