【问题标题】:How to store the auto increment value into a php variable?如何将自动增量值存储到 php 变量中?
【发布时间】:2016-06-26 09:27:28
【问题描述】:

我在下面写了我的 sql,它可以工作。由于我已将 details_id 设置为自动增量,因此我必须使用 Last_Insert_ID() 以便数据库使用自动增量来使用下一个 id。但是,我想将该值存储到 php 变量中。那可能吗?

 $addquery = "INSERT INTO Particulars (Particulars_ID, Name, Identification_Number, Number, Nationality, Status, Remarks)
                    VALUES(LAST_INSERT_ID(),'$_POST[newname]', '$_POST[newic]','$_POST[newnumber]','$_POST[newnationality]','$_POST[newstatus]','$_POST[newremarks]')";

【问题讨论】:

  • 你用什么mysql库?
  • 小心在查询中直接使用 $_POST 变量。这会使您的网站容易受到 SQL 注入的攻击。
  • 首先 db 本身也关心自动递增的列 $last_id = ladt_insert_id(); 你可以这样做,但它只能在程序执行之前使用。所以你的意思是store the auto increment value into a php variable?
  • @Anant 是的,就像您的代码所建议的那样,我想将 id 设置为 a 变量。我想设置一个变量的原因是因为我有另一种形式,用户必须在其中插入他们的专业知识,并且我创建了一个数据库表 details_expertise,它在其中存储 details_id 和专业知识作为主键(复合键)。因此,如果我可以存储 details_id,然后我可以使用 id 将它们设置在复合材料中以用于下一个表单。
  • @u_mulder 嗯,我不确定你所说的 mysql lib 是什么意思。对不起这里的新手哈哈,但我正在使用 mysqli

标签: php sql auto-increment


【解决方案1】:

当您在具有AUTO_INCREMENT 字段的表中插入一行时,该字段将自动递增,顾名思义。您不需要告诉 MySQL 增加它,您也不需要为自动增加字段提供值根本

首先,从您的查询中删除对LAST_INSERT_ID() 的调用:

$addquery = "INSERT INTO Particulars (Name, Identification_Number, Number, Nationality, Status, Remarks)
                '$_POST[newname]', '$_POST[newic]','$_POST[newnumber]','$_POST[newnationality]','$_POST[newstatus]','$_POST[newremarks]')";

注意我是如何从查询中完全删除 Particulars_ID 的。

其次,这与您的问题没有直接关系,但您的查询容易受到 SQL 注入的攻击。接受用户输入时,您应该避免将其连接到您的查询,而是使用准备好的语句并像这样修改您的查询:

$addquery = "INSERT INTO Particulars (Name, Identification_Number, Number, Nationality, Status, Remarks)
VALUES(?,?,?,?,?,?)";

然后您可以准备一个语句并绑定来自$_POST 的值。这基本上净化了用户输入。阅读更多关于准备好的语句here

开始编辑

使用PDO 将实际值绑定到? 占位符的示例:

//First prepare the statemt
$db->prepare("INSERT INTO Particulars (Name, Identification_Number, Number,Nationality, Status, Remarks)
              VALUES(?,?,?,?,?,?)";
//Start binding values to placeholders
$db->bindValue(1, $_POST['name']);
$db->bindValue(2, $_POST['Identification_Number'];
$db->bindValue(3, $_POST['Number'];
//Bind the rest of the values in the same way

编辑结束

关于最后插入的行的 id,您需要运行单独的查询来获取它。因此,在运行上述查询后,如果插入成功,您可以 运行这样的查询:

SELECT LAST_INSERT_ID() AS id FROM Pariculars

【讨论】:

  • 哦,嗨,我对此很陌生。只是为了确认一下,如果一个人在文本框 1=1 中键入,sql 注入是否仍然允许用户进入?并且如果我将其更改为 values(?,?,?,?,?,?)"; 那么我在哪里将我的 $_POST 设置为这些值?感谢负载!:)
  • @Samuel 是的,这就是 SQL 注入。在准备好语句后,您可以使用绑定方法将实际值绑定到占位符。有多种方法可以做到这一点。我编辑了我的答案以包含一个示例,但这不是唯一的方法。检查mysqliprepared statements 和PDOprepared statements 以找到最适合您的语句
猜你喜欢
  • 2016-05-26
  • 2013-08-06
  • 1970-01-01
  • 2018-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-22
  • 1970-01-01
相关资源
最近更新 更多