Php 插入后选择不会返回插入的行
背景信息:我的工作对象是应用程序专业人员,而不是管理文件的个人。UI基于web,底层文件管理功能基于Java 在这个应用程序中,每个文件和目录都被称为“节点”,并且在一个表中有一行存储其inode、名称、父id等 问题是:当我们执行诸如添加节点或重命名节点之类的操作时,会调用java函数来更新与实际文件系统相关的数据库 我有一个问题,只有当我们复制一个节点时,当我们添加,重命名,删除,所有的工作都很完美。。。一个节点,即使调用了与copy==>相同的java函数,也会复制文件,然后调用java函数。在本例中,它会对新文件infos执行SQL插入,最后我会在PHP中执行select以获取复制文件的节点id 在插入之后,我可以在PhpMyAdmin中看到行,但是PHP中的select没有返回它 我尝试过的:这不是我让20秒睡眠来测试的时间,而是让我有时间在PMA中查看行,并且在CodeIgniter中禁用所有缓存,我在CodeIgniter代码中放置了各种转储来确认。我还尝试了CodeIgniter的PDO驱动程序,结果完全相同。我试着一次又一次地删除where子句和where子句中的一些条件,同样的结果 唯一有效的方法是打开到DB的新连接,并按照下面的代码重新执行查询:Php 插入后选择不会返回插入的行,php,mysql,mysqli,codeigniter-3,Php,Mysql,Mysqli,Codeigniter 3,背景信息:我的工作对象是应用程序专业人员,而不是管理文件的个人。UI基于web,底层文件管理功能基于Java 在这个应用程序中,每个文件和目录都被称为“节点”,并且在一个表中有一行存储其inode、名称、父id等 问题是:当我们执行诸如添加节点或重命名节点之类的操作时,会调用java函数来更新与实际文件系统相关的数据库 我有一个问题,只有当我们复制一个节点时,当我们添加,重命名,删除,所有的工作都很完美。。。一个节点,即使调用了与copy==>相同的java函数,也会复制文件,然后调用java函
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
PHP5.5
编码点火器3
如果您需要任何其他信息,请告诉我。1 Mysqli有一个用于获取最后一个插入id的方法。这将允许您只需使用该值,而无需选择 2打开mysql调试并观看它运行一次。你可能会找到解决办法 3我根本看不到INSERT,因此INSERT后面的SELECT语句。。。这不是我可以解决的问题,因为它只发生在特定类型的插入上 最后,您需要了解为什么此SELECT和另一个SELECT之间存在差异,并且您已经将其与前面的INSERT语句关联起来了。但是您没有提供INSERT语句,也没有显示此select与该INSERT的关联方式与其他INSERT的区别
因此,您需要打开mysql调试,并在语句运行时获取每个语句,以查看是否可以在java/php代码之外复制问题。也许您只是遇到了一种情况,java代码在AJAX中经常无序执行,或者在select执行之前还没有从技术上完成插入。我去过那里 确保$db是数据库的实例。var_dump检查实例值。运行任何简单的select查询,如果您没有得到任何结果,则db实例中存在错误。或者,如果您在codeigniter中的模型/控制器中,那么我猜其中一个将使用全局db对象$this->db->->->query'params',我确信它是正确的db对象,因为我已经转储了它,我还将转储放在db驱动程序本身中,一切正常;如果我删除where条件并且条件正确,我会得到结果,如果我在PMA中执行相同的查询,我会得到行。您无法检查某些地方的错误,特别是对$db2->query的调用。如果不检查错误,你永远不会知道你什么时候有错误。connect和queryWhy使用两种不同的连接$db和$db2?我假设,当插入超过$db2时,$db中的信息没有更新。