Значение автоинкремента MySQL увеличивается на 2, когда я добавляю транзакцию в свой php-код - PullRequest
1 голос
/ 06 марта 2012

У меня есть таблица с информацией о пациентах и ​​еще одна для их телефонных номеров.Соотношение между ними составляет 1: N (от 1 до многих).Я наложил одно ограничение: я хочу, чтобы у всех пациентов был хотя бы один номер телефона.Итак, я помещаю транзакцию в свой код следующим образом.

// Beggining of transaction 
mysqli_query($dbc,'begin'); 
$sql1 = "   INSERT INTO  `dental_clinic`.`patient` (`idpatient` ,`surname` ,`name` ,`middle_name` ,`address` , `town`,  `birth_date` , `occupation` , `email` ,`p_comments`)    VALUES (NULL ,  '$surname',  '$name',  '$middle_name',  '$address',  '$town',  '$birth_date',  '$occupation',  '$email', '$other');
        ";
$execute_sql1 = mysqli_query($dbc, $sql1);  
$last_id =  mysqli_insert_id($dbc); 

//  Put some variables to the insert queries of telephone.  
$sql2_1 = " INSERT INTO `dental_clinic`.`telephone`(`patient_idpatient`, `phone`) VALUES ('$last_id', '$phone') ";    
$sql2_2 = "INSERT INTO  `dental_clinic`.`telephone`(`patient_idpatient`, `phone`) VALUES ('$last_id', '$phone2')";
$sql2_3 = "INSERT INTO  `dental_clinic`.`telephone`(`patient_idpatient`, `phone`) VALUES ('$last_id', '$phone3')";

// Checking the first field of telephone 
if (!empty($phone)){  
    $execute_sql2_1 = mysqli_query($dbc, $sql2_1);  
} else {
    $execute_sql2_1 = false;  
}

//  Checking the second field of telephone
if (!empty($phone2)){  
    $execute_sql2_2 = mysqli_query($dbc, $sql2_2);  
} else {
    $execute_sql2_2 = true;  
}

//  Checking the third field of telephone
if (!empty($phone3)){   
    $execute_sql2_3 = mysqli_query($dbc, $sql2_3);  
} else {  
    $execute_sql2_3 = true;  
}  

//  Checking the insert commands to execute toggether
if ($execute_sql1 && $execute_sql2_1){  
    if ($execute_sql2_1 && $execute_sql2_2){  
        if ($execute_sql2_1 && $execute_sql2_3){  
            mysqli_query($dbc, 'commit');  
            echo 'The patient personal details inserted succesfully!';  
            echo 'The primary telephone inserted succesfully! ';  
            header("Location: new_medical_history.php");  
        } else {  
            mysqli_query($dbc, 'rollback');  
            echo 'Error, on 3rd phone! ';  
        }  
    } else {  
        mysqli_query($dbc, 'rollback');  
        echo 'Error, on 2nd phone! ';    
    }  
} else {  
    mysqli_query($dbc, 'rollback');  
    echo 'Error, on patient personal details or on primary telephone! ';  
}  

//  Ending connection
mysqli_close($dbc);

Обе таблицы patient и telephone находятся в одной форме.

Когда я успешно добавляю нового пациентазначение автокремента idpatient увеличивается на два (1,3,5,7 и т. д.). Но когда я закомментирую транзакцию,

 // mysqli_query($dbc,'begin);  
 // mysqli_query($dbc, 'commit');  
 // mysqli_query($dbc, 'rollback');  

, тогда значение автоинкремента становится нормальным на единицу (7,8,9,10, .. и т. Д.).

Не могли бы вы сказать , почему это происходит ?Это что-то не так в моем коде?Я хочу сохранить транзакцию , чтобы никто из пациентов не был добавлен без основного номера телефона.

1 Ответ

0 голосов
/ 11 марта 2012

Мне трудно следовать вашей логике, поэтому я переписал ваш код с использованием try-catch, я считаю, что он удовлетворяет тем же требованиям и его легче следовать.Это все еще вызывает скачок на 2?

// fixme: consider using prepared statements to avoid sql injection attacks

mysqli_query($dbc,'begin');

try {
    if(!mysqli_query($dbc, "INSERT INTO `dental_clinic`.`patient` (`idpatient` ,`surname` ,`name` ,`middle_name` ,`address` , `town`,  `birth_date` , `occupation` , `email` ,`p_comments`) VALUES (NULL, '$surname', '$name', '$middle_name', '$address', '$town', '$birth_date', '$occupation', '$email', '$other')")) throw new Exception('Error, on patient personal details!');
    $last_id =  mysqli_insert_id($dbc); 

    if(empty($phone)) throw new Exception('Error, primary phone required!');

    if(!empty($phone) && !mysqli_query($dbc, "INSERT INTO `dental_clinic`.`telephone`(`patient_idpatient`, `phone`) VALUES ('$last_id', '$phone')")) throw new Exception('Error, on primary telephone!');
    if(!empty($phone2) && !mysqli_query($dbc, "INSERT INTO `dental_clinic`.`telephone`(`patient_idpatient`, `phone`) VALUES ('$last_id', '$phone2')")) throw new Exception('Error, on 2nd phone!');
    if(!empty($phone3) && !mysqli_query($dbc, "INSERT INTO `dental_clinic`.`telephone`(`patient_idpatient`, `phone`) VALUES ('$last_id', '$phone3')")) throw new Exception('Error, on 3rd phone!');

    mysqli_query($dbc, 'commit');  

    // these will not be seen if you immediately redirect
    //echo 'The patient personal details inserted succesfully!';  
    //echo 'The primary telephone inserted succesfully! ';  

    header("Location: new_medical_history.php");  
} catch(Exception $e) {
    mysqli_query($dbc, 'rollback');  
    echo $e->getMessage();
}

//  Ending connection
mysqli_close($dbc);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...