我已经使用mySQL单独找到了一些答案,但是我希望有人可以告诉我在使用PHP处理插入/更新时获取mysql DB的最后一行或更新行的ID的方法.
目前我有这样的东西,其中column3是一个唯一的键,并且还有一个id列,它是一个自动增量的主键:
$query ="INSERT INTO TABLE (column1, column2, column3) VALUES (value1, value2, value3) ON DUPLICATE KEY UPDATE SET column1=value1, column2=value2, column3=value3";
mysql_query($query);
$my_id = mysql_insert_id();
Run Code Online (Sandbox Code Playgroud)
INSERT上的$ my_id是正确的,但是当它更新一行时(ON DUPLICATE KEY UPDATE)不正确.
我看过几篇帖子,人们建议你使用类似的东西
INSERT INTO table (a) VALUES (0) ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id)
Run Code Online (Sandbox Code Playgroud)
在调用ON DUPLICATE KEY时获取有效的ID值 - 但这会将该有效ID返回给PHP mysql_insert_id()函数吗?
背景:我正在开发一个系统,开发人员似乎正在使用一个执行MYSQL查询的函数,就像"SELECT MAX(id) AS id FROM TABLE"他们需要获取LAST插入行的id(具有auto_increment列的表)一样.
我知道这是一种可怕的做法(因为并发请求会使记录混乱),而我正在尝试将其传达给非技术/管理团队,他们的回应是......
Run Code Online (Sandbox Code Playgroud)"Oh okay, we'll only face this problem when we have (a) a lot of users, or (b) it'll only happen when two people try doing something at _exactly_ the same time"
我不同意这两点,并认为我们会比计划更早地遇到这个问题.但是,我正在尝试计算(或计算一种机制)来计算在我们开始看到混乱链接之前应该使用系统的用户数量.
对此的任何数学见解?再说一次,我知道这是一个可怕的做法,我只是想了解这种情况下的变量......
更新:感谢评论人员 - 我们正朝着正确的方向前进并修复代码!
当我运行以下代码时,我收到错误说
致命错误:未捕获的异常'mysqli_sql_exception',消息'查询/预准备语句中没有使用索引'
$mysql = new mysqli(DB_SERVER, DB_USER, DB_PASSWORD, DB_NAME) or die('There was a problem connecting to the database');
if (mysqli_connect_errno()) {
printf("DB error: %s", mysqli_connect_error());
exit();
}
$get_emp_list = $mysql->prepare("SELECT id, name FROM calc");
if(!$get_emp_list){
echo "prepare failed\n";
echo "error: ", $mysql->error, "\n";
return;
}
$get_emp_list->execute();
$get_emp_list->bind_result($id, $emp_list);
Run Code Online (Sandbox Code Playgroud)
这是有能力的架构 -
--
-- Table structure for table `calc`
--
CREATE TABLE IF NOT EXISTS `calc` (
`id` int(12) NOT NULL,
`yr` year(4) NOT NULL,
`mnth` varchar(12) NOT NULL,
`name` varchar(256) NOT …Run Code Online (Sandbox Code Playgroud) 我知道有很多相同标题的主题.但主要是它被插入错误的地方的查询.但我认为我做对了.所以问题是,即使数据插入数据库,我仍然会得到0.有人知道答案我错了吗?
这是我的代码:
mysql_query('SET NAMES utf8');
$this->arr_kolommen = $arr_kolommen;
$this->arr_waardes = $arr_waardes;
$this->tabel = $tabel;
$aantal = count($this->arr_kolommen);
//$sql="INSERT INTO `tbl_photo_lijst_zoekcriteria` ( `PLZ_FOTO` , `PLZ_ZOEKCRITERIA`,`PLZ_CATEGORIE`)VALUES ('$foto', '$zoekje','$afdeling');";
$insert = "INSERT INTO ".$this->tabel." ";
$kolommen = "(";
$waardes = " VALUES(";
for($i=0;$i<$aantal;$i++)
{
$kolommen .=$this->arr_kolommen[$i].",";
$waardes .="'".$this->arr_waardes[$i]."',";
}
$kolommen = substr($kolommen,0,-1).")";
$waardes = substr($waardes,0,-1).")";
$insert .=$kolommen.$waardes;
$result = mysql_query($insert,$this->db) or die ($this->sendErrorToMail(str_replace(" ","",str_replace("\r\n","\n",$insert))."\n\n".str_replace(" ","",str_replace("\r\n","\n",mysql_error()))));
$waarde = mysql_insert_id();
Run Code Online (Sandbox Code Playgroud)
非常感谢,因为我几乎已经整整一天为这个问题而烦恼.(可能它是小而愚蠢的东西)
我有这张桌子
CREATE TABLE IF NOT EXISTS `t5` (
`id` int(11) NOT NULL auto_increment,
`a` int(11) NOT NULL,
`b` int(11) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `a` (`a`,`b`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
Run Code Online (Sandbox Code Playgroud)
a_b是唯一的密钥.
我有这样的PHP代码
$db = DBFactory::getInstance();
$db->selectDB('test');
$db->query("insert into t5 (a, b) values(1, 1) on duplicate key update a=1, b=1");
var_dump(mysql_insert_id());
$cur = $db->query("select last_insert_id()");
var_dump(mysql_fetch_assoc($cur));
Run Code Online (Sandbox Code Playgroud)
通过运行此代码两次,在我的电脑上结果是第1
int(1)
array(1) {
["last_insert_id()"]=>
string(1) "1"
}
Run Code Online (Sandbox Code Playgroud)
第2
int(1)
array(1) {
["last_insert_id()"]=>
string(1) "2"
}
Run Code Online (Sandbox Code Playgroud)
你可以看到,两次mysql_insert_id()返回相同的值"1",这对我来说没问题,因为我想知道插入后的真实id,而不是下一个auto_increment值.
但是,当我在另一个环境中运行此代码两次时:第1次
int(1)
array(1) {
["last_insert_id()"]=> …Run Code Online (Sandbox Code Playgroud) 我总是听说使用"lastInsertId"(或者如果你不使用PDO,则使用mysql_insert_id())是邪恶的.在触发器的情况下,它显然是,因为它可以返回一些完全不是INSERT创建的最后一个ID.
$DB->exec("INSERT INTO example (column1) VALUES ('test')");
// Usually returns your newly created ID.
// However when a TRIGGER inserts into another table with auto-increment:
// -> Returns newly created ID of trigger's INSERT
$id = $DB->lastInsertId();
Run Code Online (Sandbox Code Playgroud)
有什么选择?
伙计们,由于某些原因,这段代码在插入到我的数据库时出现了重复的记录
$qry = "INSERT IGNORE INTO reports (". implode(", ",array_keys($reports)) .") VALUES (". implode(", ",array_values($reports)) .");";
if(!mysql_query(trim($qry), $link)) { die('Error: ' . mysql_error()); }
Run Code Online (Sandbox Code Playgroud)
实际声明是这样的
INSERT IGNORE INTO reports (`inspection_number`, `report_date`, `customer`) VALUES ('996', '10-21-2012', 'Jd Daniel');
Run Code Online (Sandbox Code Playgroud)
DB 现在看起来像
19 NULL NULL NULL 996 NULL 0000-00-00 NULL Jd Daniel NULL NULL NULL NULL
20 NULL NULL NULL 996 NULL 0000-00-00 NULL Jd Daniel NULL NULL NULL NULL
21 NULL NULL NULL 996 NULL 0000-00-00 NULL Jd Daniel NULL NULL NULL …Run Code Online (Sandbox Code Playgroud) 我想知道在mysql查询后获取最后一个插入ID的最佳解决方案是什么?
我找到了以下解决方案:
<?php
function get_current_insert_id($table)
{
$q = "SELECT LAST_INSERT_ID() FROM $table";
return mysql_num_rows(mysql_query($q)) + 1;
}
?>
Run Code Online (Sandbox Code Playgroud)
甚至使用mysql_insert_idPHP函数,但显然这个函数不能很好地与bigint(这就是我用于ID字段)和如果有很多连续的SQL查询它可能是不可靠的.
有人能提供可靠而快速的解决方案来完成这项任务吗?
有多可靠mysql_insert_id()在竞争条件下我的意思是,当多个用户同时插入数据时,这个函数会返回真实的ID还是会返回其他用户插入的数据ID?
表引擎是MyISAM。
我发誓我已倾倒并倾倒在本网站和其他人的所有其他类似问题......但我想我只是遗漏了一些东西.希望有人可以指出一个愚蠢的错误,我的大脑正在躲避我.:)
我的脚本将表单中的值插入名为"notes"的表中
此时,它通过名为newRelationship的函数在名为"relationships"的表中创建两个条目.
变量"$ note_id"的值通过我的mysql_insert_id()填充; 并传入上述功能.
执行代码时,条目成功添加到"notes","id"列使用auto_increment赋予适当的值.
接下来,将两个条目添加到"关系"表中(正如它们所应).
但是,我的mysql_insert_id()不断推出值为"0"而不是新的行id.
对于我的生活,我无法弄清楚我做错了什么.我甚至尝试从头开始创建一个具有相同结果的新表.踢球者是我在项目的其他文件中使用几乎完全相同的代码而没有任何问题.有谁看到我做错了什么?
有问题的代码
if ($user->is_loaded())
{
if($_POST['project_id']) {
$project_id = $_post['project_id'];
$long_note = $_POST['long_note'];
$created_by = $_POST['created_by'];
$note_sql="INSERT INTO notes (`long_note`, `added`, `created_by`) VALUES ('$long_note', '$timenow', '$created_by')";
if (!mysql_query($note_sql,$con))
{
die('Error: ' . mysql_error($note_sql));
}
else {
echo "note created Creating relationship ";
$note_id = mysql_insert_id();
echo $note_id;
newRelationship($project_id, "project", $note_id, "note");
newRelationship($client_id, "client", $note_id, "note");
echo "note added successfuly";
}
Run Code Online (Sandbox Code Playgroud)
而我的功能
function newRelationship($parent_id, $parent_type, $child_id, $child_type)
{
global $sql, $con, $timenow; …Run Code Online (Sandbox Code Playgroud) mysql ×10
mysql-insert-id ×10
php ×8
concurrency ×2
lastinsertid ×1
mysqli ×1
return ×1
sql ×1