我正在构建一个.php来将数据插入到两个不同的表中。 我已经使用了mysqli_multi_query()函数和mysqli_insert_id(),但只有提交的数据才会出现在其中一个表中。我已经在这个障碍中坚持了几天,任何人都可以帮我找出我的代码有什么问题。
以下是2个表格:
表患者:patient_id(PK)(AI),姓名,年龄,电子邮件,手机......
表emergency_contact:id(PK)(AI),patient_id(FK),姓名,关系,移动
<?php
session_start();
?>
<?php
$pname=$_POST['pname'];
$pid=$_POST['pid'];
$hkid=$_POST['hkid'];
$dob=$_POST['dob'];
$age=$_POST['age'];
$gender=$_POST['gender'];
$mobile=$_POST['mobile'];
$email=$_POST['email'];
$address=$_POST['address'];
$ename=$_POST['ename'];
$relationship=$_POST['relationship'];
$emobile=$_POST['emobile'];
$con = new mysqli("localhost","root","2013700910","2013700910");
$last_id = $con->insert_id;
if ($con->connect_error) {
die("Connection failed: " . $con->connect_error);
}
echo "Connected successfully";
$sql="INSERT INTO patients (name, hkid, date_of_birth, age, gender, mobile, email, address)
VALUES('$pname', '$hkid' ,'$dob' ,'$age', '$gender', '$mobile', '$email', '$address');
INSERT INTO products (name, relationship, mobile, patient_id)
VALUES('$ename', '$relationship', '$emobile', '$last_id')";
if ($con->multi_query($sql) === TRUE) {
echo "New record created successfully";
} else {
echo "Error: " . $sql . "<br>" . $con->error;
}
$con->close();
?>
(PS *仅'$ pname','$ hkid','$ dob','$ age','$ gender','$ mobile','$ email','$ address'已成功插入数据库。)
答案 0 :(得分:0)
你有很多问题,但这是原因:
$last_id = $con->insert_id;
您无法生成插入ID BEFORE 已执行插入。 MySQL(和)PHP无法计时旅行。
你需要做更多的事情:
query("INSERT ... parent record stuff ...");
$id = last_insert_id();
query("INSERT .... child record stuff .... ($id)");
因此,当您进行父/子插入时,应避免使用multi_query()。您 COULD 只需一次通话即可完成此操作:
INSERT ... ; INSERT ... VALUES(last_insert_id(), ...)
但是由于insert_id()只返回最后执行的插入的ID,因此无法插入多个子记录。例如下一个查询将完全无效:
INSERT ... parent ...; INSERT child #1 (last_insert_id()); INSERT child #2 (last_insert_id());
#2孩子实际上会插入为#1孩子生成的ID, NOT 原始父记录。
如上所述,很难弄清楚链中的WHICH查询失败了。执行单个query()
调用,检查每个调用之后的错误,以及检索任何元数据(例如last_insert_id())要容易得多。
答案 1 :(得分:0)
我还没有启动代码,但我认为你必须分开查询。 你可以这样做:
$sql="INSERT INTO patients (name, hkid, date_of_birth, age, gender, mobile, email, address)
VALUES('$pname', '$hkid' ,'$dob' ,'$age', '$gender', '$mobile', '$email', '$address')";
if (!$con->query($sql)) {
echo "insert failed, error: ", $com->error;
} else {
$last_id = $con->insert_id;
$sql="INSERT INTO products (name, relationship, mobile, patient_id)
VALUES('$ename', '$relationship', '$emobile', '$last_id')";
$con->query($sql);
...
}
PS:对不起格式不好。
答案 2 :(得分:0)
谢谢大家的帮助。我现在应该解决注射问题。我找到了以下代码,我可以使用它来避免注入问题。
<pre>
$stmt = $dbh->prepare("INSERT INTO Customers (CustomerName,Address,City)
VALUES (:nam, :add, :cit)");
$stmt->bindParam(':nam', $txtNam);
$stmt->bindParam(':add', $txtAdd);
$stmt->bindParam(':cit', $txtCit);
$stmt->execute();
<code>
任何人都可以解释我应该如何修改我的代码?我应该使用$ stmt-&gt; bindParam(':pnam',$ txtpname);替换$ pname = $ _ POST ['pname'];
答案 3 :(得分:0)
如果您决定继续使用mysqli,就像在第一篇文章中那样,您需要使用mysqli_real_escape_string。这是php.net中函数的链接 这是一个例子:
$con = new mysqli("localhost","root","2013700910","2013700910");
$pname=$con->real_escape_string($_POST['pname']);
$pid=$con->real_escape_string($_POST['pid']);
$hkid=$con->real_escape_string($_POST['hkid']);
$dob=$con->real_escape_string($_POST['dob']);
$age=$con->real_escape_string($_POST['age']);
$gender=$con->real_escape_string($_POST['gender']);
$mobile=$con->real_escape_string($_POST['mobile']);
$email=$con->real_escape_string($_POST['email']);
$address=$con->real_escape_string($_POST['address']);
$ename=$con->real_escape_string($_POST['ename']);
$relationship=$con->real_escape_string($_POST['relationship']);
$emobile=$con->real_escape_string($_POST['emobile']);
.....
如果您决定使用PDO重写代码,就像在第二篇文章中一样,准备 - 执行是正确的方法,它会自动清理您的值。 Here对此进行了很好的讨论。