2015-12-02 1 views
0

У меня есть страница PHP, которая заполняет две разные таблицы моей базы данных.Проблема с внешним ключом при добавлении данных в базу данных базы данных

После того, как я добавлю новый столбец, а затем создаю внешний ключ, данные больше не могут быть вставлены в эту таблицу. Если я удалю внешний ключ, тогда он снова будет работать ... Кто-нибудь испытал что-то подобное раньше?

Это, как я заполнить обе таблицы из одной и той же странице:

include("../includes/connection.php"); 

$name = mysqli_real_escape_string($link, $_POST['name']); 
$email = mysqli_real_escape_string($link, $_POST['email']); 
$number = mysqli_real_escape_string($link, $_POST['number']); 
$device = mysqli_real_escape_string($link, $_POST['device']); 
$price = mysqli_real_escape_string($link, $_POST['price']); 
$payment = mysqli_real_escape_string($link, $_POST['payment']); 
$status = mysqli_real_escape_string($link, $_POST['status']); 
$model = mysqli_real_escape_string($link, $_POST['model']); 
$problem = mysqli_real_escape_string($link, $_POST['problem']); 

// attempt insert query execution 

$sql = "INSERT INTO customer (name, mail, number, device, price, paymenttype,status,date) VALUES ('$name', '$email', '$number', '$device', '$price', '$payment','$status',NOW())"; 

if(mysqli_query($link, $sql)){ 
    // echo "Records added successfully."; 
    header("location:add-customer.php?message=The customer has been added to the database1"); 
    } else{ 
    echo "ERROR: Could not able to execute $sql. " . mysqli_error($link); 
}   
$sql = "INSERT INTO job (device, model, problem, status) VALUES ('$device', '$model', '$problem', '$status')"; 

if(mysqli_query($link, $sql)){ 
    // echo "Records added successfully."; 
    header("location:add-customer.php?message=The customer has been added to the database2"); 
} else{ 
    echo "ERROR: Could not able to execute $sql. " . mysqli_error($link); 
} mysqli_close($link);?> 

И это картина может лучше объяснить, что я хочу добиться:

  1. один в фоном является JOB_Table.
  2. В каждой строке JOB_Table есть кнопка «информация», чем в onclick должны отображать данные, собранные с CUSTOMER_table.

Пример:
кнопка «Информация» в первом ряду, хочет получить первую строку таблицы клиентов ..
кнопки «информации» во втором ряду, хочет получить вторую строку таблицы клиентов ...

enter image description here

--------- модального всплывающий код, который собирает таблицы клиентов после щелчка -----

<div class="modal fade" id="myModal" role="dialog"> 
    <div class="modal-dialog modal-lg"> 
    <!-- Modal content--> 
     <div class="modal-content"> 
     <div class="modal-header"> 
      <button type="button" class="close" data-dismiss="modal">&times;</button> 
      <h4 class="modal-title">Customer Information</h4> 
     </div> 
     <div class="modal-body"> 


     <?php 

include("../includes/connection.php"); 

if ($link->connect_errno > 0) { 
    die('Unable to connect to database [' . $link->connect_error . ']'); 
} 
$sql = "SELECT id,name,mail,number,price,paymenttype,faktura,date from customer WHERE  id = '[job_id]' "; 



if (!$result = $link->query($sql)) { 
    die('There was an error running the query [' . $link->error . ']'); 
} 
echo " 
<table class='table'> 
    <thead> 
     <tr>"; 
/* Get field information for all columns */ 
while ($finfo = $result->fetch_field()) { 
    echo " 
     <th>" . $finfo->name . "</th>"; 
} 
echo " 
     </tr> 
    </thead> 
    <tbody>"; 
while ($row = $result->fetch_assoc()) { 
    echo "<tr class='info'> 
    <td>" . $row['id'] . "</td> 
       <td>" . $row['name'] . "</td> 
       <td>" . $row['mail'] . "</td> 
       <td>" . $row['number'] . "</td> 
       <td>" . $row['price'] . "</td> 
       <td>" . $row['paymenttype'] . "</td> 

       <td>" . $row['faktura'] . "</td> 
       <td>" . $row['date'] . "</td> 
    </tr>"; 
} 
echo " 
    </tbody> 

</table>"; 

?> 
     </div> 
     <div class="modal-footer"> 
      <button type="button" class="btn btn-default" data-dismiss="modal">Close</button> 
     </div> 
     </div> 

    </div> 
    </div> 

--------- и с этим кодом, я собираю стол работа ----

<?php 

include("../includes/connection.php"); 

if ($link->connect_errno > 0) { 
    die('Unable to connect to database [' . $link->connect_error . ']'); 
} 

if (isset($_POST['update'])) { 
    $results = $link->query("UPDATE job SET status='$_POST[status]', priority='$_POST[priority]' WHERE id='$_POST[hidden]'"); 
    $results = $link->query("UPDATE customer SET status='$_POST[status]' WHERE id='$_POST[hidden]'"); 
} 

$sql = "SELECT * from job"; 
if (!$result = $link->query($sql)) { 
    die('There was an error running the query [' . $link->error . ']'); 
} 
echo " 
<table class='table'> 
    <thead> 
     <tr>"; 
/* Get field information for all columns */ 
while ($finfo = $result->fetch_field()) { 
    echo " 
     <th>" . $finfo->name . "</th>"; 
} 
echo " 
     </tr> 
    </thead> 
    <tbody>"; 


