【问题标题】:PHP/SQL - SQLSTATE[23000]: Integrity constraint violationPHP/SQL - SQLSTATE[23000]:违反完整性约束
【发布时间】:2022-01-30 12:07:01
【问题描述】:

警告:第 75 行 C:\Users\Caleb\PhpstormProjects\barberspoint-flakkee\appointment.php 中的数组到字符串转换

SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`barbershop`.`appointments`, CONSTRAINT `FK_client_appointment` FOREIGN KEY (`client_id`) REFERENCES `clients` (`client_id`) ON DELETE CASCADE)

PHP 代码:(我已经放了第 75 行的文字)

$stmt_appointment->execute(array(Date("d-m-Y H:i"), $client_id, $selected_employee, $start_time, $end_time));

if (isset($_POST['submit_book_appointment_form']) && $_SERVER['REQUEST_METHOD'] === 'POST') {
            // Selected SERVICES

            $selected_services = $_POST['selected_services'];

            // Selected EMPLOYEE

            $selected_employee = $_POST['selected_employee'];

            // Selected DATE+TIME

            $selected_date_time = explode(' ', $_POST['desired_date_time']);

            $date_selected = $selected_date_time[0];
            $start_time = $date_selected . " " . $selected_date_time[1];
            $end_time = $date_selected . " " . $selected_date_time[2];


            //Client Details

            $client_first_name = test_input($_POST['client_first_name']);
            $client_last_name = test_input($_POST['client_last_name']);
            $client_phone_number = test_input($_POST['client_phone_number']);
            $client_email = test_input($_POST['client_email']);

            $con->beginTransaction();

            try {
                // Check If the client's email already exist in our database
                $stmtCheckClient = $con->prepare("SELECT * FROM clients WHERE client_email = ?");
                $stmtCheckClient->execute(array($client_email));
                $client_result = $stmtCheckClient->fetch();
                $client_count = $stmtCheckClient->rowCount();

                if ($client_count > 0) {
                    $client_id = $client_result["client_id"];
                } else {
                    $stmtgetCurrentClientID = $con->prepare("SELECT AUTO_INCREMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'barbershop' AND TABLE_NAME = 'clients'");

                    $stmtgetCurrentClientID->execute();
                    $client_id = $stmtgetCurrentClientID->fetch();

                    $stmtClient = $con->prepare("insert into clients(first_name,last_name,phone_number,client_email) 
                                    values(?,?,?,?)");
                    $stmtClient->execute(array($client_first_name, $client_last_name, $client_phone_number, $client_email));
                }


                $stmtgetCurrentAppointmentID = $con->prepare("SELECT AUTO_INCREMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'barbershop' AND TABLE_NAME = 'appointments'");

                $stmtgetCurrentAppointmentID->execute();
                $appointment_id = $stmtgetCurrentAppointmentID->fetch();

                $stmt_appointment = $con->prepare("insert into appointments(date_created, client_id, employee_id, start_time, end_time_expected ) values(?, ?, ?, ?, ?)");
                **THIS IS LINE 75** $stmt_appointment->execute(array(Date("d-m-Y H:i"), $client_id, $selected_employee, $start_time, $end_time));

                foreach ($selected_services as $service) {
                    $stmt = $con->prepare("insert into services_booked(appointment_id, service_id) values(?, ?)");
                    $stmt->execute(array($appointment_id[0], $service));
                }

                echo "<div class = 'alert alert-success'>";
                echo "Great! Your appointment has been created successfully.";
                echo "</div>";

                $con->commit();
            } catch (Exception $e) {
                $con->rollBack();
                echo "<div class = 'alert alert-danger'>";
                echo $e->getMessage();
                echo "</div>";
            }
        }

我只是不明白这是怎么发生的。 #爱好

【问题讨论】:

  • fpor是什么的SELECT auto_increment,mysql可以自己处理,php和mysql都有lastid选项,可以用你的client id is not valid,所以你的流控出了问题

标签: php mysql sql


【解决方案1】:

使用您的代码

$stmtgetCurrentClientID = $con->prepare("SELECT AUTO_INCREMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'barbershop' AND TABLE_NAME = 'clients'");
$stmtgetCurrentClientID->execute();
$client_id = $stmtgetCurrentClientID->fetch();

变量 $client_id 是一个数组。然后你尝试输入整个数组作为 id。下一行显示它应该如何正确。

$stmt_appointment->execute(array(Date("d-m-Y H:i"), $client_id, ... // your code
$stmt_appointment->execute(array(Date("d-m-Y H:i"), $client_id['AUTO_INCREMENT'], ...

顺便说一句:$con->lastInsertId();是在插入之后获取当前 id 的更好方法,而不是在插入之前选择 AI。

【讨论】:

  • 通过添加['AUTO_INCREMENT']来修复,你只是做$con->lastInsertId();是什么意思?喜欢把它代替 $client_id 吗?
  • 在查询insert into clients ... 之后,您可以使用$client_id = $con-&gt;lastInsertId(); 获取ID
猜你喜欢
  • 2015-01-20
  • 2014-08-18
  • 2015-03-19
  • 2015-11-27
  • 2017-09-11
  • 2015-07-17
  • 2021-03-08
  • 2021-07-23
相关资源
最近更新 更多