我试图在关系数据库中执行几个php插入查询,但我遇到了一些问题。为了使这种关系起作用,我需要从第一个查询中获取自动增量值,然后将其插入到第二个查询中,以便存在两者之间的关系。
我有这个:
$ query2 =“插入words
值('','$ name')”;
- 列为''的第一个值是自动递增的主键 -
$ query3 =“插入synonyms
个值('','',$ alias')”;
- 列出的第一个值是自动递增的pk,第二个值需要是来自第一个查询的fk或pk,但我不知道如何将它放在那里。 -
有办法做到这一点吗?任何帮助将不胜感激。
这里有一个帮助你们的SQL小提琴:
答案 0 :(得分: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)");
?>
答案 1 :(得分:1)
。 。您应该考虑在最新的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。
答案 2 :(得分:0)
不确定您是否使用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();