2013-11-13 2 views
-1

Это мои таблицы:Невозможно вставить значения в атрибут внешнего ключа в PHP

create table sender(
    sno varchar(6) not null, 
    sfname varchar(15) not null, 
    slname varchar(10) not null, 
    sphone varchar(10), 
    saddress varchar(40) not null, 

    constraint pk_sender primary key(sno) 
); 


create table courier(
    cno varchar(6), 
    cost double precision not null, 
    weight double precision not null, 
    del_stat varchar(20) not null, 
    no_cour int(10), 
    sno varchar(6), 

    constraint fk_courier foreign key(sno) 
    references sender(sno),constraint pk_courier primary key(cno) 
); 

И это мой PHP код:

<?php 
session_start(); 
$_SESSION['x']=$_POST[sno]; 
$con=mysqli_connect("localhost","root","project123","project"); 
// Check connection 
if (mysqli_connect_errno()) 
    { 
    echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
    } 
$sql1="insert into sender(sno,sfname,slname,sphone,saddress) values (concat('SN','$_POST[sno]'),'$_POST[sf]','$_POST[sl]','$_POST[sph]','$_POST[sad]')"; 
$sql2="insert into courier(cno,cost,weight,del_stat,no_cour) values (concat('CN','$_POST[cno]'),'$_POST[cst]','$_POST[wght]','$_POST[del]','$_POST[num]')"; 

if(!mysqli_query($con,$sql1) && !mysqli_query($con,$sql2)) 
{ 
    die('Error: ' . mysqli_error($con)); 
} 




mysqli_close($con); 
?> 

Но я получаю ошибку Ошибки: Не удается добавить или обновить дочернюю строку: ограничение внешнего ключа не удается

( project courier, скованность fk_courier FOREIGN KEY ( sno) Лит sender ( sno).)

Так что, пожалуйста, скажите мне, как вставлять значения в внешний ключ.

+0

http://stackoverflow.com/questions/8728598/cant-insert-foreign-key-value-into-linking-table?rq=1 Возможно, вы можете найти решение здесь –

ответ

0

Похоже, что вы не устанавливаете значение внешнего ключа в своей дочерней табличной вставке. В вашей таблице courier есть столбец sno VARCHAR(6), который ссылается на sender.sno VARCHAR(6)? Поэтому вы должны обеспечить его ценность. Чтобы связать два поля как внешний ключ, вы должны установить допустимое значение для дочернего столбца, существующего в родительском столбце.

Во всяком случае, вы должны запустить эти два запрос, как это:

$sno = "SN$_POST[sno]"; 
$cno = "CN$_POST[cno]"; 

$sql1="insert into sender(sno,sfname,slname,sphone,saddress) values ('$sno','$_POST[sf]','$_POST[sl]','$_POST[sph]','$_POST[sad]')"; 

if(mysqli_query($con,$sql1)) 
{ 
    $sql2="insert into courier(cno,cost,weight,del_stat,no_cour, sno) values ('$cno','$_POST[cst]','$_POST[wght]','$_POST[del]','$_POST[num]', '$sno')"; 

    if (mysqli_query($con,$sql2)) 
    { 
     // Success 
    } 
    else 
    { 
     die('Error on query 2: ' . mysqli_error($con)); 
    } 
} 
else 
{ 
    die('Error on query 1: ' . mysqli_error($con)); 
} 

Вы можете увидеть here как получить последний вставленный идентификатор из auto_increment поля. Если вы не используете поле auto_increment, вы должны выбрать его другим способом, который соответствует вашим потребностям.

Надеюсь, это поможет.

UPDATE: У меня есть изменить эти переменные sno и cno, потому что вы можете избежать конкатенации его в запросе. Вы можете так поступить. Я понимаю, что у вас уже есть значение sno, поэтому вам не нужно запрашивать его снова. Этот код теперь может работать.

+0

, но его ошибка: Предупреждение: extract() ожидает, что параметр 1 будет массивом, boolean задан в C: \ xamp1 \ htdocs \ DB-UX \ new1.php в строке 15 Предупреждение: mysql_fetch_assoc() ожидает, что параметр 1 будет ресурсом, null указан в C: \ xamp1 \ htdocs \ DB-UX \ new1.php в строке 15 Ошибка при запросе 2: У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с «)» в строке 1 – user2987938

+0

. Пожалуйста, решите эту ошибку. – user2987938

+0

@ user2987938 Я обновил свой код. – DontVoteMeDown

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