背景信息:我处理管理文件的应用程序(专业人员,而非个人)。 UI是基于Web的,低级文件管理功能是基于Java的。
每个文件和目录都被称为“节点”'在这个应用程序中,并在表中有一行存储其inode,名称,父ID等...
问题:当我们执行添加节点或重命名等操作时,会调用java函数来更新与真实文件系统相关的数据库。
我只有在复制节点时才会遇到问题(当我们添加,重命名,删除......一个节点时,即使调用相同的java函数,所有内容都能完美运行)==>复制文件,然后调用java函数(在这种情况下,它执行新文件信息的SQL插入),最后我在PHP中执行select以获取复制文件的节点ID。
在插入之后,我可以看到PhpMyAdmin中的行,但PHP中的select不会返回它。
我尝试了什么:这不是时间安排(我已经让20秒的睡眠进行测试并有时间在PMA中查看行)并且CodeIgniter中禁用了所有缓存(我已经在CodeIgniter代码中放置了各种转储来确认)。我也试过CodeIgniter的PDO驱动程序,结果完全一样。而且我试图删除where子句中的一些条件(以及where子句也是如此),同样的结果也是如此。
唯一有效的方法是打开与DB的新连接并重做查询,如下面的代码所示:
public function getIdForNode($name, $parentId) {
$id = 0;
$name = self::cleanName($name);
$parentId = intval($parentId);
if (empty($name)) {
Log::error("\$name can't be empty.");
} else if ($parentId < 0) {
Log::error("\$parentId can't be < 0.");
} else {
$db = AppDatabase::getInstance();
$sql = "SELECT node_ID
FROM nodes
WHERE inode_id > 0
AND parentNode_ID = ?
AND record_label = BINARY ?
AND record_deleted IS NULL";
$result = $db->query($sql, [$parentId, $name])->row_array();
///////////////////////////////////////////////////////////////////
if (empty($result)) {
$db2 = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
$result2 = $db2->query("
SELECT node_ID
FROM nodes
WHERE inode_id > 0
AND parentNode_ID = ".$parentId."
AND record_label = BINARY '".$db2->escape_string($name)."'
AND record_deleted IS NULL
");
$result = $result2->fetch_assoc();
$result2->free();
$db2->close();
}
///////////////////////////////////////////////////////////////////
$id = (!empty($result) && !empty($result['node_ID'])) ? intval($result['node_ID']) : 0;
}
return $id;
}
MySQL 5.5
PHP 5.5
CodeIgniter 3
如果您需要任何其他信息,请与我们联系。
答案 0 :(得分:0)
1)Mysqli有一个用于获取最后一个插入ID的方法。这样您就可以简单地使用该值而无需选择。
http://php.net/manual/en/mysqli.insert-id.php
2)打开mysql调试并观察它运行一次。您可以找到解决方案。
3)我根本没有看到INSERT,因此插入后的SELECT语句不是我可以解决的问题(因为它只发生在某种类型的插入上)。
最后,您需要了解为什么此SELECT与另一个SELECT之间存在差异,并且您已将其与之前的INSERT语句相关联。但是,与其他插入相比,您没有提供INSERT语句,也没有显示此选择与该插入相关的区别。
因此,您需要启用mysql调试并在运行时获取每个语句,以查看是否可以在java / php代码之外复制问题。也许你只是有一个追逐的情况,java代码乱序执行(用AJAX发生很多)或者在select执行之前没有技术上完成插入。到过那里。 ;)