使用PHP表单将外键数据插入表时出现问题

时间:2010-03-28 12:32:28

标签: php mysql

我是PHP和MySQL的新手,需要帮助...

我在数据库中有两个表(Staff和Position)。 Staff表(StaffId,Name,PositionID(fk))。 Position表填充了不同的位置(Manager,Supervisor等)。这两个表与Staff表中的PositionID外键相关联。我有一个人员登记表,文本字段要求相关属性和动态填充的下拉列表来选择位置。我需要将用户的条目与所选位置一起插入到staff表中。但是,在插入数据时,我收到以下错误(无法添加或更新子行:外键约束失败)。如何将用户选择的位置插入人员表? 这是我的一些代码...

...
echo "<tr>";
echo "<td>";
echo "*Position:"; 
echo "</td>";
echo "<td>";

//dynamically populate the staff position drop down list from the position table
$position="SELECT PositionId, PositionName
            FROM Position
            ORDER BY PositionId";
$exeposition = mysql_query ($position) or die (mysql_error());
echo "<select name=position value=''>Select Position</option>";
while($positionarray=mysql_fetch_array($exeposition))
{
echo "<option value=$positionarray[PositionId]>$positionarray[PositionName]</option>";
}
echo "</select>";   
echo "</td>";
echo "</tr>"

//the form is processed with the code below

$FirstName = $_POST['firstname'];
$LastName = $_POST['lastname'];
$Address = $_POST['address'];
$City = $_POST['city'];
$PostCode = $_POST['postcode'];
$Country = $_POST['country'];
$Email = $_POST['email'];
$Password = $_POST['password'];
$ConfirmPass = $_POST['confirmpass'];
$Mobile = $_POST['mobile'];
$NI = $_POST['nationalinsurance'];
$PositionId = $_POST[$positionarray['PositionId']];

//format the dob for the database
$dobpart = explode("/", $_POST['dob']);
$formatdob = $dobpart[2]."-".$dobpart[1]."-".$dobpart[0];
$DOB = date("Y-m-d", strtotime($formatdob));

$newReg = "INSERT INTO Staff (FirstName, LastName, Address, City, PostCode,     
Country, Email, Password, Mobile, DOB, NI, PositionId) VALUES ('".$FirstName."', 
'".$LastName."', '".$Address."', '".$City."', '".$PostCode."', '".$Country."',  
'".$Email."', '".$Password."', ".$Mobile.", '".$DOB."', '".$NI."', '".$PostionId."')";

您的时间和帮助一定会受到赞赏。

2 个答案:

答案 0 :(得分:1)

您似乎在INSERT中有拼写错误。变量$PostionId应为$PositionId

此外,请确保您了解代码容易受到SQL Injection的攻击。<​​/ p>

答案 1 :(得分:0)

在插入SQL查询中,您使用的是:

, '".$PostionId."')"

虽然之前几行,但你宣布:

$PositionId = $_POST[$positionarray['PositionId']];

插入查询中使用的变量与包含数据的变量不同:它缺少 i - 我认为这很糟糕。


如果这还不足以解决您的问题,在执行它之前回显您的SQL查询可能会帮助您找出问题所在。

这种关于外键的错误通常是由插入错误的id引起的 - 在引用的表中没有相应的行。


除此之外,您的代码容易受SQL injections攻击:您应该转义并过滤数据。

对于字符串值,您可以使用mysql_real_escape_string

$FirstName = mysql_real_escape_string($_POST['firstname']);

对于整数值,您可以确保在SQL查询中注入整数,例如使用intval

$data = intval($_POST['data']);

(不确定这里有整数值,所以我只以'data为例)