Невозможно удалить записи в таблице, которые имеют соответствующие связанные значения в другой таблице - PullRequest
0 голосов
/ 31 марта 2019

Я пытаюсь обновить и удалить некоторые элементы на веб-сайте администратора ресторана. Таблица restaurant имеет первичный ключ rest_id и связана с таблицей ресторана items с помощью этого ключа.

Когда я пытаюсь удалить запись в ресторане, для которой соответствующие элементы в items не были заполнены, мой код работает. Но когда запись в ресторане содержит несколько записей в таблице items, запрос на удаление ничего не делает, а просто обновляет страницу.

Я пытаюсь удалить все записи как в таблице restaurant, так и в таблице items. То есть, если ресторан удален, я хочу, чтобы его элементы также были удалены.

//Update.php
<?php
    $con = mysqli_connect("127.0.0.1","root","toor");
    mysqli_select_db($con, 'eatrebs');
    $id = isset($_POST['id']) ? $_POST['id'] : '';
    $name = isset($_POST['rname']) ? $_POST['rname'] : '';
    $email = isset($_POST['email']) ? $_POST['email'] : '';
    $address = isset($_POST['address']) ? $_POST['address'] : '';
    if(isset($_POST['del']))
    {
        if ($sql = mysqli_prepare($con,"DELETE FROM restaurant where restaurant.rest_id = ?")){
            $sql -> bind_param("s",$id);
            $sql -> execute ();
            $sql -> close();
            header('refresh:1; url="index.php"');
        }
        else{
            echo"No update";
        }
    }
    else{
        if ($sql = mysqli_prepare($con,"UPDATE restaurant SET rest_name = ?,email=?, address=? WHERE rest_id = ?")){
            $sql ->bind_param("ssss", $name, $email, $address, $id);
            $sql -> execute();
            $sql -> close();
            header('refresh:1; url="index.php"');
        }
        else{
            echo "No update";
        }
    }




?>




//index.php

<html>
    <head>
         <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.0/css/bootstrap.min.css">
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.0/css/bootstrap.css">

        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>


        <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.0/js/bootstrap.min.js"></script>
        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
        <link rel="stylesheet" href="popup.css">
        <link rel="stylesheet" href="PopupSearch.css">
        <script src="popup.js"></script>
        <script src="PopupSearch.js"></script>
        <meta charset="UTF-8">
        <title>Owner's view</title>
    </head>
    <body>
        <?php
        //Connect to mysql db
        $con = mysqli_connect('127.0.0.1','root','toor');
        //select database
        mysqli_select_db($con,'eatrebs');
        //Select query
        $sql = "SELECT * FROM restaurant";
        //Execute query
        $records = mysqli_query($con,$sql);

        ?>
        <table>
            <h1 align="left">
                Restaurant Listings
                <button class="btn">
                    <i class="fa fa-bars"></i>
                </button>
            </h1>
            <Hr>
            <div id="Listingsblock">
            <thead>
            <tr>
            <div id="Listing_Labels">
            <th class="text-center">Restaurant Name</th>
            <th class="text-center">Email</th>
            <th class="text-center">Address</th>
            </tr>
            </div>
            </thead>
            <tbody>
        <?php
        while ($row = mysqli_fetch_array($records))
        {

            echo '<tr><form action="update.php" method="post">';
            echo"<input type=hidden name=id value='".$row['rest_id']."'></td>";
            echo "<td><input type = text name = \"rname\"  value = '".$row['rest_name']."'</td>";
            echo "<td><input type = text name = \"email\"  value = '".$row['email']."'</td>";
            echo "<td><input type = text name = \"address\"  value = '".$row['address']."'</td>";
            echo"<td><input type=submit value=\"Update\">";
            echo'<td><Button btn btn-primary btn-lg pull-left name=del>Delete</Button>';
            echo "</form>";

            echo '<form action="Menu/viewMenu.php" method="post">';
            echo"<input type=hidden name=iid value='".$row['rest_id']."'></td>";
            echo"<td><input type=submit value=\"View Menu\" name=viewMenu>";
            echo'</form></tr>';

        }
        $a = mysqli_num_rows($records);
        if($a==0){
            echo'<h1>No Records Available</h1>';

        }


        ?>
            </tbody>
            </table>
        <hr>
        <hr>
        </div>
        <!--Insert Records-->
        <h1 align="left">
            Create new Listing
            <button type="button" class="btn btn-default btn-sm" onclick="openForm()">
                <span class="glyphicon glyphicon-plus-sign"></span> Plus
            </button>
        </h1>
        <br>
        <!--create entry popup-->






        <div class="form-popup" id="myForm">
            <form action="create.php" class="form-container" method="post">
            <h1>Register</h1>

            <label for="rname2"><b>Restaurant Name</b></label>
            <input type="text" placeholder="Enter Restaurant Name" name="rname2" required>

            <label for="email2"><b>Email</b></label>
            <input type="text" placeholder="Enter email" name="email2" required>

            <label for="address2"><b>Address</b></label>
            <input type="text" placeholder="Enter Address" name="address2" required>

            <button type="submit" class="btn">Register</button>
            <button type="button" class="btn cancel" onclick="closeForm()">Close</button>
          </form>

        </div>
  <hr>
        <hr>
</body>
</html>

1 Ответ

1 голос
/ 31 марта 2019

Прежде всего, вы отбрасываете ответ на запрос к вашей базе данных.

Вы должны захватить это и действовать соответственно.mysqli_stmt::execute() возвращает true в случае успеха и false в случае ошибки.Если это не удастся, вы, вероятно, должны что-то сделать с его error().Это позволит вам избежать «моей страницы просто обновляется», показывая сообщение об ошибке, чтобы объяснить, что происходит.

Во-вторых, ваша база данных защищает вас.Он хочет, чтобы ваши данные были правильно сформированы, и если вы удаляете запись, на которую ссылается другая запись, она не знает, что должна делать.Самое безопасное, и во многих случаях действительно правильное, - это отказаться от удаления указанной записи.

Однако вы можете изменить это поведение.Когда вы добавляете свое ограничение , вы можете предоставить предложение ON DELETE, например,

ALTER TABLE item
  ADD CONSTRAINT restaurant_fk
  FOREIGN KEY (rest_id)
  REFERENCES restaurant(id)
  ON DELETE CASCADE;

Здесь ON DELETE CASCADE сообщает вашей базе данных, что она должна удалить item s при их соответствующем restaurant s удалены.

Вам нужно будет удалить старое ограничение, прежде чем добавить это.Это зависит от того, как он настроен в данный момент, но что-то вроде

ALTER TABLE item
  DROP FOREIGN KEY whatever_its_name_is;

должно сработать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...