首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >插入到同时共享相同id的两个表中

插入到同时共享相同id的两个表中
EN

Stack Overflow用户
提问于 2017-10-13 16:33:13
回答 2查看 1.2K关注 0票数 0

我这里有点小问题。我写的下面的代码是要同时插入到两个表中,但它不起作用。但是如果我移除第二个插件,第一个插件就可以工作了,我不知道出了什么问题。这意味着在第一个表中插入,并将第一个表的最后一个插入Id收集到第二个表中。我做错了什么?

代码语言:javascript
复制
<?php
  $english_name = $_POST['EnglishName'];
  $tel_number = $_POST['TelNumber'];
  $email_address = $_POST['EmailAddress'];
  $gender = $_POST['Gender'];
  $age = $_POST['Age'];
  $region = $_POST['Region'];

  mysql_connect("localhost", "root", "") or die ('Error: ' . mysql_error());
  mysql_select_db("fruitmarket");

  $query="INSERT INTO data (english_name, tel_number, email_address, gender,         age, region) VALUES (";
  $query.="'".$english_name."', ";
  $query.="'".$tel_number."', ";
  $query.="'".$email_address."', ";
  $query.="'".$gender."', ";
  $query.="'".$age."', ";
  $query.="'".$region."')";

  $query .= "INSERT INTO data_category (id, english_name)
VALUES (LAST_INSERT_ID(), '$english_name');";


  mysql_query($query) or die ('Error updating database');

  echo "Record is inserted."; 
?>
EN

回答 2

Stack Overflow用户

发布于 2017-10-13 16:50:46

快到2018年了,所以请停止使用折旧和删除的mysql_*函数,使用PDO/mysqli和预准备语句。

我已经用准备好的语句重写了你的代码,请点击以下链接:

Why shouldn't I use mysql_* functions in PHP?

How can I prevent SQL injection in PHP?

Prepared statements

代码语言:javascript
复制
<?php
$servername = "localhost";
$username   = "username";
$password   = "";
$dbname     = "fruitmarket";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

$stmt = "INSERT INTO data (english_name,tel_number,email_address,gender,age,region) VALUES(?,?,?,?,?,?)";

$sql = $conn->prepare($stmt);
$sql->bind_param("ssssis", $english_name, $tel_number, $email_address, $gender, $age, $region);

if ($sql->execute()) {

    $id = $sql->insert_id;

    $insert = $conn->prepare("INSERT INTO data_category (id, english_name) VALUES(?,?)");
    $insert->bind_param("is", $id, $english_name);

    if ($insert->execute()) {

        echo "data inserted successfully";
    } else {

        printf("Errormessage: %s\n", $mysqli->error);
    }
} else {

    printf("Errormessage: %s\n", $mysqli->error);
}

预准备语句是一种用于高效率重复执行相同(或类似) SQL语句的功能。

准备好的语句基本上是这样工作的:

SQL :创建语句模板并将其发送到数据库。某些值未指定,称为参数(标记为"?")。示例: INSERT INTO SQL值( ?,?,?)

  • 数据库在myTabvle语句模板上解析、编译和执行查询优化,并在不执行的情况下存储结果
  • Execute:稍后,应用程序将这些值绑定到参数,数据库将执行该语句。与直接执行SQL语句相比,准备好的语句有三个主要的advantages:
  • Prepared语句,这减少了解析时间,因为查询的准备只做了一次(尽管语句被多次执行)
  • 绑定参数最小化了到服务器的带宽,因为您每次只需要发送参数,而不是整个SQL语句对SQL注入非常有用,因为以后使用不同的协议传输的参数值不需要正确转义。如果原始语句模板不是从外部输入派生的,则不能发生SQL注入。
票数 1
EN

Stack Overflow用户

发布于 2017-10-14 00:31:54

我测试了上面的代码,注意到您只需要添加和更改一些代码,请参阅下面的示例

代码语言:javascript
复制
<?php
  $english_name = $_POST['EnglishName'];
  $tel_number = $_POST['TelNumber'];
  $email_address = $_POST['EmailAddress'];
  $gender = $_POST['Gender'];
  $age = $_POST['Age'];
  $region = $_POST['Region'];

  mysql_connect("localhost", "root", "") or die ('Error: ' . mysql_error());
  mysql_select_db("fruitmarket");

  $query="INSERT INTO data (english_name, tel_number, email_address, gender, age, region) VALUES (";
  $query.="'".$english_name."', ";
  $query.="'".$tel_number."', ";
  $query.="'".$email_address."', ";
  $query.="'".$gender."', ";
  $query.="'".$age."', ";
  $query.="'".$region."')";

  mysql_query($query) or die ('Error updating database');

  echo "Record is inserted."; 

  $query= "INSERT INTO data_category (id, english_name)
VALUES (LAST_INSERT_ID(), '$english_name');";

mysql_query($query) or die ('Error updating database');

  echo "Record is inserted.";
?>

测试它以检查它是否可以工作

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46725736

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档