MYSQL。无法将数据插入到不同的表

时间:2015-11-09 15:41:23

标签: php mysql post mysqli

我正在构建一个.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'已成功插入数据库。)

4 个答案:

答案 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对此进行了很好的讨论。