【问题标题】:Getting row data of inserted row (Mysql, PHP, mysqli)获取插入行的行数据(Mysql、PHP、mysqli)
【发布时间】:2009-12-18 17:01:21
【问题描述】:

我需要在插入时取回一行的 postid(自动递增 PK)。

我目前正在使用它来获取它

//get postid to return
if($result = $db -> query('SELECT postid FROM posts WHERE title = \''.$title.'\' LIMIT 1')){
        $row = $result->fetch_assoc();
        $json['postid']  = $row['postid'];
        $result->free();

其中 $title 是新插入帖子的标题名称。

mysqli 类中是否有一部分允许我在一个查询中执行此操作? $db -> query() 是否返回任何可以使这更简单和更安全的信息?

我尝试过浏览 mysqli 文档,但找不到我想要的。我确定它就在某个地方。

多个标题会搞砸,虽然不允许,但你不能太安全

【问题讨论】:

  • 您确实意识到您的查询容易受到 SQL 注入的攻击,因为您没有转义 $title,而且您认为 $title 有多安全并不重要,事实并非如此。
  • $title 被预先转义,因为它在此之前的 INSERT 查询中使用过

标签: php mysql mysqli


【解决方案1】:

您的表是否有 AUTO_INCREMENT 列?如果是这样,您可以使用mysql_insert_id()mysqli->insert_id 获取该值,然后使用它来选择行。 More info here.

【讨论】:

  • 或者你可以自己写一个查询获取id,然后放入插入的数据中。
  • Arthur:是的,但总是有可能另一个客户同时尝试做同样的事情,而你最终会发生冲突。
  • 乔丹:非常感谢,工作完美。我见过这种方法,但确实知道它是如何工作的。泰!
  • Jordan:如果查询是SELECT LAST_INSERT_ID(),那么它是安全的。该值在每个会话中存储/返回。
  • Jordan:我不使用 mysql,所以我不确定,但希望它不会那样工作。 postgresql 序列号(自动编号)确保每个编号无论如何都是唯一的。但我不知道 mysql :)
【解决方案2】:

【讨论】:

  • 能否请您提供一个 sn-p,我正在努力解决如何使用 mysqli->insert_id 来选择受影响的行。我得到了 mysqli->insert_id 的整数结果,但不知道如何使用它来选择受影响的行
  • 这是怎么回事? $last_id = $conn->insert_id; $sql_last_id = "SELECT * FROM table WHERE $conn->insert_id=$last_id LIMIT 1"; $result = $conn->query($sql_last_id); if ($result->num_rows > 0) { // 输出每一行的数据 while($row = $result->fetch_assoc()) { echo "field1: " . $行[“field1”]。 “ - 字段 2:” 。 $行[“field2”]。 “”。 $行[“field3”]。 $last_id 。 "
    "; } } else { 回声“错误:”。 $sql_last_id 。 “
    ”。 $conn->错误; } 这里只有错误是输出错误的行
猜你喜欢
  • 2010-10-28
  • 1970-01-01
  • 1970-01-01
  • 2013-08-24
  • 2017-12-02
  • 2011-05-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多