while ($row = $result->fetch_assoc()) { 

     $job_id = $row['id']; 
    echo "<form action='' method=post>"; 

    echo "<tr class='info'> 

       <input type=hidden name=hidden value=" . $row['id'] . "> 
       <td>" . $row['id'] . "</td> 
       <td>" . $row['device'] . "</td> 
        <td>" . $row['model'] . "</td> 
       <td>" . $row['problem'] . "</td> 
       <td> 
      <select class='form-control col-sm-10' id='status' name='status'> 
       <option value='new' ". ($row['status'] == 'new'? 'selected ': '') .">New</option> 
     <option value='progress' ". ($row['status'] == 'progress'? 'selected ': '') .">Progress</option> 
      <option value='wait' ". ($row['status'] == 'wait'? 'selected ': '') .">Wait</option> 
      <option value='done' ". ($row['status'] == 'done'? 'selected ': '') .">Done</option> 
      <option value='close' ". ($row['status'] == 'close'? 'selected ': '') .">Close</option> 
    </select> 
      </td>   

       <td><select class='form-control col-sm-10' id='priority' name='priority'>     
          <option style='background-color:green;'value='low' ". ($row['priority'] == 'Low'? 'selected ': '') .">Low</option> 
           <option style='background-color:yellow; value='Medium' ". ($row['priority'] == 'Medium'? 'selected ': '') .">Medium</option> 
        <option style='background-color:red; value='High' ". ($row['priority'] == 'High'? 'selected ': '') .">High</option> 


         </select></td> 

       <td> <button type='submit' class='btn btn-primary btn-sm' name='update'>Update</button></td> 

       <td> <a class='btn btn-primary btn-sm' data-toggle='modal' data-target='#myModal' name='job_id' value='[$job_id]' > Info</a></td> 


      </tr>"; 
    echo "</form>"; 
} 
echo " 
    </tbody> 

</table>"; 

?> 
+0

Мы должны увидеть таблицы. Также вы вставляете в правильном порядке? Если вы попытаетесь вставить в таблицу fk перед pk, тогда возникнут проблемы. Вы используете innoDB? – bassxzero

+0

ubuntu ?? или окна? –

+0

@bassxzero Я обновил свой вопрос – gigi

ответ

1

Там, кажется, много плохого в этом сценарии.

Поскольку ваша строка Customer вставлена ​​первой, и вы не указали job_id, я думаю, что она пытается использовать 0, которая не сдерживает ограничение внешнего ключа.

Я не могу сказать из ваших таблиц, что сущность должна быть добавлена ​​первой, или если она зависит от другой. Поэтому я дам вам решение, которое должно работать для обоих. Я скажу, что, хотя это решение работает, оно позволяет игнорировать ограничение FK, и если вы планируете игнорировать его, вам лучше не устанавливать его в первую очередь.

Сначала измените поле job_id на таблице Customer, чтобы разрешить NULL значения.

Второе изменение этой линии

$sql = "INSERT INTO customer (name, mail, number, device, price, paymenttype,status,date) VALUES ('$name', '$email', '$number', '$device', '$price', '$payment','$status',NOW())"; 

этой линии

$sql = "INSERT INTO customer (name, mail, number, device, price, paymenttype,status,date,job_id) VALUES ('$name', '$email', '$number', '$device', '$price', '$payment','$status',NOW(),NULL)"; 

Похоже, что оба ваших переадресаций заголовка может быть достигнуто во время выполнения.

  1. Вы должны всегда вызывать exit() после редиректа заголовка или сценарий будет продолжать процесс.Why I have to call 'exit' after redirection through header('Location..') in PHP?

  2. Если вы повторяете сообщение об ошибке и не буферизуете свой вывод, то ваша переадресация не будет выполнена, поскольку вы уже отправили вывод, который отправляет заголовки. How to fix "Headers already sent" error in PHP

Edit after problem clarification

<?php 

    //connection includes and escaping POST data goes here. 

    // insert job first so we can use the pk as an fk for the customer table 
    $sql = "INSERT INTO job (device, model, problem, status) VALUES ('$device', '$model', '$problem', '$status')"; 

    $result = mysqli_query($link, $sql); 

    // if query fails stop script and echo error 
    if($result === false) 
    { 
     echo "ERROR: Could not able to execute $sql. " . mysqli_error($link); 
     exit; 
    } 

    // this only works for auto-incremented fields 
    $jobPrimaryKey = mysqli_insert_id($link); 

    $sql = "INSERT INTO customer (name, mail, number, device, price, paymenttype,status,date,job_id) VALUES ('$name', '$email', '$number', '$device', '$price', '$payment','$status',NOW(),'{$jobPrimaryKey}')"; 

    $result = mysqli_query($link, $sql); 

    // if query fails stop script and echo error 
    if($result === false) 
    { 
     echo "ERROR: Could not able to execute $sql. " . mysqli_error($link); 
     exit; 
    } 

    // if we get here then both queries were successful 

    header("location:some_page.php?message=A job and customer has been added to the database"); 
    // exit now to stop the script from continuing 
    exit; 

    echo "You'll never see this"; 
?> 
+0

Это решение работает. Я могу вставить в обе таблицы, и я могу добиться того, что хотел с этим запросом, когда я нажимаю кнопку «INFO»: '$ sql =" SELECT * от клиента WHERE id = $ job_id ";' Есть только одна точка, которую я не понимаю , Теперь все значение «JOB_ID» в таблице «CUSTOMER» имеет значение NULL. Не должны ли они отображать один и тот же идентификатор таблицы JOB? – gigi

+0

И вот как я обращаюсь с кнопкой: ' Info' – gigi

+0

@gigi см. Мои правки. – bassxzero

Смежные вопросы