【问题标题】:How to grab an auto incremented variable and insert it into an insert query如何获取自动递增的变量并将其插入到插入查询中
【发布时间】:2013-04-13 13:01:08
【问题描述】:

我正在尝试在关系数据库中执行几个 php 插入查询,但我遇到了一些问题。为了使这种关系起作用,我需要从第一个查询中获取自动递增的值,然后将其插入到第二个查询中,这样两者之间的关系就存在了。

我有这个:

$query2 = "INSERT into words values ('' ,'$name') ";

-- 以''列出的第一个值是自增主键--

$query3 = "INSERT into synonyms values ('' , '', $alias') ";

-- 列出的第一个值是自动递增的 pk,第二个值需要是第一个查询中的 fk 或 pk,但我不知道如何将它放在那里。 --

有没有办法做到这一点?任何帮助将不胜感激。

这里有一个 SQL Fiddle 来帮助你们:

http://sqlfiddle.com/#!2/47d42

【问题讨论】:

  • 我假设您正在使用 mysql_* 函数来执行查询?
  • mysql_query($query2);另一个也一样
  • 我建议你改用 PDO 或 mysqli_*,因为 mysql_* 函数将在未来的版本中删除。
  • 感谢大家的帮助。问题已解决。

标签: php mysql sql phpmyadmin relational-database


【解决方案1】:
<?php
    $link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
    if (!$link) {
        die('Could not connect: ' . mysql_error());
    }

    mysql_select_db('mydb');

    mysql_query("INSERT INTO words(word) values ('word1')");

    $last_id = mysql_insert_id();

    mysql_query("INSERT INTO words(synonym_id,synonym) values ($last_id, "synonym1)");

?>

参考:http://php.net/manual/en/function.mysql-insert-id.php

【讨论】:

  • 我忘了补充 mysqli 和事务是首选,如果需要我可以举一个更高级的例子。
【解决方案2】:

不确定您是否使用 MySQL 原生函数。如果是这样,答案是使用 mysql_last_id()。这些函数已弃用,不推荐使用。

示例:

//escape your indata
$brand= mysql_real_escape_string($_POST['brand']);
$sql = "INSERT INTO cars(brand) VALUES('{$brand}')";
mysql_query($sql);

//find last id from query above
$id = mysql_last_id();

改用 PDO: PDO::lastInsertId

示例:

$brand= $_POST['brand'];
$sql = "INSERT INTO cars(brand) VALUES (:brand)";
$query = $conn->prepare($sql);
$query ->execute(array(':brand'=>$brand));
$id = $conn->lastInsertId();

http://www.php.net/manual/en/book.pdo.php

【讨论】:

    【解决方案3】:

    。 .您应该考虑在最新的 PHP 版本中使用 PDO 以获取其现代功能,例如准备好的语句,这样您就不必担心 SQL Injection 或损坏的转义函数。

    。 .如果后续查询对于记录有用是强制性的,那么使用事务也是可取的。使用事务可以让您的数据库清除任何失败的第二个或第三个查询的垃圾。

    。 .此外,如果在表名之后列出其他字段,则在运行插入查询时可以省略自动增量字段。我认为这是一种更常见的模式,例如INSERT INTO table (field1, field2) VALUES ("value1", "value2")。我在下面的例子中使用了它:

    $pdo = new PDO('mysql:host=localhost;dbname=database', 'user', 'pass');
    
    $pdo->beginTransaction();
    try {
      $prepared = $dbh->prepare('INSERT INTO words (fieldName) values (?)');
      $prepared->execute(array($name));
      $fID = $pdo->lastInsertId();
    
      $prepared = $dbo->prepare('INSERT INTO synonyms (fieldName) Values (?, ?)';
      $prepared->execute(array($fID, $alias));
    
      $dbo->commit(); 
    } catch(PDOExecption $e) {
      $dbo->rollback();
      print 'Error: '. $e->getMessage(); 
    }
    

    。 .请注意,这不适用于 MSSQL,因为它不支持“lastInsertId”。

    。 . Amplexos。

    【讨论】:

      猜你喜欢
      • 2016-11-22
      • 2016-04-17
      • 1970-01-01
      • 1970-01-01
      • 2013-04-25
      • 1970-01-01
      • 1970-01-01
      • 2014-08-03
      • 1970-01-01
      相关资源
      最近更新 更多